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