Annotation of embedaddon/bird/proto/radv/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/radv/radv.h"
11:
12: CF_DEFINES
13:
14: #define RADV_CFG ((struct radv_config *) this_proto)
15: #define RADV_IFACE ((struct radv_iface_config *) this_ipatt)
16: #define RADV_PREFIX this_radv_prefix
17: #define RADV_RDNSS (&this_radv_rdnss)
18: #define RADV_DNSSL (&this_radv_dnssl)
19:
20: static struct radv_prefix_config *this_radv_prefix;
21: static struct radv_rdnss_config this_radv_rdnss;
22: static struct radv_dnssl_config this_radv_dnssl;
23: static list radv_dns_list; /* Used by radv_rdnss and radv_dnssl */
24: static u8 radv_mult_val; /* Used by radv_mult for second return value */
25:
26:
27: CF_DECLS
28:
29: CF_KEYWORDS(RADV, PREFIX, INTERFACE, MIN, MAX, RA, DELAY, INTERVAL,
30: MANAGED, OTHER, CONFIG, LINK, MTU, REACHABLE, TIME, RETRANS,
31: TIMER, CURRENT, HOP, LIMIT, DEFAULT, VALID, PREFERRED, MULT,
32: LIFETIME, SKIP, ONLINK, AUTONOMOUS, RDNSS, DNSSL, NS, DOMAIN,
33: LOCAL, TRIGGER, SENSITIVE, PREFERENCE, LOW, MEDIUM, HIGH)
34:
35: %type<i> radv_mult radv_sensitive radv_preference
36:
37: CF_GRAMMAR
38:
39: CF_ADDTO(proto, radv_proto)
40:
41: radv_proto_start: proto_start RADV
42: {
43: this_proto = proto_config_new(&proto_radv, $1);
44: init_list(&RADV_CFG->patt_list);
45: init_list(&RADV_CFG->pref_list);
46: init_list(&RADV_CFG->rdnss_list);
47: init_list(&RADV_CFG->dnssl_list);
48: };
49:
50: radv_proto_item:
51: proto_item
52: | INTERFACE radv_iface
53: | PREFIX radv_prefix { add_tail(&RADV_CFG->pref_list, NODE this_radv_prefix); }
54: | RDNSS { init_list(&radv_dns_list); } radv_rdnss { add_tail_list(&RADV_CFG->rdnss_list, &radv_dns_list); }
55: | DNSSL { init_list(&radv_dns_list); } radv_dnssl { add_tail_list(&RADV_CFG->dnssl_list, &radv_dns_list); }
56: | TRIGGER prefix {
57: RADV_CFG->trigger_prefix = $2.addr;
58: RADV_CFG->trigger_pxlen = $2.len;
59: RADV_CFG->trigger_valid = 1;
60: }
61: ;
62:
63: radv_proto_opts:
64: /* empty */
65: | radv_proto_opts radv_proto_item ';'
66: ;
67:
68: radv_proto:
69: radv_proto_start proto_name '{' radv_proto_opts '}';
70:
71:
72: radv_iface_start:
73: {
74: this_ipatt = cfg_allocz(sizeof(struct radv_iface_config));
75: add_tail(&RADV_CFG->patt_list, NODE this_ipatt);
76: init_list(&this_ipatt->ipn_list);
77: init_list(&RADV_IFACE->pref_list);
78: init_list(&RADV_IFACE->rdnss_list);
79: init_list(&RADV_IFACE->dnssl_list);
80:
81: RADV_IFACE->min_ra_int = -1; /* undefined */
82: RADV_IFACE->max_ra_int = DEFAULT_MAX_RA_INT;
83: RADV_IFACE->min_delay = DEFAULT_MIN_DELAY;
84: RADV_IFACE->current_hop_limit = DEFAULT_CURRENT_HOP_LIMIT;
85: RADV_IFACE->default_lifetime = -1;
86: RADV_IFACE->default_lifetime_sensitive = 1;
87: RADV_IFACE->default_preference = RA_PREF_MEDIUM;
88: };
89:
90: radv_iface_item:
91: MIN RA INTERVAL expr { RADV_IFACE->min_ra_int = $4; if ($4 < 3) cf_error("Min RA interval must be at least 3"); }
92: | MAX RA INTERVAL expr { RADV_IFACE->max_ra_int = $4; if (($4 < 4) || ($4 > 1800)) cf_error("Max RA interval must be in range 4-1800"); }
93: | MIN DELAY expr { RADV_IFACE->min_delay = $3; if ($3 <= 0) cf_error("Min delay must be positive"); }
94: | MANAGED bool { RADV_IFACE->managed = $2; }
95: | OTHER CONFIG bool { RADV_IFACE->other_config = $3; }
96: | LINK MTU expr { RADV_IFACE->link_mtu = $3; if ($3 < 0) cf_error("Link MTU must be 0 or positive"); }
97: | REACHABLE TIME expr { RADV_IFACE->reachable_time = $3; if (($3 < 0) || ($3 > 3600000)) cf_error("Reachable time must be in range 0-3600000"); }
98: | RETRANS TIMER expr { RADV_IFACE->retrans_timer = $3; if ($3 < 0) cf_error("Retrans timer must be 0 or positive"); }
99: | CURRENT HOP LIMIT expr { RADV_IFACE->current_hop_limit = $4; if (($4 < 0) || ($4 > 255)) cf_error("Current hop limit must be in range 0-255"); }
100: | DEFAULT LIFETIME expr radv_sensitive {
101: RADV_IFACE->default_lifetime = $3;
102: if (($3 < 0) || ($3 > 9000)) cf_error("Default lifetime must be in range 0-9000");
103: if ($4 != -1) RADV_IFACE->default_lifetime_sensitive = $4;
104: }
105: | DEFAULT PREFERENCE radv_preference { RADV_IFACE->default_preference = $3; }
106: | PREFIX radv_prefix { add_tail(&RADV_IFACE->pref_list, NODE this_radv_prefix); }
107: | RDNSS { init_list(&radv_dns_list); } radv_rdnss { add_tail_list(&RADV_IFACE->rdnss_list, &radv_dns_list); }
108: | DNSSL { init_list(&radv_dns_list); } radv_dnssl { add_tail_list(&RADV_IFACE->dnssl_list, &radv_dns_list); }
109: | RDNSS LOCAL bool { RADV_IFACE->rdnss_local = $3; }
110: | DNSSL LOCAL bool { RADV_IFACE->dnssl_local = $3; }
111: ;
112:
113: radv_preference:
114: LOW { $$ = RA_PREF_LOW; }
115: | MEDIUM { $$ = RA_PREF_MEDIUM; }
116: | HIGH { $$ = RA_PREF_HIGH; }
117:
118: radv_iface_finish:
119: {
120: struct radv_iface_config *ic = RADV_IFACE;
121:
122: if (ic->min_ra_int == (u32) -1)
123: ic->min_ra_int = MAX_(ic->max_ra_int / 3, 3);
124:
125: if (ic->default_lifetime == (u32) -1)
126: ic->default_lifetime = 3 * ic->max_ra_int;
127:
128: if ((ic->min_ra_int > 3) &&
129: (ic->min_ra_int > (ic->max_ra_int * 3 / 4)))
130: cf_error("Min RA interval must be at most 3/4 * Max RA interval %d %d", ic->min_ra_int, ic->max_ra_int);
131:
132: if ((ic->default_lifetime > 0) && (ic->default_lifetime < ic->max_ra_int))
133: cf_error("Default lifetime must be either 0 or at least Max RA interval");
134: };
135:
136:
137: radv_iface_opts:
138: /* empty */
139: | radv_iface_opts radv_iface_item ';'
140: ;
141:
142: radv_iface_opt_list:
143: /* empty */
144: | '{' radv_iface_opts '}'
145: ;
146:
147: radv_iface:
148: radv_iface_start iface_patt_list_nopx radv_iface_opt_list radv_iface_finish;
149:
150:
151: radv_prefix_start: prefix
152: {
153: this_radv_prefix = cfg_allocz(sizeof(struct radv_prefix_config));
154: RADV_PREFIX->prefix = $1.addr;
155: RADV_PREFIX->pxlen = $1.len;
156:
157: RADV_PREFIX->onlink = 1;
158: RADV_PREFIX->autonomous = 1;
159: RADV_PREFIX->valid_lifetime = DEFAULT_VALID_LIFETIME;
160: RADV_PREFIX->preferred_lifetime = DEFAULT_PREFERRED_LIFETIME;
161: };
162:
163: radv_prefix_item:
164: SKIP bool { RADV_PREFIX->skip = $2; }
165: | ONLINK bool { RADV_PREFIX->onlink = $2; }
166: | AUTONOMOUS bool { RADV_PREFIX->autonomous = $2; }
167: | VALID LIFETIME expr radv_sensitive {
168: RADV_PREFIX->valid_lifetime = $3;
169: if ($3 < 0) cf_error("Valid lifetime must be 0 or positive");
170: if ($4 != -1) RADV_PREFIX->valid_lifetime_sensitive = $4;
171: }
172: | PREFERRED LIFETIME expr radv_sensitive {
173: RADV_PREFIX->preferred_lifetime = $3;
174: if ($3 < 0) cf_error("Preferred lifetime must be 0 or positive");
175: if ($4 != -1) RADV_PREFIX->preferred_lifetime_sensitive = $4;
176: }
177: ;
178:
179: radv_prefix_finish:
180: {
181: if (RADV_PREFIX->preferred_lifetime > RADV_PREFIX->valid_lifetime)
182: cf_error("Preferred lifetime must be at most Valid lifetime");
183:
184: if (RADV_PREFIX->valid_lifetime_sensitive > RADV_PREFIX->preferred_lifetime_sensitive)
185: cf_error("Valid lifetime sensitive requires that Preferred lifetime is sensitive too");
186: };
187:
188: radv_prefix_opts:
189: /* empty */
190: | radv_prefix_opts radv_prefix_item ';'
191: ;
192:
193: radv_prefix_opt_list:
194: /* empty */
195: | '{' radv_prefix_opts '}'
196: ;
197:
198: radv_prefix:
199: radv_prefix_start radv_prefix_opt_list radv_prefix_finish;
200:
201:
202:
203: radv_rdnss_node: ipa
204: {
205: struct radv_rdnss_config *cf = cfg_allocz(sizeof(struct radv_rdnss_config));
206: add_tail(&radv_dns_list, NODE cf);
207:
208: cf->server = $1;
209: cf->lifetime_mult = DEFAULT_DNS_LIFETIME_MULT;
210: };
211:
212: radv_rdnss_start:
213: {
214: RADV_RDNSS->lifetime = 0;
215: RADV_RDNSS->lifetime_mult = DEFAULT_DNS_LIFETIME_MULT;
216: };
217:
218: radv_rdnss_item:
219: | NS radv_rdnss_node
220: | LIFETIME radv_mult { RADV_RDNSS->lifetime = $2; RADV_RDNSS->lifetime_mult = radv_mult_val; }
221: ;
222:
223: radv_rdnss_finish:
224: {
225: if (EMPTY_LIST(radv_dns_list))
226: cf_error("No nameserver in RDNSS section");
227:
228: struct radv_rdnss_config *cf;
229: WALK_LIST(cf, radv_dns_list)
230: {
231: cf->lifetime = RADV_RDNSS->lifetime;
232: cf->lifetime_mult = RADV_RDNSS->lifetime_mult;
233: }
234: };
235:
236: radv_rdnss_opts:
237: /* empty */
238: | radv_rdnss_opts radv_rdnss_item ';'
239: ;
240:
241: radv_rdnss:
242: radv_rdnss_node
243: | '{' radv_rdnss_start radv_rdnss_opts '}' radv_rdnss_finish
244: ;
245:
246:
247: radv_dnssl_node: TEXT
248: {
249: struct radv_dnssl_config *cf = cfg_allocz(sizeof(struct radv_dnssl_config));
250: add_tail(&radv_dns_list, NODE cf);
251:
252: cf->domain = $1;
253: cf->lifetime_mult = DEFAULT_DNS_LIFETIME_MULT;
254:
255: if (radv_process_domain(cf) < 0)
256: cf_error("Invalid domain dame");
257: };
258:
259: radv_dnssl_start:
260: {
261: RADV_DNSSL->lifetime = 0;
262: RADV_DNSSL->lifetime_mult = DEFAULT_DNS_LIFETIME_MULT;
263: };
264:
265: radv_dnssl_item:
266: | DOMAIN radv_dnssl_node
267: | LIFETIME radv_mult { RADV_DNSSL->lifetime = $2; RADV_DNSSL->lifetime_mult = radv_mult_val; }
268: ;
269:
270: radv_dnssl_finish:
271: {
272: if (EMPTY_LIST(radv_dns_list))
273: cf_error("No domain in DNSSL section");
274:
275: struct radv_dnssl_config *cf;
276: WALK_LIST(cf, radv_dns_list)
277: {
278: cf->lifetime = RADV_DNSSL->lifetime;
279: cf->lifetime_mult = RADV_DNSSL->lifetime_mult;
280: }
281: };
282:
283: radv_dnssl_opts:
284: /* empty */
285: | radv_dnssl_opts radv_dnssl_item ';'
286: ;
287:
288: radv_dnssl:
289: radv_dnssl_node
290: | '{' radv_dnssl_start radv_dnssl_opts '}' radv_dnssl_finish
291: ;
292:
293:
294: radv_mult:
295: expr { $$ = $1; radv_mult_val = 0; }
296: | MULT expr { $$ = 0; radv_mult_val = $2; if (($2 < 1) || ($2 > 254)) cf_error("Multiplier must be in range 1-254"); }
297: ;
298:
299: radv_sensitive:
300: /* empty */ { $$ = -1; }
301: | SENSITIVE bool { $$ = $2; }
302: ;
303:
304: CF_CODE
305:
306: CF_END
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>