7d72a5d7d9992e938e7f3c932a1af101a013121c
[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   /* configured through the readEgressFile function */
45   struct egress_if_bw bwPrevious;
46   struct egress_if_bw bwCurrent;
47   bool bwCostsChanged;
48   bool bwNetworkChanged;
49   bool bwGatewayChanged;
50   bool bwChanged; /* covers bwCostsChanged, bwNetworkChanged and bwGatewayChanged */
51
52   /* state for the readEgressFile function */
53   bool inEgressFile;
54
55   /* next in the list */
56   struct sgw_egress_if *next;
57 };
58
59 static inline bool egressBwCostsChanged(struct sgw_egress_if * egress_if) {
60   return (egress_if->bwPrevious.costs != egress_if->bwCurrent.costs);
61 }
62
63 static inline bool egressBwNetworkChanged(struct sgw_egress_if * egress_if) {
64   return //
65     (egress_if->bwPrevious.networkSet != egress_if->bwCurrent.networkSet) || //
66     (egress_if->bwCurrent.networkSet && //
67       memcmp(&egress_if->bwPrevious.network, &egress_if->bwCurrent.network, sizeof(egress_if->bwCurrent.network)));
68 }
69
70 static inline bool egressBwGatewayChanged(struct sgw_egress_if * egress_if) {
71   return //
72     (egress_if->bwPrevious.gatewaySet != egress_if->bwCurrent.gatewaySet) || //
73     (egress_if->bwCurrent.gatewaySet && //
74       memcmp(&egress_if->bwPrevious.gateway, &egress_if->bwCurrent.gateway, sizeof(egress_if->bwCurrent.gateway)));
75 }
76
77 static inline bool egressBwChanged(struct sgw_egress_if * egress_if) {
78   return egress_if->bwCostsChanged || egress_if->bwNetworkChanged || egress_if->bwGatewayChanged;
79 }
80
81 #endif /* __linux__ */
82
83 #endif /* EGRESSTYPES_H */