Statistics
| Branch: | Revision:

iof-bird / bird-2.0.1 / proto / bfd / config.Y @ 6b3f1a54

History | View | Annotate | Download (4.12 KB)

1
/*
2
 *	BIRD -- Router Advertisement Configuration
3
 *
4
 *
5
 *	Can be freely distributed and used under the terms of the GNU GPL.
6
 */
7

    
8
CF_HDR
9

    
10
#include "proto/bfd/bfd.h"
11

    
12
CF_DEFINES
13

    
14
#define BFD_CFG ((struct bfd_config *) this_proto)
15
#define BFD_IFACE ((struct bfd_iface_config *) this_ipatt)
16
#define BFD_NEIGHBOR this_bfd_neighbor
17

    
18
static struct bfd_neighbor *this_bfd_neighbor;
19

    
20
extern struct bfd_config *bfd_cf;
21

    
22
CF_DECLS
23

    
24
CF_KEYWORDS(BFD, MIN, IDLE, RX, TX, INTERVAL, MULTIPLIER, PASSIVE,
25
	INTERFACE, MULTIHOP, NEIGHBOR, DEV, LOCAL, AUTHENTICATION,
26
	NONE, SIMPLE, METICULOUS, KEYED, MD5, SHA1)
27

    
28
%type <iface> bfd_neigh_iface
29
%type <a> bfd_neigh_local
30
%type <i> bfd_neigh_multihop bfd_auth_type
31

    
32
CF_GRAMMAR
33

    
34
CF_ADDTO(proto, bfd_proto)
35

    
36
bfd_proto_start: proto_start BFD
37
{
38
  this_proto = proto_config_new(&proto_bfd, $1);
39
  init_list(&BFD_CFG->patt_list);
40
  init_list(&BFD_CFG->neigh_list);
41

    
42
  if (bfd_cf)
43
    cf_error("Only one BFD instance allowed");
44
  bfd_cf = BFD_CFG;
45
};
46

    
47
bfd_proto_item:
48
   proto_item
49
 | INTERFACE bfd_iface
50
 | MULTIHOP bfd_multihop
51
 | NEIGHBOR bfd_neighbor
52
 ;
53

    
54
bfd_proto_opts:
55
   /* empty */
56
 | bfd_proto_opts bfd_proto_item ';'
57
 ;
58

    
59
bfd_proto:
60
   bfd_proto_start proto_name '{' bfd_proto_opts '}';
61

    
62

    
63
bfd_iface_start:
64
{
65
  this_ipatt = cfg_allocz(sizeof(struct bfd_iface_config));
66
  add_tail(&BFD_CFG->patt_list, NODE this_ipatt);
67
  init_list(&this_ipatt->ipn_list);
68

    
69
  BFD_IFACE->min_rx_int = BFD_DEFAULT_MIN_RX_INT;
70
  BFD_IFACE->min_tx_int = BFD_DEFAULT_MIN_TX_INT;
71
  BFD_IFACE->idle_tx_int = BFD_DEFAULT_IDLE_TX_INT;
72
  BFD_IFACE->multiplier = BFD_DEFAULT_MULTIPLIER;
73

    
74
  reset_passwords();
75
};
76

    
77
bfd_iface_finish:
78
{
79
  BFD_IFACE->passwords = get_passwords();
80

    
81
  if (!BFD_IFACE->auth_type != !BFD_IFACE->passwords)
82
    log(L_WARN "Authentication and password options should be used together");
83

    
84
  if (BFD_IFACE->passwords)
85
  {
86
    struct password_item *pass;
87
    WALK_LIST(pass, *BFD_IFACE->passwords)
88
    {
89
      if (pass->alg)
90
        cf_error("Password algorithm option not available in BFD protocol");
91

    
92
      pass->alg = bfd_auth_type_to_hash_alg[BFD_IFACE->auth_type];
93
    }
94
  }
95
};
96

    
97
bfd_iface_item:
98
   INTERVAL expr_us { BFD_IFACE->min_rx_int = BFD_IFACE->min_tx_int = $2; }
