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