iof-bird-daemon / proto / babel / config.Y @ 8b58f565
History | View | Annotate | Download (4.35 KB)
1 |
/* |
---|---|
2 |
* BIRD -- Babel Configuration |
3 |
* |
4 |
* Copyright (c) 2015-2016 Toke Hoiland-Jorgensen |
5 |
* |
6 |
* Can be freely distributed and used under the terms of the GNU GPL. |
7 |
*/ |
8 |
|
9 |
|
10 |
|
11 |
CF_HDR |
12 |
|
13 |
#include "proto/babel/babel.h" |
14 |
#include "nest/iface.h" |
15 |
|
16 |
CF_DEFINES |
17 |
|
18 |
#define BABEL_CFG ((struct babel_config *) this_proto) |
19 |
#define BABEL_IFACE ((struct babel_iface_config *) this_ipatt) |
20 |
|
21 |
CF_DECLS |
22 |
|
23 |
CF_KEYWORDS(BABEL, METRIC, RXCOST, HELLO, UPDATE, INTERVAL, PORT, WIRED, |
24 |
WIRELESS, RX, TX, BUFFER, LENGTH, CHECK, LINK, BABEL_METRIC, NEXT, HOP, |
25 |
IPV4, IPV6) |
26 |
|
27 |
CF_GRAMMAR |
28 |
|
29 |
CF_ADDTO(proto, babel_proto) |
30 |
|
31 |
babel_proto_start: proto_start BABEL |
32 |
{ |
33 |
this_proto = proto_config_new(&proto_babel, $1); |
34 |
init_list(&BABEL_CFG->iface_list); |
35 |
}; |
36 |
|
37 |
babel_proto_item: |
38 |
proto_item |
39 |
| proto_channel |
40 |
| INTERFACE babel_iface |
41 |
; |
42 |
|
43 |
babel_proto_opts: |
44 |
/* empty */ |
45 |
| babel_proto_opts babel_proto_item ';' |
46 |
; |
47 |
|
48 |
babel_proto: |
49 |
babel_proto_start proto_name '{' babel_proto_opts '}'; |
50 |
|
51 |
|
52 |
babel_iface_start: |
53 |
{ |
54 |
this_ipatt = cfg_allocz(sizeof(struct babel_iface_config)); |
55 |
add_tail(&BABEL_CFG->iface_list, NODE this_ipatt); |
56 |
init_list(&this_ipatt->ipn_list); |
57 |
BABEL_IFACE->port = BABEL_PORT; |
58 |
BABEL_IFACE->type = BABEL_IFACE_TYPE_WIRED; |
59 |
BABEL_IFACE->tx_tos = IP_PREC_INTERNET_CONTROL; |
60 |
BABEL_IFACE->tx_priority = sk_priority_control; |
61 |
BABEL_IFACE->check_link = 1; |
62 |
}; |
63 |
|
64 |
|
65 |
babel_iface_finish: |
66 |
{ |
67 |
if (BABEL_IFACE->type == BABEL_IFACE_TYPE_WIRELESS) |
68 |
{ |
69 |
if (!BABEL_IFACE->hello_interval) |
70 |
BABEL_IFACE->hello_interval = BABEL_HELLO_INTERVAL_WIRELESS; |
71 |
if (!BABEL_IFACE->rxcost) |
72 |
BABEL_IFACE->rxcost = BABEL_RXCOST_WIRELESS; |
73 |
} |
74 |
else |
75 |
{ |
76 |
if (!BABEL_IFACE->hello_interval) |
77 |
BABEL_IFACE->hello_interval = BABEL_HELLO_INTERVAL_WIRED; |
78 |
if (!BABEL_IFACE->rxcost) |
79 |
BABEL_IFACE->rxcost = BABEL_RXCOST_WIRED; |
80 |
} |
81 |
|
82 |
/* Make sure we do not overflow the 16-bit centisec fields */ |
83 |
if (!BABEL_IFACE->update_interval) |
84 |
BABEL_IFACE->update_interval = MIN_(BABEL_IFACE->hello_interval*BABEL_UPDATE_INTERVAL_FACTOR, BABEL_MAX_INTERVAL); |
85 |
BABEL_IFACE->ihu_interval = MIN_(BABEL_IFACE->hello_interval*BABEL_IHU_INTERVAL_FACTOR, BABEL_MAX_INTERVAL); |
86 |
}; |
87 |
|
88 |
|
89 |
babel_iface_item: |
90 |
| PORT expr { BABEL_IFACE->port = $2; if (($2<1) || ($2>65535)) cf_error("Invalid port number"); } |
91 |
| RXCOST expr { BABEL_IFACE->rxcost = $2; if (($2<1) || ($2>65535)) cf_error("Invalid rxcost"); } |
92 |
| TYPE WIRED { BABEL_IFACE->type = BABEL_IFACE_TYPE_WIRED; } |
93 |
| TYPE WIRELESS { BABEL_IFACE->type = BABEL_IFACE_TYPE_WIRELESS; } |
94 |
| HELLO INTERVAL expr_us { BABEL_IFACE->hello_interval = $3; if (($3<BABEL_MIN_INTERVAL) || ($3>BABEL_MAX_INTERVAL)) cf_error("Hello interval must be in range 10 ms - 655 s"); } |
95 |
| UPDATE INTERVAL expr_us { BABEL_IFACE->update_interval = $3; if (($3<BABEL_MIN_INTERVAL) || ($3>BABEL_MAX_INTERVAL)) cf_error("Update interval must be in range 10 ms - 655 s"); } |
96 |
| RX BUFFER expr { BABEL_IFACE->rx_buffer = $3; if (($3<256) || ($3>65535)) cf_error("RX buffer must be in range 256-65535"); } |
97 |
| TX LENGTH expr { BABEL_IFACE->tx_length = $3; if (($3<256) || ($3>65535)) cf_error("TX length must be in range 256-65535"); } |
98 |
| TX tos { BABEL_IFACE->tx_tos = $2; } |
99 |
| TX PRIORITY expr { BABEL_IFACE->tx_priority = $3; } |
100 |
| CHECK LINK bool { BABEL_IFACE->check_link = $3; } |
101 |
| NEXT HOP IPV4 ipa { BABEL_IFACE->next_hop_ip4 = $4; if (!ipa_is_ip4($4)) cf_error("Must be an IPv4 address"); } |
102 |
| NEXT HOP IPV6 ipa { BABEL_IFACE->next_hop_ip6 = $4; if (!ipa_is_ip6($4)) cf_error("Must be an IPv6 address"); } |
103 |
; |
104 |
|
105 |
babel_iface_opts: |
106 |
/* empty */ |
107 |
| babel_iface_opts babel_iface_item ';' |
108 |
; |
109 |
|
110 |
babel_iface_opt_list: |
111 |
/* empty */ |
112 |
| '{' babel_iface_opts '}' |
113 |
; |
114 |
|
115 |
|
116 |
babel_iface: |
117 |
babel_iface_start iface_patt_list_nopx babel_iface_opt_list babel_iface_finish; |
118 |
|
119 |
CF_ADDTO(dynamic_attr, BABEL_METRIC { $$ = f_new_dynamic_attr(EAF_TYPE_INT | EAF_TEMP, T_INT, EA_BABEL_METRIC); }) |
120 |
|
121 |
CF_CLI_HELP(SHOW BABEL, ..., [[Show information about Babel protocol]]); |
122 |
|
123 |
CF_CLI(SHOW BABEL INTERFACES, optsym opttext, [<name>] [\"<interface>\"], [[Show information about Babel interfaces]]) |
124 |
{ babel_show_interfaces(proto_get_named($4, &proto_babel), $5); }; |
125 |
|
126 |
CF_CLI(SHOW BABEL NEIGHBORS, optsym opttext, [<name>] [\"<interface>\"], [[Show information about Babel neighbors]]) |
127 |
{ babel_show_neighbors(proto_get_named($4, &proto_babel), $5); }; |
128 |
|
129 |
CF_CLI(SHOW BABEL ENTRIES, optsym opttext, [<name>], [[Show information about Babel prefix entries]]) |
130 |
{ babel_show_entries(proto_get_named($4, &proto_babel)); }; |
131 |
|
132 |
CF_CODE |
133 |
|
134 |
CF_END |