Cleanup
[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 uplink, downlink;
47   bool ipv4, ipv4nat, ipv6;
48 };
49
50 AVLNODE2STRUCT(node2gateway, struct gateway_entry, node);
51
52 #define OLSR_FOR_ALL_GATEWAY_ENTRIES(gw) \
53 { \
54   struct avl_node *gw_node, *next_gw_node; \
55   for (gw_node = avl_walk_first(&gateway_tree); \
56     gw_node; gw_node = next_gw_node) { \
57     next_gw_node = avl_walk_next(gw_node); \
58     gw = node2gateway(gw_node);
59 #define OLSR_FOR_ALL_GATEWAY_ENTRIES_END(gw) }}
60
61 extern struct avl_tree gateway_tree;
62
63 void olsr_init_gateways(void);
64 void olsr_trigger_inetgw_startup(void);
65 int olsr_trigger_inetgw_selection(bool ipv4, bool ipv6);
66
67 struct gateway_entry *olsr_find_gateway_entry(union olsr_ip_addr *originator);
68 void olsr_update_gateway_entry(union olsr_ip_addr *originator, union olsr_ip_addr *mask, int prefixlen);
69 void olsr_delete_gateway_entry(union olsr_ip_addr *originator, uint8_t prefixlen);
70 void olsr_print_gateway_entries(void);
71
72 int olsr_set_inet_gateway(union olsr_ip_addr *originator, bool ipv4, bool ipv6, bool external);
73 struct gateway_entry *olsr_get_inet_gateway(bool ipv6);
74 bool olsr_is_smart_gateway(struct olsr_ip_prefix *prefix, union olsr_ip_addr *net);
75 void olsr_modifiy_inetgw_netmask(union olsr_ip_addr *mask, int prefixlen);
76
77 struct olsr_gw_handler {
78   void (* handle_startup)(void);
79   void (* select_gateway) (bool ipv4, bool ipv6);
80   void (* handle_update_gw)(struct gateway_entry *);
81   void (* handle_delete_gw)(struct gateway_entry *);
82 };
83
84 void olsr_set_inetgw_handler(struct olsr_gw_handler *l);
85
86 #endif /* GATEWAY_H_ */