99
 | MIN RX INTERVAL expr_us { BFD_IFACE->min_rx_int = $4; }
100
 | MIN TX INTERVAL expr_us { BFD_IFACE->min_tx_int = $4; }
101
 | IDLE TX INTERVAL expr_us { BFD_IFACE->idle_tx_int = $4; }
102
 | MULTIPLIER expr { BFD_IFACE->multiplier = $2; }
103
 | PASSIVE bool { BFD_IFACE->passive = $2; }
104
 | AUTHENTICATION bfd_auth_type { BFD_IFACE->auth_type = $2; }
105
 | password_list {}
106
 ;
107

    
108
bfd_auth_type:
109
   NONE			 { $$ = BFD_AUTH_NONE; }
110
 | SIMPLE 		 { $$ = BFD_AUTH_SIMPLE; }
111
 | KEYED MD5		 { $$ = BFD_AUTH_KEYED_MD5; }
112
 | KEYED SHA1   	 { $$ = BFD_AUTH_KEYED_SHA1; }
113
 | METICULOUS KEYED MD5	 { $$ = BFD_AUTH_METICULOUS_KEYED_MD5; }
114
 | METICULOUS KEYED SHA1 { $$ = BFD_AUTH_METICULOUS_KEYED_SHA1; }
115
 ;
116

    
117
bfd_iface_opts:
118
   /* empty */
119
 | bfd_iface_opts bfd_iface_item ';'
120
 ;
121

    
122
bfd_iface_opt_list:
123
   /* empty */
124
 | '{' bfd_iface_opts '}'
125
 ;
126

    
127
bfd_iface:
128
  bfd_iface_start iface_patt_list_nopx bfd_iface_opt_list bfd_iface_finish;
129

    
130
bfd_multihop:
131
  bfd_iface_start bfd_iface_opt_list bfd_iface_finish
132
{ BFD_CFG->multihop = BFD_IFACE; };
133

    
134

    
135
bfd_neigh_iface:
136
   /* empty */ { $$ = NULL; }
137
 | '%' SYM { $$ = if_get_by_name($2->name); }
138
 | DEV text { $$ = if_get_by_name($2); }
139
 ;
140

    
141
bfd_neigh_local:
142
   /* empty */ { $$ = IPA_NONE; }
143
 | LOCAL ipa { $$ = $2; }
144
 ;
145

    
146
bfd_neigh_multihop:
147
   /* empty */ { $$ = 0; }
148
 | MULTIHOP bool { $$ = $2; }
149
 ;
150

    
151
bfd_neighbor: ipa bfd_neigh_iface bfd_neigh_local bfd_neigh_multihop
152
{
153
  this_bfd_neighbor = cfg_allocz(sizeof(struct bfd_neighbor));
154
  add_tail(&BFD_CFG->neigh_list, NODE this_bfd_neighbor);
155

    
156
  BFD_NEIGHBOR->addr = $1;
157
  BFD_NEIGHBOR->local = $3;
158
  BFD_NEIGHBOR->iface = $2;
159
  BFD_NEIGHBOR->multihop = $4;
160

    
161
  if ($4 && $2)
162
    cf_error("Neighbor cannot set both interface and multihop");
163

    
164
  if ($4 && ipa_zero($3))
165
    cf_error("Multihop neighbor requires specified local address");
166
};
167

    
168

    
169
CF_CLI_HELP(SHOW BFD, ..., [[Show information about BFD protocol]]);
170
CF_CLI(SHOW BFD SESSIONS, optsym, [<name>], [[Show information about BFD sessions]])
171
{ bfd_show_sessions(proto_get_named($4, &proto_bfd)); };
172

    
173
CF_CODE
174

    
175
CF_END