sgw: implement HNA expiry
[olsrd.git] / src / gateway.h
1 /*
2  * gateway.h
3  *
4  *  Created on: 05.01.2010
5  *      Author: henning
6  */
7
8 #ifndef GATEWAY_H_
9 #define GATEWAY_H_
10
11 #include "common/avl.h"
12 #include "common/list.h"
13 #include "defs.h"
14 #include "olsr.h"
15 #include "scheduler.h"
16 #include "gateway_list.h"
17 #include <net/if.h>
18
19 /** used to signal to olsr_delete_gateway_entry to force deletion */
20 #define FORCE_DELETE_GW_ENTRY 255
21
22 /** the interval (in milliseconds) on which to run gateway cleanup */
23 #define GW_CLEANUP_INTERVAL 30000
24
25 /**
26  * @return true if multi-gateway mode is enabled
27  */
28 static inline bool multi_gateway_mode(void) {
29   return (olsr_cnf->smart_gw_use_count > 1);
30 }
31
32 /*
33  * hack for Vienna network:
34  * set MAXIMUM_GATEWAY_PREFIX_LENGTH to 1 to remove 0.0.0.0/128.0.0.0 and
35  * 128.0.0.0/128.0.0.0 routes
36  */
37 // #define MAXIMUM_GATEWAY_PREFIX_LENGTH 1
38
39 /** gateway HNA flags */
40 enum gateway_hna_flags {
41   GW_HNA_FLAG_LINKSPEED   = 1 << 0,
42   GW_HNA_FLAG_IPV4        = 1 << 1,
43   GW_HNA_FLAG_IPV4_NAT    = 1 << 2,
44   GW_HNA_FLAG_IPV6        = 1 << 3,
45   GW_HNA_FLAG_IPV6PREFIX  = 1 << 4
46 };
47
48 /** gateway HNA field byte offsets in the netmask field of the HNA */
49 enum gateway_hna_fields {
50   GW_HNA_PAD              = 0,
51   GW_HNA_FLAGS            = 1,
52   GW_HNA_UPLINK           = 2,
53   GW_HNA_DOWNLINK         = 3,
54   GW_HNA_V6PREFIXLEN      = 4,
55   GW_HNA_V6PREFIX         = 5
56 };
57
58 /** a gateway entry */
59 struct gateway_entry {
60     struct avl_node node;
61     union olsr_ip_addr originator;
62     struct olsr_ip_prefix external_prefix;
63     uint32_t uplink;
64     uint32_t downlink;
65     int64_t path_cost; /**< the gateway path costs */
66     bool ipv4;
67     bool ipv4nat;
68     bool ipv6;
69
70     struct timer_entry *expire_timer;
71     struct timer_entry *cleanup_timer;
72     uint16_t seqno;
73 };
74
75 enum sgw_multi_change_phase {
76   GW_MULTI_CHANGE_PHASE_STARTUP = 0,
77   GW_MULTI_CHANGE_PHASE_RUNTIME = 1,
78   GW_MULTI_CHANGE_PHASE_SHUTDOWN = 2
79 };
80
81 #ifdef __linux__
82 /** structure that holds an interface name, mark and a pointer to the gateway that uses it */
83 struct interfaceName {
84   char name[IFNAMSIZ]; /**< interface name */
85   uint8_t tableNr; /**< routing table number */
86   uint8_t ruleNr; /**< IP rule number */
87   uint8_t bypassRuleNr; /**< bypass IP rule number */
88   struct gateway_entry *gw; /**< gateway that uses this interface name */
89 };
90 #endif /* __linux__ */
91
92 /**
93  * static inline struct gateway_entry * node2gateway (struct avl_node *ptr)
94  *
95  * Converts a node into a gateway entry
96  */
97 AVLNODE2STRUCT(node2gateway, struct gateway_entry, node);
98
99 /**
100  * Loop over all gateway entries and put the iterated gateway entry in gw
101  */
102 #define OLSR_FOR_ALL_GATEWAY_ENTRIES(gw) \
103 { \
104   struct avl_node *gw_node, *next_gw_node; \
105   for (gw_node = avl_walk_first(&gateway_tree); \
106     gw_node; gw_node = next_gw_node) { \
107     next_gw_node = avl_walk_next(gw_node); \
108     gw = node2gateway(gw_node);
109 #define OLSR_FOR_ALL_GATEWAY_ENTRIES_END(gw) }}
110
111 /** the gateway tree */
112 extern struct avl_tree gateway_tree;
113
114 /** the list IPv4 gateways */
115 extern struct gw_list gw_list_ipv4;
116
117 /** the list IPv6 gateways */
118 extern struct gw_list gw_list_ipv6;
119
120 /**
121  * Function pointer table for gateway plugin hooks.
122  */
123 struct olsr_gw_handler {
124     /**
125      * Called on olsrd startup to initialise the plugin.
126      */
127     void (*init)(void);
128
129     /**
130      * Called on olsrd shutdown to cleanup the plugin.
131      */
132     void (*cleanup)(void);
133
134     /**
135      * Called on olsrd startup to perform the initial gateway selection.
136      */
137     void (*startup)(void);
138
139     /**
140      * Called when the costs of a gateway must be determined.
141      *
142      * @param gw the gateway
143      * @return the costs
144      */
145     int64_t (*getcosts)(struct gateway_entry *gw);
146
147     /**
148      * Called when a new gateway must be chosen.
149      *
150      * @param ipv4 true when an IPv4 gateway must be chosen
151      * @param ipv6 true when an IPv6 gateway must be chosen
152      */
153     void (*choose)(bool ipv4, bool ipv6);
154
155     /**
156      * Called when a gateway HNA is received.
157      *
158      * @param gw the gateway entry
159      */
160     void (*update)(struct gateway_entry * gw);
161
162     /**
163      * Called when a TC or a HNA is removed.
164      *
165      * @param gw the gateway entry
166      */
167     void (* delete)(struct gateway_entry * gw);
168 };
169
170 /*
171  * Main Interface
172  */
173
174 int olsr_init_gateways(void);
175 int olsr_startup_gateways(void);
176 void olsr_shutdown_gateways(void);
177 void olsr_cleanup_gateways(void);
178 void olsr_trigger_inetgw_startup(void);
179 #ifndef NODEBUG
180 void olsr_print_gateway_entries(void);
181 #else
182 #define olsr_print_gateway_entries() do { } while(0)
183 #endif
184
185 /*
186  * Tx Path Interface
187  */
188
189 void olsr_modifiy_inetgw_netmask(union olsr_ip_addr *mask, int prefixlen, bool zero);
190
191 /*
192  * Interface to adjust uplink/downlink speed
193  */
194
195 void refresh_smartgw_netmask(void);
196
197 /*
198  * TC/SPF/HNA Interface
199  */
200
201 bool olsr_is_smart_gateway(struct olsr_ip_prefix *prefix, union olsr_ip_addr *net);
202 void olsr_update_gateway_entry(union olsr_ip_addr *originator, union olsr_ip_addr *mask, int prefixlen, uint16_t seqno, olsr_reltime vtime);
203 void olsr_delete_gateway_entry(union olsr_ip_addr *originator, uint8_t prefixlen, bool immediate);
204 void olsr_trigger_gatewayloss_check(void);
205
206 /*
207  * Gateway Plugin Functions
208  */
209
210 bool olsr_set_inet_gateway(struct gateway_entry * chosen_gw, bool ipv4, bool ipv6);
211 struct gateway_entry *olsr_get_inet_gateway(bool ipv6);
212
213 /*
214  * Multi Smart Gateway functions
215  */
216
217 void doRoutesMultiGw(bool egressChanged, bool olsrChanged, enum sgw_multi_change_phase phase);
218
219 #endif /* GATEWAY_H_ */