Statistics
| Branch: | Revision:

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