sgw: track the up status of an egress interface
[olsrd.git] / src / egressTypes.h
1 #ifndef EGRESSTYPES_H
2 #define EGRESSTYPES_H
3
4 #ifdef __linux__
5
6 /* Plugin includes */
7
8 /* OLSRD includes */
9 #include "olsr_types.h"
10
11 /* System includes */
12 #include <stdint.h>
13 #include <stdbool.h>
14 #include <string.h>
15
16 struct egress_if_bw {
17   /* in the egress file */
18   uint32_t egressUk; /**< in Kbps, [0, MAX_SMARTGW_SPEED] */
19   uint32_t egressDk; /**< in Kbps, [0, MAX_SMARTGW_SPEED] */
20   uint32_t path_cost; /**<         [0, UINT32_MAX]        */
21   struct olsr_ip_prefix network;
22   union olsr_ip_addr gateway;
23
24   /* derived from network, gateway */
25   bool networkSet;
26   bool gatewaySet;
27
28   /* calculated from egressUk, egressDk, path_costs */
29   int64_t costs;
30 };
31
32 struct sgw_egress_if {
33   /* configured through the SmartGatewayEgressInterfaces configuration parameter */
34   char *name;
35
36   /* updated through the smartgw_tunnel_monitor function */
37   int if_index;
38
39   /* configured through the SmartGatewayTablesOffset and SmartGatewayRulesOffset configuration parameters */
40   uint8_t tableNr; /**< routing table number */
41   uint8_t ruleNr; /**< IP rule number */
42   uint8_t bypassRuleNr; /**< bypass IP rule number */
43
44   /* updated through smartgw_tunnel_monitor */
45   bool upPrevious;
46   bool upCurrent;
47   bool upChanged;
48
49   /* configured through the readEgressFile function */
50   struct egress_if_bw bwPrevious;
51   struct egress_if_bw bwCurrent;
52   bool bwCostsChanged;
53   bool bwNetworkChanged;
54   bool bwGatewayChanged;
55   bool bwChanged; /* covers bwCostsChanged, bwNetworkChanged and bwGatewayChanged */
56
57   /* state for the readEgressFile function */
58   bool inEgressFile;
59
60   /* next in the list */
61   struct sgw_egress_if *next;
62 };
63
64 static inline bool egressBwCostsChanged(struct sgw_egress_if * egress_if) {
65   return (egress_if->bwPrevious.costs != egress_if->bwCurrent.costs);
66 }
67
68 static inline bool egressBwNetworkChanged(struct sgw_egress_if * egress_if) {
69   return //
70     (egress_if->bwPrevious.networkSet != egress_if->bwCurrent.networkSet) || //
71     (egress_if->bwCurrent.networkSet && //
72       memcmp(&egress_if->bwPrevious.network, &egress_if->bwCurrent.network, sizeof(egress_if->bwCurrent.network)));
73 }
74
75 static inline bool egressBwGatewayChanged(struct sgw_egress_if * egress_if) {
76   return //
77     (egress_if->bwPrevious.gatewaySet != egress_if->bwCurrent.gatewaySet) || //
78     (egress_if->bwCurrent.gatewaySet && //
79       memcmp(&egress_if->bwPrevious.gateway, &egress_if->bwCurrent.gateway, sizeof(egress_if->bwCurrent.gateway)));
80 }
81
82 static inline bool egressBwChanged(struct sgw_egress_if * egress_if) {
83   return egress_if->bwCostsChanged || egress_if->bwNetworkChanged || egress_if->bwGatewayChanged;
84 }
85
86 #endif /* __linux__ */
87
88 #endif /* EGRESSTYPES_H */