Annotation of embedaddon/bird/proto/bfd/config.Y, revision 1.1.1.1
1.1 misho 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
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>