9f554f16a31db0d84576e8801dbcae4ddc04a46b
[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 #define FORCE_DELETE_GW_ENTRY 255
18 #define GW_CLEANUP_INTERVAL 30000
19
20 /*
21  * hack for Vienna network to remove 0.0.0.0/128.0.0.0 and 128.0.0.0/128.0.0.0 routes
22  * just set MAXIMUM_GATEWAY_PREFIX_LENGTH to 1
23  */
24 // #define MAXIMUM_GATEWAY_PREFIX_LENGTH 1
25
26 enum gateway_hna_flags {
27   GW_HNA_FLAG_LINKSPEED  = 1<<0,
28   GW_HNA_FLAG_IPV4       = 1<<1,
29   GW_HNA_FLAG_IPV4_NAT   = 1<<2,
30   GW_HNA_FLAG_IPV6       = 1<<3,
31   GW_HNA_FLAG_IPV6PREFIX = 1<<4
32 };
33
34 /* relative to the first zero byte in the netmask (0, 1 or 12) */
35 enum gateway_hna_fields {
36   GW_HNA_PAD         = 0,
37   GW_HNA_FLAGS       = 1,
38   GW_HNA_UPLINK      = 2,
39   GW_HNA_DOWNLINK    = 3,
40   GW_HNA_V6PREFIXLEN = 4,
41   GW_HNA_V6PREFIX    = 5
42 };
43
44 struct gateway_entry {
45   struct avl_node node;
46   union olsr_ip_addr originator;
47   struct olsr_ip_prefix external_prefix;
48   uint32_t uplink, downlink;
49   bool ipv4, ipv4nat, ipv6;
50
51   struct timer_entry *cleanup_timer;
52   uint16_t seqno;
53 };
54
55 AVLNODE2STRUCT(node2gateway, struct gateway_entry, node);
56
57 #define OLSR_FOR_ALL_GATEWAY_ENTRIES(gw) \
58 { \
59   struct avl_node *gw_node, *next_gw_node; \
60   for (gw_node = avl_walk_first(&gateway_tree); \
61     gw_node; gw_node = next_gw_node) { \
62     next_gw_node = avl_walk_next(gw_node); \
63     gw = node2gateway(gw_node);
64 #define OLSR_FOR_ALL_GATEWAY_ENTRIES_END(gw) }}
65
66 extern struct avl_tree gateway_tree;
67
68 int olsr_init_gateways(void);
69 void olsr_cleanup_gateways(void);
70 void olsr_trigger_inetgw_startup(void);
71 int olsr_trigger_inetgw_selection(bool ipv4, bool ipv6);
72 void olsr_trigger_gatewayloss_check(void);
73
74 struct gateway_entry *olsr_find_gateway_entry(union olsr_ip_addr *originator);
75 void olsr_update_gateway_entry(union olsr_ip_addr *originator, union olsr_ip_addr *mask, int prefixlen, uint16_t seqno);
76 void olsr_delete_gateway_entry(union olsr_ip_addr *originator, uint8_t prefixlen);
77 void olsr_print_gateway_entries(void);
78
79 bool olsr_set_inet_gateway(union olsr_ip_addr *originator, bool ipv4, bool ipv6, bool external);
80 struct gateway_entry *olsr_get_ipv4_inet_gateway(bool *);
81 struct gateway_entry *olsr_get_ipv6_inet_gateway(bool *);
82 bool olsr_is_smart_gateway(struct olsr_ip_prefix *prefix, union olsr_ip_addr *net);
83 void olsr_modifiy_inetgw_netmask(union olsr_ip_addr *mask, int prefixlen);
84
85 struct olsr_gw_handler {
86   void (* handle_startup)(void);
87   void (* select_gateway) (bool ipv4, bool ipv6);
88   void (* handle_update_gw)(struct gateway_entry *);
89   void (* handle_delete_gw)(struct gateway_entry *);
90 };
91
92 void olsr_set_inetgw_handler(struct olsr_gw_handler *l);
93 #endif /* GATEWAY_H_ */