2 * BIRD -- Core Configuration
4 * (c) 1998--2000 Martin Mares <mj@ucw.cz>
5 * (c) 2004 Ondrej Filip <feela@network.cz>
7 * Can be freely distributed and used under the terms of the GNU GPL.
12 #include "nest/rt-dev.h"
13 #include "nest/password.h"
14 #include "nest/cmds.h"
15 #include "lib/lists.h"
20 static struct proto_config *this_proto;
21 static struct iface_patt *this_ipatt;
22 static struct iface_patt_node *this_ipn;
23 static struct roa_table_config *this_roa_table;
24 static list *this_p_list;
25 static struct password_item *this_p_item;
26 static int password_id;
29 iface_patt_check(void)
31 struct iface_patt_node *pn;
33 WALK_LIST(pn, this_ipatt->ipn_list)
34 if (!pn->pattern || pn->pxlen)
35 cf_error("Interface name/mask expected, not IP prefix");
48 list *rv = this_p_list;
53 #define DIRECT_CFG ((struct rt_dev_config *) this_proto)
57 CF_KEYWORDS(ROUTER, ID, PROTOCOL, TEMPLATE, PREFERENCE, DISABLED, DEBUG, ALL, OFF, DIRECT)
58 CF_KEYWORDS(INTERFACE, IMPORT, EXPORT, FILTER, NONE, VRF, TABLE, STATES, ROUTES, FILTERS)
59 CF_KEYWORDS(RECEIVE, LIMIT, ACTION, WARN, BLOCK, RESTART, DISABLE, KEEP, FILTERED)
60 CF_KEYWORDS(PASSWORD, FROM, PASSIVE, TO, ID, EVENTS, PACKETS, PROTOCOLS, INTERFACES)
61 CF_KEYWORDS(ALGORITHM, KEYED, HMAC, MD5, SHA1, SHA256, SHA384, SHA512)
62 CF_KEYWORDS(PRIMARY, STATS, COUNT, FOR, COMMANDS, PREEXPORT, NOEXPORT, GENERATE, ROA)
63 CF_KEYWORDS(LISTEN, BGP, V6ONLY, DUAL, ADDRESS, PORT, PASSWORDS, DESCRIPTION, SORTED)
64 CF_KEYWORDS(RELOAD, IN, OUT, MRTDUMP, MESSAGES, RESTRICT, MEMORY, IGP_METRIC, CLASS, DSCP)
65 CF_KEYWORDS(GRACEFUL, RESTART, WAIT, MAX, FLUSH, AS)
67 CF_ENUM(T_ENUM_RTS, RTS_, DUMMY, STATIC, INHERIT, DEVICE, STATIC_DEVICE, REDIRECT,
68 RIP, OSPF, OSPF_IA, OSPF_EXT1, OSPF_EXT2, BGP, PIPE, BABEL)
69 CF_ENUM(T_ENUM_SCOPE, SCOPE_, HOST, LINK, SITE, ORGANIZATION, UNIVERSE, UNDEFINED)
70 CF_ENUM(T_ENUM_RTC, RTC_, UNICAST, BROADCAST, MULTICAST, ANYCAST)
71 CF_ENUM(T_ENUM_RTD, RTD_, ROUTER, DEVICE, BLACKHOLE, UNREACHABLE, PROHIBIT, MULTIPATH)
72 CF_ENUM(T_ENUM_ROA, ROA_, UNKNOWN, VALID, INVALID)
80 %type <rot> roa_table_arg
82 %type <i> proto_start echo_mask echo_size debug_mask debug_list debug_flag mrtdump_mask mrtdump_list mrtdump_flag export_mode roa_mode limit_action tab_sorted tos password_algorithm
83 %type <ps> proto_patt proto_patt2
88 /* Setting of router ID */
93 ROUTER ID idval ';' { new_config->router_id = $3; }
94 | ROUTER ID FROM iface_patt ';' { new_config->router_id_from = this_ipatt; }
99 | '(' term ')' { $$ = f_eval_int($2); }
105 cf_error("Router IDs must be entered as hexadecimal numbers or IPv4 addresses in IPv6 version");
109 if ($1->class == (SYM_CONSTANT | T_INT) || $1->class == (SYM_CONSTANT | T_QUAD))
112 else if ($1->class == (SYM_CONSTANT | T_IP))
113 $$ = ipa_to_u32(SYM_VAL($1).px.ip);
116 cf_error("Number or IPv4 address constant expected");
121 CF_ADDTO(conf, listen)
123 listen: LISTEN BGP listen_opts ';' ;
127 | listen_opts listen_opt
131 ADDRESS ipa { new_config->listen_bgp_addr = $2; }
132 | PORT expr { new_config->listen_bgp_port = $2; }
133 | V6ONLY { new_config->listen_bgp_flags = 0; }
134 | DUAL { new_config->listen_bgp_flags = 1; }
138 CF_ADDTO(conf, gr_opts)
140 gr_opts: GRACEFUL RESTART WAIT expr ';' { new_config->gr_wait = $4; } ;
143 /* Creation of routing tables */
150 CF_ADDTO(conf, newtab)
152 newtab: TABLE SYM tab_sorted {
153 struct rtable_config *cf;
154 cf = rt_new_table($2);
159 CF_ADDTO(conf, roa_table)
161 roa_table_start: ROA TABLE SYM {
162 this_roa_table = roa_new_table_config($3);
167 | roa_table_opts ROA prefix MAX NUM AS NUM ';' {
168 roa_add_item_config(this_roa_table, $3.addr, $3.len, $5, $7);
174 | roa_table_start '{' roa_table_opts '}'
177 /* Definition of protocols */
179 CF_ADDTO(conf, proto)
182 PROTOCOL { $$ = SYM_PROTO; }
183 | TEMPLATE { $$ = SYM_TEMPLATE; }
188 struct symbol *s = cf_default_name(this_proto->protocol->template, &this_proto->protocol->name_counter);
189 s->class = this_proto->class;
191 this_proto->name = s->name;
194 cf_define_symbol($1, this_proto->class, this_proto);
195 this_proto->name = $1->name;
198 struct symbol *s = cf_default_name(this_proto->protocol->template, &this_proto->protocol->name_counter);
199 s->class = this_proto->class;
201 this_proto->name = s->name;
203 if (($2->class != SYM_TEMPLATE) && ($2->class != SYM_PROTO)) cf_error("Template or protocol name expected");
204 proto_copy_config(this_proto, $2->def);
207 cf_define_symbol($1, this_proto->class, this_proto);
208 this_proto->name = $1->name;
210 if (($3->class != SYM_TEMPLATE) && ($3->class != SYM_PROTO)) cf_error("Template or protocol name expected");
211 proto_copy_config(this_proto, $3->def);
218 if ($2 < 0 || $2 > 0xFFFF) cf_error("Invalid preference");
219 this_proto->preference = $2;
221 | DISABLED bool { this_proto->disabled = $2; }
222 | DEBUG debug_mask { this_proto->debug = $2; }
223 | MRTDUMP mrtdump_mask { this_proto->mrtdump = $2; }
224 | IMPORT imexport { this_proto->in_filter = $2; }
225 | EXPORT imexport { this_proto->out_filter = $2; }
226 | RECEIVE LIMIT limit_spec { this_proto->rx_limit = $3; }
227 | IMPORT LIMIT limit_spec { this_proto->in_limit = $3; }
228 | EXPORT LIMIT limit_spec { this_proto->out_limit = $3; }
229 | IMPORT KEEP FILTERED bool { this_proto->in_keep_filtered = $4; }
230 | VRF text { this_proto->vrf = if_get_by_name($2); }
231 | TABLE rtable { this_proto->table = $2; }
232 | ROUTER ID idval { this_proto->router_id = $3; }
233 | DESCRIPTION text { this_proto->dsc = $2; }
237 FILTER filter { $$ = $2; }
239 | ALL { $$ = FILTER_ACCEPT; }
240 | NONE { $$ = FILTER_REJECT; }
244 /* default */ { $$ = PLA_DISABLE; }
245 | ACTION WARN { $$ = PLA_WARN; }
246 | ACTION BLOCK { $$ = PLA_BLOCK; }
247 | ACTION RESTART { $$ = PLA_RESTART; }
248 | ACTION DISABLE { $$ = PLA_DISABLE; }
253 struct proto_limit *l = cfg_allocz(sizeof(struct proto_limit));
263 if ($1->class != SYM_TABLE) cf_error("Table name expected");
268 CF_ADDTO(conf, debug_default)
271 DEBUG PROTOCOLS debug_mask { new_config->proto_default_debug = $3; }
272 | DEBUG COMMANDS expr { new_config->cli_debug = $3; }
275 /* MRTDUMP PROTOCOLS is in systep/unix/config.Y */
277 /* Interface patterns */
279 iface_patt_node_init:
281 struct iface_patt_node *ipn = cfg_allocz(sizeof(struct iface_patt_node));
282 add_tail(&this_ipatt->ipn_list, NODE ipn);
287 iface_patt_node_body:
288 TEXT { this_ipn->pattern = $1; this_ipn->prefix = IPA_NONE; this_ipn->pxlen = 0; }
289 | prefix_or_ipa { this_ipn->pattern = NULL; this_ipn->prefix = $1.addr; this_ipn->pxlen = $1.len; }
290 | TEXT prefix_or_ipa { this_ipn->pattern = $1; this_ipn->prefix = $2.addr; this_ipn->pxlen = $2.len; }
294 { this_ipn->positive = 1; }
295 | '-' { this_ipn->positive = 0; }
299 iface_patt_node_init iface_negate iface_patt_node_body
305 | iface_patt_list ',' iface_patt_node
308 /* For name/mask-only iface patterns */
309 iface_patt_list_nopx: iface_patt_list { iface_patt_check(); }
312 /* Generic this_ipatt init */
313 this_ipatt = cfg_allocz(sizeof(struct iface_patt));
314 init_list(&this_ipatt->ipn_list);
319 iface_patt_init iface_patt_list
323 CLASS expr { $$ = $2 & 0xfc; if (($2 < 0) || ($2 > 255)) cf_error("TX class must be in range 0-255"); }
324 | DSCP expr { $$ = ($2 & 0x3f) << 2; if (($2 < 0) || ($2 > 63)) cf_error("TX DSCP must be in range 0-63"); }
327 /* Direct device route protocol */
329 CF_ADDTO(proto, dev_proto '}')
331 dev_proto_start: proto_start DIRECT {
332 this_proto = proto_config_new(&proto_device, $1);
333 init_list(&DIRECT_CFG->iface_list);
338 dev_proto_start proto_name '{'
339 | dev_proto proto_item ';'
340 | dev_proto dev_iface_patt ';'
341 | dev_proto CHECK LINK bool ';' { DIRECT_CFG->check_link = $4; }
346 this_ipatt = cfg_allocz(sizeof(struct iface_patt));
347 add_tail(&DIRECT_CFG->iface_list, NODE this_ipatt);
348 init_list(&this_ipatt->ipn_list);
353 INTERFACE dev_iface_init iface_patt_list
361 | '{' debug_list '}' { $$ = $2; }
366 | debug_list ',' debug_flag { $$ = $1 | $3; }
370 STATES { $$ = D_STATES; }
371 | ROUTES { $$ = D_ROUTES; }
372 | FILTERS { $$ = D_FILTERS; }
373 | INTERFACES { $$ = D_IFACES; }
374 | EVENTS { $$ = D_EVENTS; }
375 | PACKETS { $$ = D_PACKETS; }
383 | '{' mrtdump_list '}' { $$ = $2; }
388 | mrtdump_list ',' mrtdump_flag { $$ = $1 | $3; }
392 STATES { $$ = MD_STATES; }
393 | MESSAGES { $$ = MD_MESSAGES; }
399 PASSWORDS '{' password_items '}'
405 | password_item ';' password_items
409 password_item_begin '{' password_item_params '}'
410 | password_item_begin
416 this_p_list = cfg_alloc(sizeof(list));
417 init_list(this_p_list);
420 this_p_item = cfg_alloc(sizeof (struct password_item));
421 this_p_item->password = $2;
422 this_p_item->length = strlen($2);
423 this_p_item->genfrom = 0;
424 this_p_item->gento = TIME_INFINITY;
425 this_p_item->accfrom = 0;
426 this_p_item->accto = TIME_INFINITY;
427 this_p_item->id = password_id++;
428 this_p_item->alg = ALG_UNDEFINED;
429 add_tail(this_p_list, &this_p_item->n);
433 password_item_params:
435 | GENERATE FROM datetime ';' password_item_params { this_p_item->genfrom = $3; }
436 | GENERATE TO datetime ';' password_item_params { this_p_item->gento = $3; }
437 | ACCEPT FROM datetime ';' password_item_params { this_p_item->accfrom = $3; }
438 | ACCEPT TO datetime ';' password_item_params { this_p_item->accto = $3; }
439 | FROM datetime ';' password_item_params { this_p_item->genfrom = this_p_item->accfrom = $2; }
440 | TO datetime ';' password_item_params { this_p_item->gento = this_p_item->accto = $2; }
441 | ID expr ';' password_item_params { this_p_item->id = $2; if ($2 <= 0) cf_error("Password ID has to be greated than zero."); }
442 | ALGORITHM password_algorithm ';' password_item_params { this_p_item->alg = $2; }
446 KEYED MD5 { $$ = ALG_MD5; }
447 | KEYED SHA1 { $$ = ALG_SHA1; }
448 | KEYED SHA256 { $$ = ALG_SHA256; }
449 | KEYED SHA384 { $$ = ALG_SHA384; }
450 | KEYED SHA512 { $$ = ALG_SHA512; }
451 | HMAC MD5 { $$ = ALG_HMAC_MD5; }
452 | HMAC SHA1 { $$ = ALG_HMAC_SHA1; }
453 | HMAC SHA256 { $$ = ALG_HMAC_SHA256; }
454 | HMAC SHA384 { $$ = ALG_HMAC_SHA384; }
455 | HMAC SHA512 { $$ = ALG_HMAC_SHA512; }
459 CF_CLI_HELP(SHOW, ..., [[Show status information]])
461 CF_CLI(SHOW STATUS,,, [[Show router status]])
462 { cmd_show_status(); } ;
464 CF_CLI(SHOW MEMORY,,, [[Show memory usage]])
465 { cmd_show_memory(); } ;
467 CF_CLI(SHOW PROTOCOLS, proto_patt2, [<protocol> | \"<pattern>\"], [[Show routing protocols]])
468 { proto_apply_cmd($3, proto_cmd_show, 0, 0); } ;
470 CF_CLI(SHOW PROTOCOLS ALL, proto_patt2, [<protocol> | \"<pattern>\"], [[Show routing protocol details]])
471 { proto_apply_cmd($4, proto_cmd_show, 0, 1); } ;
475 | /* empty */ { $$ = NULL; }
478 CF_CLI(SHOW INTERFACES,,, [[Show network interfaces]])
481 CF_CLI(SHOW INTERFACES SUMMARY,,, [[Show summary of network interfaces]])
482 { if_show_summary(); } ;
484 CF_CLI_HELP(SHOW ROUTE, ..., [[Show routing table]])
485 CF_CLI(SHOW ROUTE, r_args, [[[<prefix>|for <prefix>|for <ip>] [table <t>] [filter <f>|where <cond>] [all] [primary] [filtered] [(export|preexport|noexport) <p>] [protocol <p>] [stats|count]]], [[Show routing table]])
490 $$ = cfg_allocz(sizeof(struct rt_show_data));
492 $$->filter = FILTER_ACCEPT;
496 if ($$->pxlen != 256) cf_error("Only one prefix expected");
497 $$->prefix = $2.addr;
500 | r_args FOR prefix_or_ipa {
502 if ($$->pxlen != 256) cf_error("Only one prefix expected");
503 $$->prefix = $3.addr;
509 if ($3->class != SYM_TABLE) cf_error("%s is not a table", $3->name);
510 $$->table = ((struct rtable_config *)$3->def)->table;
512 | r_args FILTER filter {
514 if ($$->filter != FILTER_ACCEPT) cf_error("Filter specified twice");
517 | r_args where_filter {
519 if ($$->filter != FILTER_ACCEPT) cf_error("Filter specified twice");
528 $$->primary_only = 1;
534 | r_args export_mode SYM {
535 struct proto_config *c = (struct proto_config *) $3->def;
537 if ($$->export_mode) cf_error("Protocol specified twice");
538 if ($3->class != SYM_PROTO || !c->proto) cf_error("%s is not a protocol", $3->name);
539 $$->export_mode = $2;
540 $$->export_protocol = c->proto;
541 $$->running_on_config = c->proto->cf->global;
543 | r_args PROTOCOL SYM {
544 struct proto_config *c = (struct proto_config *) $3->def;
546 if ($$->show_protocol) cf_error("Protocol specified twice");
547 if ($3->class != SYM_PROTO || !c->proto) cf_error("%s is not a protocol", $3->name);
548 $$->show_protocol = c->proto;
549 $$->running_on_config = c->proto->cf->global;
562 PREEXPORT { $$ = RSEM_PREEXPORT; }
563 | EXPORT { $$ = RSEM_EXPORT; }
564 | NOEXPORT { $$ = RSEM_NOEXPORT; }
568 CF_CLI_HELP(SHOW ROA, ..., [[Show ROA table]])
569 CF_CLI(SHOW ROA, roa_args, [<prefix> | in <prefix> | for <prefix>] [as <num>] [table <t>], [[Show ROA table]])
574 $$ = cfg_allocz(sizeof(struct roa_show_data));
575 $$->mode = ROA_SHOW_ALL;
576 $$->table = roa_table_default;
577 if (roa_table_default == NULL)
578 cf_error("No ROA table defined");
580 | roa_args roa_mode prefix {
582 if ($$->mode != ROA_SHOW_ALL) cf_error("Only one prefix expected");
583 $$->prefix = $3.addr;
591 | roa_args TABLE SYM {
593 if ($3->class != SYM_ROA) cf_error("%s is not a ROA table", $3->name);
594 $$->table = ((struct roa_table_config *)$3->def)->table;
599 { $$ = ROA_SHOW_PX; }
600 | IN { $$ = ROA_SHOW_IN; }
601 | FOR { $$ = ROA_SHOW_FOR; }
605 CF_CLI_HELP(SHOW SYMBOLS, ..., [[Show all known symbolic names]])
606 CF_CLI(SHOW SYMBOLS, sym_args, [table|filter|function|protocol|template|roa|<symbol>], [[Show all known symbolic names]])
607 { cmd_show_symbols($3); } ;
611 $$ = cfg_allocz(sizeof(struct sym_show_data));
613 | sym_args TABLE { $$ = $1; $$->type = SYM_TABLE; }
614 | sym_args FUNCTION { $$ = $1; $$->type = SYM_FUNCTION; }
615 | sym_args FILTER { $$ = $1; $$->type = SYM_FILTER; }
616 | sym_args PROTOCOL { $$ = $1; $$->type = SYM_PROTO; }
617 | sym_args TEMPLATE { $$ = $1; $$->type = SYM_TEMPLATE; }
618 | sym_args ROA { $$ = $1; $$->type = SYM_ROA; }
619 | sym_args SYM { $$ = $1; $$->sym = $2; }
625 if (roa_table_default == NULL)
626 cf_error("No ROA table defined");
627 $$ = roa_table_default;
630 if ($2->class != SYM_ROA)
631 cf_error("%s is not a ROA table", $2->name);
632 $$ = ((struct roa_table_config *)$2->def)->table;
636 CF_CLI_HELP(ADD, roa ..., [[Add ROA record]])
637 CF_CLI(ADD ROA, prefix MAX NUM AS NUM roa_table_arg, <prefix> max <num> as <num> [table <name>], [[Add ROA record]])
639 if (! cli_access_restricted())
640 { roa_add_item($8, $3.addr, $3.len, $5, $7, ROA_SRC_DYNAMIC); cli_msg(0, ""); }
643 CF_CLI_HELP(DELETE, roa ..., [[Delete ROA record]])
644 CF_CLI(DELETE ROA, prefix MAX NUM AS NUM roa_table_arg, <prefix> max <num> as <num> [table <name>], [[Delete ROA record]])
646 if (! cli_access_restricted())
647 { roa_delete_item($8, $3.addr, $3.len, $5, $7, ROA_SRC_DYNAMIC); cli_msg(0, ""); }
650 CF_CLI_HELP(FLUSH, roa [table <name>], [[Removes all dynamic ROA records]])
651 CF_CLI(FLUSH ROA, roa_table_arg, [table <name>], [[Removes all dynamic ROA records]])
653 if (! cli_access_restricted())
654 { roa_flush($3, ROA_SRC_DYNAMIC); cli_msg(0, ""); }
658 CF_CLI_HELP(DUMP, ..., [[Dump debugging information]])
659 CF_CLI(DUMP RESOURCES,,, [[Dump all allocated resource]])
660 { rdump(&root_pool); cli_msg(0, ""); } ;
661 CF_CLI(DUMP SOCKETS,,, [[Dump open sockets]])
662 { sk_dump_all(); cli_msg(0, ""); } ;
663 CF_CLI(DUMP EVENTS,,, [[Dump event log]])
664 { io_log_dump(); cli_msg(0, ""); } ;
665 CF_CLI(DUMP INTERFACES,,, [[Dump interface information]])
666 { if_dump_all(); cli_msg(0, ""); } ;
667 CF_CLI(DUMP NEIGHBORS,,, [[Dump neighbor cache]])
668 { neigh_dump_all(); cli_msg(0, ""); } ;
669 CF_CLI(DUMP ATTRIBUTES,,, [[Dump attribute cache]])
670 { rta_dump_all(); cli_msg(0, ""); } ;
671 CF_CLI(DUMP ROUTES,,, [[Dump routing table]])
672 { rt_dump_all(); cli_msg(0, ""); } ;
673 CF_CLI(DUMP PROTOCOLS,,, [[Dump protocol information]])
674 { protos_dump_all(); cli_msg(0, ""); } ;
676 CF_CLI(EVAL, term, <expr>, [[Evaluate an expression]])
679 CF_CLI_HELP(ECHO, ..., [[Control echoing of log messages]])
680 CF_CLI(ECHO, echo_mask echo_size, (all | off | { debug|trace|info|remote|warning|error|auth [, ...] }) [<buffer-size>], [[Control echoing of log messages]]) {
681 cli_set_log_echo(this_cli, $2, $3);
688 | '{' log_mask_list '}' { $$ = $2; }
692 /* empty */ { $$ = 4096; }
694 if ($1 < 256 || $1 > 65536) cf_error("Invalid log buffer size");
699 CF_CLI(DISABLE, proto_patt text_or_none, (<protocol> | \"<pattern>\" | all) [message], [[Disable protocol]])
700 { proto_apply_cmd($2, proto_cmd_disable, 1, (uintptr_t) $3); } ;
701 CF_CLI(ENABLE, proto_patt text_or_none, (<protocol> | \"<pattern>\" | all) [message], [[Enable protocol]])
702 { proto_apply_cmd($2, proto_cmd_enable, 1, (uintptr_t) $3); } ;
703 CF_CLI(RESTART, proto_patt text_or_none, (<protocol> | \"<pattern>\" | all) [message], [[Restart protocol]])
704 { proto_apply_cmd($2, proto_cmd_restart, 1, (uintptr_t) $3); } ;
705 CF_CLI(RELOAD, proto_patt, <protocol> | \"<pattern>\" | all, [[Reload protocol]])
706 { proto_apply_cmd($2, proto_cmd_reload, 1, CMD_RELOAD); } ;
707 CF_CLI(RELOAD IN, proto_patt, <protocol> | \"<pattern>\" | all, [[Reload protocol (just imported routes)]])
708 { proto_apply_cmd($3, proto_cmd_reload, 1, CMD_RELOAD_IN); } ;
709 CF_CLI(RELOAD OUT, proto_patt, <protocol> | \"<pattern>\" | all, [[Reload protocol (just exported routes)]])
710 { proto_apply_cmd($3, proto_cmd_reload, 1, CMD_RELOAD_OUT); } ;
712 CF_CLI_HELP(DEBUG, ..., [[Control protocol debugging via BIRD logs]])
713 CF_CLI(DEBUG, proto_patt debug_mask, (<protocol> | \"<pattern>\" | all) (all | off | { states|routes|filters|interfaces|events|packets [, ...] }), [[Control protocol debugging via BIRD logs]])
714 { proto_apply_cmd($2, proto_cmd_debug, 1, $3); } ;
716 CF_CLI_HELP(MRTDUMP, ..., [[Control protocol debugging via MRTdump files]])
717 CF_CLI(MRTDUMP, proto_patt mrtdump_mask, (<protocol> | \"<pattern>\" | all) (all | off | { states|messages [, ...] }), [[Control protocol debugging via MRTdump format]])
718 { proto_apply_cmd($2, proto_cmd_mrtdump, 1, $3); } ;
720 CF_CLI(RESTRICT,,,[[Restrict current CLI session to safe commands]])
721 { this_cli->restricted = 1; cli_msg(16, "Access restricted"); } ;
724 SYM { $$.ptr = $1; $$.patt = 0; }
725 | ALL { $$.ptr = NULL; $$.patt = 1; }
726 | TEXT { $$.ptr = $1; $$.patt = 1; }
730 SYM { $$.ptr = $1; $$.patt = 0; }
731 | { $$.ptr = NULL; $$.patt = 1; }
732 | TEXT { $$.ptr = $1; $$.patt = 1; }
735 CF_ADDTO(dynamic_attr, IGP_METRIC
736 { $$ = f_new_dynamic_attr(EAF_TYPE_INT, T_INT, EA_GEN_IGP_METRIC); })