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