1998-11-27 19:37:57 +00:00
|
|
|
/*
|
|
|
|
* BIRD -- Core Configuration
|
|
|
|
*
|
2000-01-19 12:30:19 +00:00
|
|
|
* (c) 1998--2000 Martin Mares <mj@ucw.cz>
|
2004-07-13 14:46:14 +00:00
|
|
|
* (c) 2004 Ondrej Filip <feela@network.cz>
|
1998-11-27 19:37:57 +00:00
|
|
|
*
|
|
|
|
* Can be freely distributed and used under the terms of the GNU GPL.
|
|
|
|
*/
|
|
|
|
|
|
|
|
CF_HDR
|
|
|
|
|
1998-11-29 22:03:58 +00:00
|
|
|
#include "nest/rt-dev.h"
|
1999-05-26 14:24:57 +00:00
|
|
|
#include "nest/password.h"
|
2000-01-19 12:30:19 +00:00
|
|
|
#include "nest/cmds.h"
|
2004-06-26 20:11:14 +00:00
|
|
|
#include "lib/lists.h"
|
2016-01-26 15:45:13 +00:00
|
|
|
#include "lib/mac.h"
|
1998-11-29 22:03:58 +00:00
|
|
|
|
2000-04-28 15:11:10 +00:00
|
|
|
CF_DEFINES
|
|
|
|
|
2021-12-22 03:32:26 +00:00
|
|
|
static struct rtable_config *this_table;
|
2000-04-28 15:11:10 +00:00
|
|
|
static struct proto_config *this_proto;
|
2016-01-26 10:48:58 +00:00
|
|
|
static struct channel_config *this_channel;
|
2000-04-28 15:11:10 +00:00
|
|
|
static struct iface_patt *this_ipatt;
|
2009-05-06 20:02:45 +00:00
|
|
|
static struct iface_patt_node *this_ipn;
|
2015-12-16 14:30:44 +00:00
|
|
|
/* static struct roa_table_config *this_roa_table; */
|
2004-06-26 20:11:14 +00:00
|
|
|
static list *this_p_list;
|
|
|
|
static struct password_item *this_p_item;
|
2008-11-08 16:24:23 +00:00
|
|
|
static int password_id;
|
2020-11-08 14:33:22 +00:00
|
|
|
static struct bfd_options *this_bfd_opts;
|
2008-11-08 16:24:23 +00:00
|
|
|
|
2014-03-30 22:56:44 +00:00
|
|
|
static void
|
|
|
|
iface_patt_check(void)
|
|
|
|
{
|
|
|
|
struct iface_patt_node *pn;
|
|
|
|
|
|
|
|
WALK_LIST(pn, this_ipatt->ipn_list)
|
2015-12-24 14:52:03 +00:00
|
|
|
if (!pn->pattern || pn->prefix.type)
|
2014-03-30 22:56:44 +00:00
|
|
|
cf_error("Interface name/mask expected, not IP prefix");
|
|
|
|
}
|
|
|
|
|
2021-04-14 19:39:43 +00:00
|
|
|
static inline void
|
2021-06-06 17:10:33 +00:00
|
|
|
init_password_list(void)
|
2021-04-14 19:39:43 +00:00
|
|
|
{
|
|
|
|
if (!this_p_list) {
|
|
|
|
this_p_list = cfg_allocz(sizeof(list));
|
|
|
|
init_list(this_p_list);
|
|
|
|
password_id = 1;
|
|
|
|
}
|
2021-06-06 17:10:33 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
static inline void
|
|
|
|
init_password(const void *key, uint length, uint id)
|
|
|
|
{
|
2021-04-14 19:39:43 +00:00
|
|
|
this_p_item = cfg_allocz(sizeof (struct password_item));
|
|
|
|
this_p_item->password = key;
|
|
|
|
this_p_item->length = length;
|
|
|
|
this_p_item->genfrom = 0;
|
|
|
|
this_p_item->gento = TIME_INFINITY;
|
|
|
|
this_p_item->accfrom = 0;
|
|
|
|
this_p_item->accto = TIME_INFINITY;
|
|
|
|
this_p_item->id = id;
|
|
|
|
this_p_item->alg = ALG_UNDEFINED;
|
|
|
|
add_tail(this_p_list, &this_p_item->n);
|
|
|
|
}
|
2014-03-30 22:56:44 +00:00
|
|
|
|
2009-04-08 18:15:01 +00:00
|
|
|
static inline void
|
|
|
|
reset_passwords(void)
|
|
|
|
{
|
2011-11-06 23:31:23 +00:00
|
|
|
this_p_list = NULL;
|
2009-04-08 18:15:01 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
static inline list *
|
2008-11-08 16:24:23 +00:00
|
|
|
get_passwords(void)
|
|
|
|
{
|
|
|
|
list *rv = this_p_list;
|
|
|
|
this_p_list = NULL;
|
|
|
|
return rv;
|
|
|
|
}
|
|
|
|
|
2020-11-12 03:02:38 +00:00
|
|
|
static inline void
|
|
|
|
init_bfd_opts(struct bfd_options **opts)
|
|
|
|
{
|
|
|
|
cf_check_bfd(1);
|
|
|
|
|
|
|
|
if (! *opts)
|
|
|
|
*opts = bfd_new_options();
|
|
|
|
}
|
|
|
|
|
|
|
|
static inline void
|
|
|
|
open_bfd_opts(struct bfd_options **opts)
|
|
|
|
{
|
|
|
|
init_bfd_opts(opts);
|
|
|
|
this_bfd_opts = *opts;
|
|
|
|
}
|
|
|
|
|
|
|
|
static inline void
|
|
|
|
close_bfd_opts(void)
|
|
|
|
{
|
|
|
|
this_bfd_opts = NULL;
|
|
|
|
}
|
|
|
|
|
2016-01-26 10:48:58 +00:00
|
|
|
static void
|
|
|
|
proto_postconfig(void)
|
|
|
|
{
|
|
|
|
CALL(this_proto->protocol->postconfig, this_proto);
|
|
|
|
this_channel = NULL;
|
|
|
|
this_proto = NULL;
|
|
|
|
}
|
|
|
|
|
2023-11-01 16:28:08 +00:00
|
|
|
static void
|
|
|
|
channel_reload_out_done_main(void *_prr)
|
|
|
|
{
|
|
|
|
struct proto_reload_request *prr = _prr;
|
|
|
|
ASSERT_THE_BIRD_LOCKED;
|
|
|
|
|
|
|
|
rfree(prr->trie->lp);
|
|
|
|
}
|
|
|
|
|
2023-10-03 12:07:11 +00:00
|
|
|
static inline void
|
|
|
|
proto_call_cmd_reload(struct proto_spec ps, int dir, const struct f_trie *trie)
|
|
|
|
{
|
|
|
|
struct proto_reload_request *prr = cfg_alloc(sizeof *prr);
|
|
|
|
*prr = (struct proto_reload_request) {
|
|
|
|
.trie = trie,
|
|
|
|
.dir = dir,
|
2023-11-01 16:28:08 +00:00
|
|
|
.counter = 1,
|
2023-10-03 12:07:11 +00:00
|
|
|
};
|
2023-10-24 10:00:03 +00:00
|
|
|
if (trie)
|
|
|
|
{
|
2023-11-01 16:28:08 +00:00
|
|
|
/* CLI linpool is moved to trie, because trie is need for longer time
|
|
|
|
than the linpool would exist in CLI. The linpool is freed in channel_reload_out_done_main */
|
2023-10-24 10:00:03 +00:00
|
|
|
ASSERT_DIE(this_cli->parser_pool == prr->trie->lp);
|
|
|
|
rmove(this_cli->parser_pool, &root_pool);
|
|
|
|
this_cli->parser_pool = lp_new(this_cli->pool);
|
|
|
|
prr->ev = (event) {
|
|
|
|
.data = prr,
|
2023-11-01 16:28:08 +00:00
|
|
|
.hook = channel_reload_out_done_main,
|
2023-10-24 10:00:03 +00:00
|
|
|
};
|
|
|
|
}
|
2023-10-03 12:07:11 +00:00
|
|
|
|
|
|
|
proto_apply_cmd(ps, proto_cmd_reload, 1, (uintptr_t) prr);
|
2023-11-01 16:28:08 +00:00
|
|
|
/* This function used reference to this trie, so it is freed here as well as in protocols*/
|
2023-10-24 10:00:03 +00:00
|
|
|
if (trie)
|
|
|
|
if (atomic_fetch_sub_explicit(&prr->counter, 1, memory_order_acq_rel) == 1)
|
|
|
|
ev_send_loop(&main_birdloop, &prr->ev);
|
2023-10-03 12:07:11 +00:00
|
|
|
}
|
2016-01-26 10:48:58 +00:00
|
|
|
|
2011-11-06 23:31:23 +00:00
|
|
|
#define DIRECT_CFG ((struct rt_dev_config *) this_proto)
|
2000-04-28 15:11:10 +00:00
|
|
|
|
1998-11-27 19:37:57 +00:00
|
|
|
CF_DECLS
|
|
|
|
|
2020-05-01 20:26:24 +00:00
|
|
|
CF_KEYWORDS(ROUTER, ID, HOSTNAME, PROTOCOL, TEMPLATE, PREFERENCE, DISABLED, DEBUG, ALL, OFF, DIRECT, PIPE)
|
2019-07-24 13:08:03 +00:00
|
|
|
CF_KEYWORDS(INTERFACE, IMPORT, EXPORT, FILTER, NONE, VRF, DEFAULT, TABLE, STATES, ROUTES, FILTERS)
|
2018-02-13 15:27:57 +00:00
|
|
|
CF_KEYWORDS(IPV4, IPV6, VPN4, VPN6, ROA4, ROA6, FLOW4, FLOW6, SADR, MPLS)
|
2021-03-17 14:56:12 +00:00
|
|
|
CF_KEYWORDS(RECEIVE, LIMIT, ACTION, WARN, BLOCK, RESTART, DISABLE, KEEP, FILTERED, RPKI)
|
2021-06-09 17:54:01 +00:00
|
|
|
CF_KEYWORDS(PASSWORD, KEY, FROM, PASSIVE, TO, ID, EVENTS, PACKETS, PROTOCOLS, CHANNELS, INTERFACES)
|
2021-04-10 15:33:28 +00:00
|
|
|
CF_KEYWORDS(ALGORITHM, KEYED, HMAC, MD5, SHA1, SHA256, SHA384, SHA512, BLAKE2S128, BLAKE2S256, BLAKE2B256, BLAKE2B512)
|
2022-05-04 10:24:30 +00:00
|
|
|
CF_KEYWORDS(PRIMARY, STATS, COUNT, FOR, IN, COMMANDS, PREEXPORT, NOEXPORT, EXPORTED, GENERATE)
|
2021-12-22 03:32:26 +00:00
|
|
|
CF_KEYWORDS(BGP, PASSWORDS, DESCRIPTION)
|
2023-10-03 12:07:11 +00:00
|
|
|
CF_KEYWORDS(RELOAD, IN, OUT, MRTDUMP, MESSAGES, RESTRICT, MEMORY, CLASS, DSCP, PARTIAL)
|
2017-06-06 14:47:30 +00:00
|
|
|
CF_KEYWORDS(TIMEFORMAT, ISO, SHORT, LONG, ROUTE, PROTOCOL, BASE, LOG, S, MS, US)
|
2022-05-04 10:24:30 +00:00
|
|
|
CF_KEYWORDS(GRACEFUL, RESTART, WAIT, MAX, AS)
|
2020-11-08 14:33:22 +00:00
|
|
|
CF_KEYWORDS(MIN, IDLE, RX, TX, INTERVAL, MULTIPLIER, PASSIVE)
|
2019-10-19 10:50:27 +00:00
|
|
|
CF_KEYWORDS(CHECK, LINK)
|
2022-09-26 10:09:14 +00:00
|
|
|
CF_KEYWORDS(CORK, SORTED, TRIE, MIN, MAX, ROA, ROUTE, REFRESH, SETTLE, TIME, GC, THRESHOLD, PERIOD)
|
1998-11-27 19:37:57 +00:00
|
|
|
|
2017-04-25 17:02:31 +00:00
|
|
|
/* For r_args_channel */
|
2018-02-13 15:27:57 +00:00
|
|
|
CF_KEYWORDS(IPV4, IPV4_MC, IPV4_MPLS, IPV6, IPV6_MC, IPV6_MPLS, IPV6_SADR, VPN4, VPN4_MC, VPN4_MPLS, VPN6, VPN6_MC, VPN6_MPLS, ROA4, ROA6, FLOW4, FLOW6, MPLS, PRI, SEC)
|
2017-04-25 17:02:31 +00:00
|
|
|
|
2020-02-17 10:18:32 +00:00
|
|
|
CF_ENUM(T_ENUM_RTS, RTS_, STATIC, INHERIT, DEVICE, STATIC_DEVICE, REDIRECT,
|
2016-07-19 10:16:51 +00:00
|
|
|
RIP, OSPF, OSPF_IA, OSPF_EXT1, OSPF_EXT2, BGP, PIPE, BABEL)
|
2011-09-24 09:06:42 +00:00
|
|
|
CF_ENUM(T_ENUM_SCOPE, SCOPE_, HOST, LINK, SITE, ORGANIZATION, UNIVERSE, UNDEFINED)
|
2022-05-15 16:09:30 +00:00
|
|
|
CF_ENUM(T_ENUM_RTD, RTD_, BLACKHOLE, UNREACHABLE, PROHIBIT)
|
2016-01-20 14:06:19 +00:00
|
|
|
CF_ENUM(T_ENUM_ROA, ROA_, UNKNOWN, VALID, INVALID)
|
2019-11-03 19:26:54 +00:00
|
|
|
CF_ENUM_PX(T_ENUM_AF, AF_, AFI_, IPV4, IPV6)
|
1999-11-15 11:36:22 +00:00
|
|
|
|
1999-08-03 19:36:06 +00:00
|
|
|
%type <i32> idval
|
1999-04-05 20:15:31 +00:00
|
|
|
%type <f> imexport
|
1999-05-17 20:14:52 +00:00
|
|
|
%type <r> rtable
|
2019-05-17 20:18:49 +00:00
|
|
|
%type <s> optproto
|
1999-12-01 15:10:21 +00:00
|
|
|
%type <ra> r_args
|
2012-03-16 11:47:12 +00:00
|
|
|
%type <sd> sym_args
|
2023-08-15 15:05:58 +00:00
|
|
|
%type <i> proto_start debug_mask debug_list debug_flag mrtdump_mask mrtdump_list mrtdump_flag export_mode limit_action net_type tos password_algorithm
|
2010-02-19 23:03:31 +00:00
|
|
|
%type <ps> proto_patt proto_patt2
|
2016-01-26 10:48:58 +00:00
|
|
|
%type <cc> channel_start proto_channel
|
|
|
|
%type <cl> limit_spec
|
2017-04-18 11:45:50 +00:00
|
|
|
%type <net> r_args_for_val
|
|
|
|
%type <net_ptr> r_args_for
|
2020-12-07 21:19:40 +00:00
|
|
|
%type <t> channel_sym
|
|
|
|
%type <c> channel_arg
|
2023-10-03 12:07:11 +00:00
|
|
|
%type <const_trie> partial_opt
|
1998-11-27 19:37:57 +00:00
|
|
|
|
|
|
|
CF_GRAMMAR
|
|
|
|
|
1998-11-27 21:09:57 +00:00
|
|
|
/* Setting of router ID */
|
|
|
|
|
2018-06-26 12:29:03 +00:00
|
|
|
conf: rtrid ;
|
1999-05-17 20:14:52 +00:00
|
|
|
|
2015-12-24 14:52:03 +00:00
|
|
|
rtrid:
|
2012-12-27 11:56:23 +00:00
|
|
|
ROUTER ID idval ';' { new_config->router_id = $3; }
|
|
|
|
| ROUTER ID FROM iface_patt ';' { new_config->router_id_from = this_ipatt; }
|
1998-11-27 19:37:57 +00:00
|
|
|
;
|
|
|
|
|
|
|
|
idval:
|
1999-08-03 19:36:06 +00:00
|
|
|
NUM { $$ = $1; }
|
2022-03-09 01:32:29 +00:00
|
|
|
| '(' term ')' { $$ = f_eval_int(f_linearize($2, 1)); }
|
2015-11-05 11:48:52 +00:00
|
|
|
| IP4 { $$ = ip4_to_u32($1); }
|
2019-05-17 20:18:49 +00:00
|
|
|
| CF_SYM_KNOWN {
|
2015-07-18 17:30:35 +00:00
|
|
|
if ($1->class == (SYM_CONSTANT | T_INT) || $1->class == (SYM_CONSTANT | T_QUAD))
|
|
|
|
$$ = SYM_VAL($1).i;
|
2015-12-16 09:25:12 +00:00
|
|
|
else if (($1->class == (SYM_CONSTANT | T_IP)) && ipa_is_ip4(SYM_VAL($1).ip))
|
|
|
|
$$ = ipa_to_u32(SYM_VAL($1).ip);
|
2015-07-18 17:30:35 +00:00
|
|
|
else
|
2016-03-15 09:29:32 +00:00
|
|
|
cf_error("Number or IPv4 address constant expected");
|
2015-07-18 17:30:35 +00:00
|
|
|
}
|
1998-11-27 19:37:57 +00:00
|
|
|
;
|
|
|
|
|
2021-02-10 15:53:57 +00:00
|
|
|
conf: hostname_override ;
|
|
|
|
|
|
|
|
hostname_override: HOSTNAME text ';' { new_config->hostname = $2; } ;
|
|
|
|
|
2018-06-26 12:29:03 +00:00
|
|
|
conf: gr_opts ;
|
2014-03-20 13:07:12 +00:00
|
|
|
|
|
|
|
gr_opts: GRACEFUL RESTART WAIT expr ';' { new_config->gr_wait = $4; } ;
|
|
|
|
|
|
|
|
|
2016-01-26 10:48:58 +00:00
|
|
|
/* Network types (for tables, channels) */
|
1999-05-17 20:14:52 +00:00
|
|
|
|
2016-01-26 10:48:58 +00:00
|
|
|
net_type:
|
|
|
|
IPV4 { $$ = NET_IP4; }
|
2015-12-21 16:17:21 +00:00
|
|
|
| IPV6 { $$ = NET_IP6; }
|
2018-02-13 15:27:57 +00:00
|
|
|
| IPV6 SADR { $$ = NET_IP6_SADR; }
|
2015-11-05 11:48:52 +00:00
|
|
|
| VPN4 { $$ = NET_VPN4; }
|
|
|
|
| VPN6 { $$ = NET_VPN6; }
|
2016-01-14 09:03:50 +00:00
|
|
|
| ROA4 { $$ = NET_ROA4; }
|
|
|
|
| ROA6 { $$ = NET_ROA6; }
|
2016-12-07 14:36:15 +00:00
|
|
|
| FLOW4{ $$ = NET_FLOW4; }
|
|
|
|
| FLOW6{ $$ = NET_FLOW6; }
|
2017-12-11 23:05:49 +00:00
|
|
|
| MPLS { $$ = NET_MPLS; }
|
2015-11-05 11:48:52 +00:00
|
|
|
;
|
|
|
|
|
2018-02-13 15:27:57 +00:00
|
|
|
CF_ENUM(T_ENUM_NETTYPE, NET_, IP4, IP6, VPN4, VPN6, ROA4, ROA6, FLOW4, FLOW6, IP6_SADR)
|
2017-03-13 12:50:32 +00:00
|
|
|
|
2016-01-26 10:48:58 +00:00
|
|
|
|
|
|
|
/* Creation of routing tables */
|
|
|
|
|
2018-06-26 12:29:03 +00:00
|
|
|
conf: table ;
|
2016-01-26 10:48:58 +00:00
|
|
|
|
2021-12-22 03:32:26 +00:00
|
|
|
table: table_start table_sorted table_opt_list ;
|
|
|
|
|
|
|
|
table_start: net_type TABLE symbol {
|
|
|
|
this_table = rt_new_table($3, $1);
|
|
|
|
}
|
|
|
|
;
|
|
|
|
|
2015-11-05 11:48:52 +00:00
|
|
|
table_sorted:
|
2021-12-22 03:32:26 +00:00
|
|
|
/* empty */
|
|
|
|
| SORTED { this_table->sorted = 1; }
|
2012-07-04 19:31:03 +00:00
|
|
|
;
|
|
|
|
|
2021-12-22 03:32:26 +00:00
|
|
|
table_opt:
|
|
|
|
SORTED bool { this_table->sorted = $2; }
|
|
|
|
| TRIE bool {
|
|
|
|
if (!net_val_match(this_table->addr_type, NB_IP | NB_VPN | NB_ROA | NB_IP6_SADR))
|
|
|
|
cf_error("Trie option not supported for %s table", net_label[this_table->addr_type]);
|
|
|
|
this_table->trie_used = $2;
|
1999-05-17 20:14:52 +00:00
|
|
|
}
|
2022-06-04 15:34:57 +00:00
|
|
|
| GC THRESHOLD expr { this_table->gc_threshold = $3; }
|
|
|
|
| GC PERIOD expr_us { this_table->gc_period = (uint) $3; if ($3 > 3600 S_) cf_error("GC period must be at most 3600 s"); }
|
2022-07-28 11:50:59 +00:00
|
|
|
| CORK THRESHOLD expr expr {
|
|
|
|
if ($3 > $4) cf_error("Cork low threshold must be lower than the high threshold.");
|
|
|
|
this_table->cork_threshold.low = $3;
|
|
|
|
this_table->cork_threshold.high = $4; }
|
2022-09-26 10:09:14 +00:00
|
|
|
| EXPORT SETTLE TIME settle { this_table->export_settle = $4; }
|
|
|
|
| ROUTE REFRESH EXPORT SETTLE TIME settle { this_table->export_rr_settle = $6; }
|
2022-08-30 17:40:58 +00:00
|
|
|
| DEBUG bool { this_table->debug = $2; }
|
2021-12-22 03:32:26 +00:00
|
|
|
;
|
|
|
|
|
|
|
|
table_opts:
|
|
|
|
/* empty */
|
|
|
|
| table_opts table_opt ';'
|
|
|
|
;
|
|
|
|
|
|
|
|
table_opt_list:
|
|
|
|
/* empty */
|
|
|
|
| '{' table_opts '}'
|
1999-05-17 20:14:52 +00:00
|
|
|
;
|
|
|
|
|
2016-01-26 10:48:58 +00:00
|
|
|
|
1998-11-27 21:09:57 +00:00
|
|
|
/* Definition of protocols */
|
|
|
|
|
2018-06-26 12:29:03 +00:00
|
|
|
conf: proto { proto_postconfig(); } ;
|
1998-11-27 21:09:57 +00:00
|
|
|
|
2011-11-06 23:31:23 +00:00
|
|
|
proto_start:
|
|
|
|
PROTOCOL { $$ = SYM_PROTO; }
|
|
|
|
| TEMPLATE { $$ = SYM_TEMPLATE; }
|
2002-11-13 08:46:12 +00:00
|
|
|
;
|
1998-11-27 21:09:57 +00:00
|
|
|
|
|
|
|
proto_name:
|
|
|
|
/* EMPTY */ {
|
2000-01-17 11:52:50 +00:00
|
|
|
struct symbol *s = cf_default_name(this_proto->protocol->template, &this_proto->protocol->name_counter);
|
2011-11-06 23:31:23 +00:00
|
|
|
s->class = this_proto->class;
|
2019-02-15 12:53:17 +00:00
|
|
|
s->proto = this_proto;
|
1998-11-27 21:09:57 +00:00
|
|
|
this_proto->name = s->name;
|
|
|
|
}
|
2019-07-30 12:28:40 +00:00
|
|
|
| symbol {
|
2019-02-15 12:53:17 +00:00
|
|
|
cf_define_symbol($1, this_proto->class, proto, this_proto);
|
1998-11-27 21:09:57 +00:00
|
|
|
this_proto->name = $1->name;
|
|
|
|
}
|
2019-05-17 20:18:49 +00:00
|
|
|
| FROM CF_SYM_KNOWN {
|
|
|
|
if (($2->class != SYM_TEMPLATE) && ($2->class != SYM_PROTO)) cf_error("Template or protocol name expected");
|
|
|
|
|
2015-03-09 22:59:26 +00:00
|
|
|
struct symbol *s = cf_default_name(this_proto->protocol->template, &this_proto->protocol->name_counter);
|
2015-05-22 09:12:48 +00:00
|
|
|
s->class = this_proto->class;
|
2019-02-15 12:53:17 +00:00
|
|
|
s->proto = this_proto;
|
2015-03-09 22:59:26 +00:00
|
|
|
this_proto->name = s->name;
|
2015-05-22 09:12:48 +00:00
|
|
|
|
2019-02-15 12:53:17 +00:00
|
|
|
proto_copy_config(this_proto, $2->proto);
|
2015-03-09 22:59:26 +00:00
|
|
|
}
|
2019-07-30 12:28:40 +00:00
|
|
|
| symbol FROM CF_SYM_KNOWN {
|
2019-05-17 20:18:49 +00:00
|
|
|
if (($3->class != SYM_TEMPLATE) && ($3->class != SYM_PROTO)) cf_error("Template or protocol name expected");
|
|
|
|
|
2019-02-15 12:53:17 +00:00
|
|
|
cf_define_symbol($1, this_proto->class, proto, this_proto);
|
2011-11-06 23:31:23 +00:00
|
|
|
this_proto->name = $1->name;
|
|
|
|
|
2019-02-15 12:53:17 +00:00
|
|
|
proto_copy_config(this_proto, $3->proto);
|
2011-11-06 23:31:23 +00:00
|
|
|
}
|
1998-11-27 21:09:57 +00:00
|
|
|
;
|
|
|
|
|
|
|
|
proto_item:
|
|
|
|
/* EMPTY */
|
2000-06-08 10:25:56 +00:00
|
|
|
| DISABLED bool { this_proto->disabled = $2; }
|
2000-03-07 20:49:48 +00:00
|
|
|
| DEBUG debug_mask { this_proto->debug = $2; }
|
2010-01-03 11:17:52 +00:00
|
|
|
| MRTDUMP mrtdump_mask { this_proto->mrtdump = $2; }
|
2009-10-12 21:31:42 +00:00
|
|
|
| ROUTER ID idval { this_proto->router_id = $3; }
|
2014-05-29 21:05:03 +00:00
|
|
|
| DESCRIPTION text { this_proto->dsc = $2; }
|
2021-11-15 09:53:58 +00:00
|
|
|
| VRF text { this_proto->vrf = if_get_by_name($2); }
|
|
|
|
| VRF DEFAULT { this_proto->vrf = &default_vrf; }
|
1999-04-05 20:15:31 +00:00
|
|
|
;
|
|
|
|
|
2016-01-26 10:48:58 +00:00
|
|
|
|
|
|
|
channel_start: net_type
|
|
|
|
{
|
2018-01-09 17:42:22 +00:00
|
|
|
$$ = this_channel = channel_config_get(NULL, net_label[$1], $1, this_proto);
|
2016-01-26 10:48:58 +00:00
|
|
|
};
|
|
|
|
|
2020-12-07 21:19:40 +00:00
|
|
|
channel_item_:
|
2016-01-26 10:48:58 +00:00
|
|
|
TABLE rtable {
|
|
|
|
if (this_channel->net_type && ($2->addr_type != this_channel->net_type))
|
|
|
|
cf_error("Incompatible table type");
|
|
|
|
this_channel->table = $2;
|
|
|
|
}
|
|
|
|
| IMPORT imexport { this_channel->in_filter = $2; }
|
2022-06-22 10:45:42 +00:00
|
|
|
| EXPORT IN net_any imexport {
|
|
|
|
if (this_channel->net_type && ($3->type != this_channel->net_type))
|
|
|
|
cf_error("Incompatible export prefilter type");
|
|
|
|
this_channel->out_subprefix = $3;
|
|
|
|
this_channel->out_filter = $4;
|
|
|
|
}
|
2016-01-26 10:48:58 +00:00
|
|
|
| EXPORT imexport { this_channel->out_filter = $2; }
|
2023-05-07 21:04:47 +00:00
|
|
|
| EXPORT BLOCK expr { this_channel->feed_block_size = $3; }
|
2016-01-26 10:48:58 +00:00
|
|
|
| RECEIVE LIMIT limit_spec { this_channel->rx_limit = $3; }
|
|
|
|
| IMPORT LIMIT limit_spec { this_channel->in_limit = $3; }
|
|
|
|
| EXPORT LIMIT limit_spec { this_channel->out_limit = $3; }
|
2022-09-09 13:04:36 +00:00
|
|
|
| ROA SETTLE TIME settle { this_channel->roa_settle = $4; }
|
2016-01-26 10:48:58 +00:00
|
|
|
| PREFERENCE expr { this_channel->preference = $2; check_u16($2); }
|
2022-06-16 21:24:56 +00:00
|
|
|
| IMPORT KEEP FILTERED bool {
|
|
|
|
if ($4)
|
|
|
|
this_channel->in_keep |= RIK_REJECTED;
|
|
|
|
else if ((this_channel->in_keep & RIK_PREFILTER) == RIK_PREFILTER)
|
|
|
|
cf_error("Import keep filtered is implied by the import table.");
|
|
|
|
else
|
|
|
|
this_channel->in_keep &= ~RIK_REJECTED;
|
|
|
|
}
|
2021-02-12 04:05:18 +00:00
|
|
|
| RPKI RELOAD bool { this_channel->rpki_reload = $3; }
|
2016-01-26 10:48:58 +00:00
|
|
|
;
|
|
|
|
|
2020-12-07 21:19:40 +00:00
|
|
|
/* To avoid grammar collision in Pipe protocol */
|
|
|
|
channel_item:
|
|
|
|
channel_item_
|
|
|
|
| DEBUG debug_mask { this_channel->debug = $2; }
|
|
|
|
;
|
|
|
|
|
2016-01-26 10:48:58 +00:00
|
|
|
channel_opts:
|
|
|
|
/* empty */
|
|
|
|
| channel_opts channel_item ';'
|
|
|
|
;
|
|
|
|
|
|
|
|
channel_opt_list:
|
|
|
|
/* empty */
|
|
|
|
| '{' channel_opts '}'
|
|
|
|
;
|
|
|
|
|
|
|
|
channel_end:
|
|
|
|
{
|
|
|
|
if (!this_channel->table)
|
|
|
|
cf_error("Routing table not specified");
|
|
|
|
|
|
|
|
this_channel = NULL;
|
|
|
|
};
|
|
|
|
|
|
|
|
proto_channel: channel_start channel_opt_list channel_end;
|
|
|
|
|
|
|
|
|
2022-09-01 12:21:56 +00:00
|
|
|
rtable: CF_SYM_KNOWN {
|
|
|
|
cf_assert_symbol($1, SYM_TABLE);
|
|
|
|
if (!$1->table) rt_new_default_table($1);
|
|
|
|
$$ = $1->table;
|
|
|
|
} ;
|
2016-01-26 10:48:58 +00:00
|
|
|
|
1999-04-05 20:15:31 +00:00
|
|
|
imexport:
|
|
|
|
FILTER filter { $$ = $2; }
|
2000-04-01 09:17:33 +00:00
|
|
|
| where_filter
|
1999-04-05 20:15:31 +00:00
|
|
|
| ALL { $$ = FILTER_ACCEPT; }
|
|
|
|
| NONE { $$ = FILTER_REJECT; }
|
1998-11-27 21:09:57 +00:00
|
|
|
;
|
|
|
|
|
2012-04-15 13:28:29 +00:00
|
|
|
limit_action:
|
2012-04-24 21:39:57 +00:00
|
|
|
/* default */ { $$ = PLA_DISABLE; }
|
2012-04-28 11:03:48 +00:00
|
|
|
| ACTION WARN { $$ = PLA_WARN; }
|
|
|
|
| ACTION BLOCK { $$ = PLA_BLOCK; }
|
|
|
|
| ACTION RESTART { $$ = PLA_RESTART; }
|
|
|
|
| ACTION DISABLE { $$ = PLA_DISABLE; }
|
2012-04-15 13:28:29 +00:00
|
|
|
;
|
|
|
|
|
|
|
|
limit_spec:
|
2016-01-26 10:48:58 +00:00
|
|
|
expr limit_action { $$ = (struct channel_limit){ .limit = $1, $$.action = $2 }; }
|
|
|
|
| OFF { $$ = (struct channel_limit){}; }
|
1999-05-17 20:14:52 +00:00
|
|
|
;
|
|
|
|
|
2017-06-06 14:47:30 +00:00
|
|
|
|
2018-06-26 12:29:03 +00:00
|
|
|
conf: debug_default ;
|
2000-03-07 21:50:03 +00:00
|
|
|
|
|
|
|
debug_default:
|
|
|
|
DEBUG PROTOCOLS debug_mask { new_config->proto_default_debug = $3; }
|
2020-12-07 21:19:40 +00:00
|
|
|
| DEBUG CHANNELS debug_mask { new_config->channel_default_debug = $3; }
|
2000-05-29 22:10:18 +00:00
|
|
|
| DEBUG COMMANDS expr { new_config->cli_debug = $3; }
|
2022-08-30 17:40:58 +00:00
|
|
|
| DEBUG TABLES debug_mask { new_config->table_debug = $3; }
|
2000-03-07 21:50:03 +00:00
|
|
|
;
|
|
|
|
|
2010-01-03 11:17:52 +00:00
|
|
|
/* MRTDUMP PROTOCOLS is in systep/unix/config.Y */
|
|
|
|
|
2018-06-26 12:29:03 +00:00
|
|
|
conf: timeformat_base ;
|
2017-06-06 14:47:30 +00:00
|
|
|
|
|
|
|
timeformat_which:
|
|
|
|
ROUTE { $$ = &new_config->tf_route; }
|
|
|
|
| PROTOCOL { $$ = &new_config->tf_proto; }
|
|
|
|
| BASE { $$ = &new_config->tf_base; }
|
|
|
|
| LOG { $$ = &new_config->tf_log; }
|
|
|
|
;
|
|
|
|
|
|
|
|
timeformat_spec:
|
|
|
|
timeformat_which TEXT { *$1 = (struct timeformat){$2, NULL, 0}; }
|
|
|
|
| timeformat_which TEXT expr TEXT { *$1 = (struct timeformat){$2, $4, (s64) $3 S_}; }
|
|
|
|
| timeformat_which ISO SHORT { *$1 = TM_ISO_SHORT_S; }
|
|
|
|
| timeformat_which ISO SHORT MS { *$1 = TM_ISO_SHORT_MS; }
|
|
|
|
| timeformat_which ISO SHORT US { *$1 = TM_ISO_SHORT_US; }
|
|
|
|
| timeformat_which ISO LONG { *$1 = TM_ISO_LONG_S; }
|
|
|
|
| timeformat_which ISO LONG MS { *$1 = TM_ISO_LONG_MS; }
|
|
|
|
| timeformat_which ISO LONG US { *$1 = TM_ISO_LONG_US; }
|
|
|
|
;
|
|
|
|
|
|
|
|
timeformat_base:
|
|
|
|
TIMEFORMAT timeformat_spec ';'
|
|
|
|
;
|
|
|
|
|
1999-08-03 19:30:49 +00:00
|
|
|
/* Interface patterns */
|
|
|
|
|
2009-05-06 20:02:45 +00:00
|
|
|
iface_patt_node_init:
|
|
|
|
/* EMPTY */ {
|
|
|
|
struct iface_patt_node *ipn = cfg_allocz(sizeof(struct iface_patt_node));
|
|
|
|
add_tail(&this_ipatt->ipn_list, NODE ipn);
|
|
|
|
this_ipn = ipn;
|
|
|
|
}
|
|
|
|
;
|
|
|
|
|
|
|
|
iface_patt_node_body:
|
2015-12-24 14:52:03 +00:00
|
|
|
TEXT { this_ipn->pattern = $1; /* this_ipn->prefix stays zero */ }
|
|
|
|
| opttext net_or_ipa { this_ipn->pattern = $1; this_ipn->prefix = $2; }
|
2009-05-06 20:02:45 +00:00
|
|
|
;
|
|
|
|
|
|
|
|
iface_negate:
|
|
|
|
{ this_ipn->positive = 1; }
|
|
|
|
| '-' { this_ipn->positive = 0; }
|
|
|
|
;
|
|
|
|
|
|
|
|
iface_patt_node:
|
2015-12-24 14:52:03 +00:00
|
|
|
iface_patt_node_init iface_negate iface_patt_node_body
|
2009-05-06 20:02:45 +00:00
|
|
|
;
|
|
|
|
|
|
|
|
|
|
|
|
iface_patt_list:
|
|
|
|
iface_patt_node
|
|
|
|
| iface_patt_list ',' iface_patt_node
|
1999-08-03 19:30:49 +00:00
|
|
|
;
|
|
|
|
|
2014-03-30 22:56:44 +00:00
|
|
|
/* For name/mask-only iface patterns */
|
|
|
|
iface_patt_list_nopx: iface_patt_list { iface_patt_check(); }
|
|
|
|
|
2012-12-27 11:56:23 +00:00
|
|
|
iface_patt_init: {
|
|
|
|
/* Generic this_ipatt init */
|
|
|
|
this_ipatt = cfg_allocz(sizeof(struct iface_patt));
|
|
|
|
init_list(&this_ipatt->ipn_list);
|
|
|
|
}
|
|
|
|
;
|
|
|
|
|
|
|
|
iface_patt:
|
|
|
|
iface_patt_init iface_patt_list
|
|
|
|
;
|
|
|
|
|
2013-06-24 14:37:30 +00:00
|
|
|
tos:
|
2017-05-23 15:22:53 +00:00
|
|
|
CLASS expr { $$ = $2 & 0xfc; if ($2 > 255) cf_error("TX class must be in range 0-255"); }
|
|
|
|
| DSCP expr { $$ = ($2 & 0x3f) << 2; if ($2 > 63) cf_error("TX DSCP must be in range 0-63"); }
|
2013-06-24 14:37:30 +00:00
|
|
|
;
|
2009-05-06 20:02:45 +00:00
|
|
|
|
1999-03-26 21:44:38 +00:00
|
|
|
/* Direct device route protocol */
|
1998-11-29 22:03:58 +00:00
|
|
|
|
2018-06-26 12:29:03 +00:00
|
|
|
proto: dev_proto '}' ;
|
1998-11-29 22:03:58 +00:00
|
|
|
|
1999-03-26 21:44:38 +00:00
|
|
|
dev_proto_start: proto_start DIRECT {
|
2015-02-21 20:08:23 +00:00
|
|
|
this_proto = proto_config_new(&proto_device, $1);
|
2011-11-06 23:31:23 +00:00
|
|
|
init_list(&DIRECT_CFG->iface_list);
|
2021-06-19 18:50:18 +00:00
|
|
|
this_proto->late_if_feed = 1;
|
1998-11-29 22:03:58 +00:00
|
|
|
}
|
|
|
|
;
|
|
|
|
|
|
|
|
dev_proto:
|
1999-03-26 21:44:38 +00:00
|
|
|
dev_proto_start proto_name '{'
|
1998-11-29 22:03:58 +00:00
|
|
|
| dev_proto proto_item ';'
|
2016-01-26 10:48:58 +00:00
|
|
|
| dev_proto proto_channel ';'
|
2009-05-06 20:02:45 +00:00
|
|
|
| dev_proto dev_iface_patt ';'
|
2016-04-08 13:10:57 +00:00
|
|
|
| dev_proto CHECK LINK bool ';' { DIRECT_CFG->check_link = $4; }
|
1998-11-29 22:03:58 +00:00
|
|
|
;
|
|
|
|
|
2009-05-06 20:02:45 +00:00
|
|
|
dev_iface_init:
|
1999-08-03 19:30:49 +00:00
|
|
|
/* EMPTY */ {
|
2009-05-06 20:02:45 +00:00
|
|
|
this_ipatt = cfg_allocz(sizeof(struct iface_patt));
|
2011-11-06 23:31:23 +00:00
|
|
|
add_tail(&DIRECT_CFG->iface_list, NODE this_ipatt);
|
2009-05-06 20:02:45 +00:00
|
|
|
init_list(&this_ipatt->ipn_list);
|
1998-11-29 22:03:58 +00:00
|
|
|
}
|
|
|
|
;
|
|
|
|
|
2009-05-06 20:02:45 +00:00
|
|
|
dev_iface_patt:
|
|
|
|
INTERFACE dev_iface_init iface_patt_list
|
1999-08-03 19:30:49 +00:00
|
|
|
;
|
|
|
|
|
2000-03-07 20:49:48 +00:00
|
|
|
/* Debug flags */
|
|
|
|
|
|
|
|
debug_mask:
|
|
|
|
ALL { $$ = ~0; }
|
|
|
|
| OFF { $$ = 0; }
|
|
|
|
| '{' debug_list '}' { $$ = $2; }
|
|
|
|
;
|
|
|
|
|
|
|
|
debug_list:
|
|
|
|
debug_flag
|
|
|
|
| debug_list ',' debug_flag { $$ = $1 | $3; }
|
|
|
|
;
|
|
|
|
|
|
|
|
debug_flag:
|
|
|
|
STATES { $$ = D_STATES; }
|
|
|
|
| ROUTES { $$ = D_ROUTES; }
|
|
|
|
| FILTERS { $$ = D_FILTERS; }
|
2000-03-12 20:50:35 +00:00
|
|
|
| INTERFACES { $$ = D_IFACES; }
|
2000-03-07 20:49:48 +00:00
|
|
|
| EVENTS { $$ = D_EVENTS; }
|
|
|
|
| PACKETS { $$ = D_PACKETS; }
|
|
|
|
;
|
|
|
|
|
2010-01-03 11:17:52 +00:00
|
|
|
/* MRTDump flags */
|
|
|
|
|
|
|
|
mrtdump_mask:
|
|
|
|
ALL { $$ = ~0; }
|
|
|
|
| OFF { $$ = 0; }
|
|
|
|
| '{' mrtdump_list '}' { $$ = $2; }
|
|
|
|
;
|
|
|
|
|
|
|
|
mrtdump_list:
|
|
|
|
mrtdump_flag
|
|
|
|
| mrtdump_list ',' mrtdump_flag { $$ = $1 | $3; }
|
|
|
|
;
|
|
|
|
|
|
|
|
mrtdump_flag:
|
|
|
|
STATES { $$ = MD_STATES; }
|
|
|
|
| MESSAGES { $$ = MD_MESSAGES; }
|
|
|
|
;
|
|
|
|
|
1999-08-03 19:30:49 +00:00
|
|
|
/* Password lists */
|
|
|
|
|
2008-11-08 16:24:23 +00:00
|
|
|
password_list:
|
2021-06-06 17:10:33 +00:00
|
|
|
password_list_body
|
|
|
|
;
|
|
|
|
|
|
|
|
password_list_body:
|
2008-11-08 16:24:23 +00:00
|
|
|
PASSWORDS '{' password_items '}'
|
|
|
|
| password_item
|
|
|
|
;
|
|
|
|
|
2016-09-19 14:01:29 +00:00
|
|
|
password_items:
|
2004-06-26 20:11:14 +00:00
|
|
|
/* empty */
|
|
|
|
| password_item ';' password_items
|
|
|
|
;
|
|
|
|
|
|
|
|
password_item:
|
2021-04-15 02:38:49 +00:00
|
|
|
password_item_begin '{' password_item_params '}' password_item_end
|
|
|
|
| password_item_begin password_item_end
|
2004-06-26 20:11:14 +00:00
|
|
|
;
|
|
|
|
|
2021-06-09 17:54:01 +00:00
|
|
|
pass_key: PASSWORD | KEY;
|
|
|
|
|
2004-06-26 20:11:14 +00:00
|
|
|
password_item_begin:
|
2021-06-09 17:54:01 +00:00
|
|
|
pass_key text { init_password_list(); init_password($2, strlen($2), password_id++); }
|
|
|
|
| pass_key BYTESTRING { init_password_list(); init_password($2->data, $2->length, password_id++); }
|
2004-06-26 20:11:14 +00:00
|
|
|
;
|
1999-05-26 14:24:57 +00:00
|
|
|
|
2004-06-26 20:11:14 +00:00
|
|
|
password_item_params:
|
2016-05-12 14:04:47 +00:00
|
|
|
/* empty */ { }
|
2017-06-06 14:47:30 +00:00
|
|
|
| GENERATE FROM time ';' password_item_params { this_p_item->genfrom = $3; }
|
|
|
|
| GENERATE TO time ';' password_item_params { this_p_item->gento = $3; }
|
|
|
|
| ACCEPT FROM time ';' password_item_params { this_p_item->accfrom = $3; }
|
|
|
|
| ACCEPT TO time ';' password_item_params { this_p_item->accto = $3; }
|
|
|
|
| FROM time ';' password_item_params { this_p_item->genfrom = this_p_item->accfrom = $2; }
|
|
|
|
| TO time ';' password_item_params { this_p_item->gento = this_p_item->accto = $2; }
|
2020-05-19 00:50:47 +00:00
|
|
|
| ID expr ';' password_item_params { this_p_item->id = $2; if ($2 > 255) cf_error("Password ID must be in range 0-255"); }
|
2016-01-26 15:45:13 +00:00
|
|
|
| ALGORITHM password_algorithm ';' password_item_params { this_p_item->alg = $2; }
|
1999-05-26 14:24:57 +00:00
|
|
|
;
|
|
|
|
|
2016-01-26 15:45:13 +00:00
|
|
|
password_algorithm:
|
|
|
|
KEYED MD5 { $$ = ALG_MD5; }
|
|
|
|
| KEYED SHA1 { $$ = ALG_SHA1; }
|
|
|
|
| KEYED SHA256 { $$ = ALG_SHA256; }
|
|
|
|
| KEYED SHA384 { $$ = ALG_SHA384; }
|
|
|
|
| KEYED SHA512 { $$ = ALG_SHA512; }
|
|
|
|
| HMAC MD5 { $$ = ALG_HMAC_MD5; }
|
|
|
|
| HMAC SHA1 { $$ = ALG_HMAC_SHA1; }
|
|
|
|
| HMAC SHA256 { $$ = ALG_HMAC_SHA256; }
|
|
|
|
| HMAC SHA384 { $$ = ALG_HMAC_SHA384; }
|
|
|
|
| HMAC SHA512 { $$ = ALG_HMAC_SHA512; }
|
2021-04-10 15:33:28 +00:00
|
|
|
| BLAKE2S128 { $$ = ALG_BLAKE2S_128; }
|
|
|
|
| BLAKE2S256 { $$ = ALG_BLAKE2S_256; }
|
|
|
|
| BLAKE2B256 { $$ = ALG_BLAKE2B_256; }
|
|
|
|
| BLAKE2B512 { $$ = ALG_BLAKE2B_512; }
|
2016-01-26 15:45:13 +00:00
|
|
|
;
|
2009-08-16 20:36:41 +00:00
|
|
|
|
2021-04-15 02:38:49 +00:00
|
|
|
password_item_end:
|
|
|
|
{
|
|
|
|
password_validate_length(this_p_item);
|
|
|
|
};
|
|
|
|
|
2020-11-08 14:33:22 +00:00
|
|
|
|
|
|
|
/* BFD options */
|
|
|
|
|
|
|
|
bfd_item:
|
|
|
|
INTERVAL expr_us { this_bfd_opts->min_rx_int = this_bfd_opts->min_tx_int = $2; }
|
|
|
|
| MIN RX INTERVAL expr_us { this_bfd_opts->min_rx_int = $4; }
|
|
|
|
| MIN TX INTERVAL expr_us { this_bfd_opts->min_tx_int = $4; }
|
|
|
|
| IDLE TX INTERVAL expr_us { this_bfd_opts->idle_tx_int = $4; }
|
|
|
|
| MULTIPLIER expr { this_bfd_opts->multiplier = $2; }
|
|
|
|
| PASSIVE bool { this_bfd_opts->passive = $2; this_bfd_opts->passive_set = 1; }
|
|
|
|
| GRACEFUL { this_bfd_opts->mode = BGP_BFD_GRACEFUL; }
|
|
|
|
;
|
|
|
|
|
|
|
|
bfd_items:
|
|
|
|
/* empty */
|
|
|
|
| bfd_items bfd_item ';'
|
|
|
|
;
|
|
|
|
|
|
|
|
bfd_opts:
|
2020-11-12 03:02:38 +00:00
|
|
|
'{' bfd_items '}'
|
2020-11-08 14:33:22 +00:00
|
|
|
;
|
|
|
|
|
Parse CLI commands. We use the same parser as for configuration files (because
we want to allow filter and similar complex constructs to be used in commands
and we should avoid code duplication), only with CLI_MARKER token prepended
before the whole input.
Defined macro CF_CLI(cmd, args, help) for defining CLI commands in .Y files.
The first argument specifies the command itself, the remaining two arguments
are copied to the help file (er, will be copied after the help file starts
to exist). This macro automatically creates a skeleton rule for the command,
you only need to append arguments as in:
CF_CLI(STEAL MONEY, <$>, [[Steal <$> US dollars or equivalent in any other currency]]): NUM {
cli_msg(0, "%d$ stolen", $3);
} ;
Also don't forget to reset lexer state between inputs.
1999-10-31 17:47:47 +00:00
|
|
|
/* Core commands */
|
2000-02-17 23:37:16 +00:00
|
|
|
CF_CLI_HELP(SHOW, ..., [[Show status information]])
|
1999-11-25 15:35:30 +00:00
|
|
|
|
2000-01-19 12:30:19 +00:00
|
|
|
CF_CLI(SHOW STATUS,,, [[Show router status]])
|
2002-11-13 08:46:12 +00:00
|
|
|
{ cmd_show_status(); } ;
|
1999-11-25 15:35:30 +00:00
|
|
|
|
2010-06-02 20:20:40 +00:00
|
|
|
CF_CLI(SHOW MEMORY,,, [[Show memory usage]])
|
|
|
|
{ cmd_show_memory(); } ;
|
|
|
|
|
2010-02-19 23:03:31 +00:00
|
|
|
CF_CLI(SHOW PROTOCOLS, proto_patt2, [<protocol> | \"<pattern>\"], [[Show routing protocols]])
|
2010-02-21 08:57:26 +00:00
|
|
|
{ proto_apply_cmd($3, proto_cmd_show, 0, 0); } ;
|
1999-11-30 12:57:14 +00:00
|
|
|
|
2010-02-19 23:03:31 +00:00
|
|
|
CF_CLI(SHOW PROTOCOLS ALL, proto_patt2, [<protocol> | \"<pattern>\"], [[Show routing protocol details]])
|
2010-02-21 08:57:26 +00:00
|
|
|
{ proto_apply_cmd($4, proto_cmd_show, 0, 1); } ;
|
1999-11-25 15:35:30 +00:00
|
|
|
|
2019-01-30 13:03:47 +00:00
|
|
|
optproto:
|
2019-05-17 20:18:49 +00:00
|
|
|
CF_SYM_KNOWN { cf_assert_symbol($1, SYM_PROTO); $$ = $1; }
|
1999-12-01 15:10:21 +00:00
|
|
|
| /* empty */ { $$ = NULL; }
|
|
|
|
;
|
|
|
|
|
1999-11-25 15:35:30 +00:00
|
|
|
CF_CLI(SHOW INTERFACES,,, [[Show network interfaces]])
|
|
|
|
{ if_show(); } ;
|
|
|
|
|
|
|
|
CF_CLI(SHOW INTERFACES SUMMARY,,, [[Show summary of network interfaces]])
|
|
|
|
{ if_show_summary(); } ;
|
|
|
|
|
2012-03-22 10:46:38 +00:00
|
|
|
CF_CLI_HELP(SHOW ROUTE, ..., [[Show routing table]])
|
2023-03-18 14:33:48 +00:00
|
|
|
CF_CLI(SHOW ROUTE, r_args, [[[<prefix>|for <prefix>|for <ip>|in <prefix>] [table <t>] [(import|export) table <p>.<c>] [filter <f>|where <cond>] [all] [primary] [filtered] [(export|preexport|noexport) <p>] [protocol <p>] [stats|count]]], [[Show routing table]])
|
1999-12-01 15:10:21 +00:00
|
|
|
{ rt_show($3); } ;
|
|
|
|
|
|
|
|
r_args:
|
|
|
|
/* empty */ {
|
|
|
|
$$ = cfg_allocz(sizeof(struct rt_show_data));
|
2017-04-25 17:02:31 +00:00
|
|
|
init_list(&($$->tables));
|
1999-12-01 15:10:21 +00:00
|
|
|
$$->filter = FILTER_ACCEPT;
|
2022-05-02 18:29:03 +00:00
|
|
|
$$->running_on_config = config;
|
2022-06-24 13:27:26 +00:00
|
|
|
$$->cli = this_cli;
|
1999-12-01 15:10:21 +00:00
|
|
|
}
|
2015-12-11 14:35:37 +00:00
|
|
|
| r_args net_any {
|
1999-12-01 15:10:21 +00:00
|
|
|
$$ = $1;
|
2015-12-24 14:52:03 +00:00
|
|
|
if ($$->addr) cf_error("Only one prefix expected");
|
|
|
|
$$->addr = $2;
|
2022-06-27 17:53:06 +00:00
|
|
|
$$->addr_mode = TE_ADDR_EQUAL;
|
1999-12-01 15:10:21 +00:00
|
|
|
}
|
2017-04-18 11:45:50 +00:00
|
|
|
| r_args FOR r_args_for {
|
2000-05-13 11:42:42 +00:00
|
|
|
$$ = $1;
|
2015-12-24 14:52:03 +00:00
|
|
|
if ($$->addr) cf_error("Only one prefix expected");
|
2017-04-18 11:45:50 +00:00
|
|
|
$$->addr = $3;
|
2022-06-27 17:53:06 +00:00
|
|
|
$$->addr_mode = TE_ADDR_FOR;
|
2000-05-13 11:42:42 +00:00
|
|
|
}
|
2021-12-02 01:22:30 +00:00
|
|
|
| r_args IN net_any {
|
|
|
|
$$ = $1;
|
|
|
|
if ($$->addr) cf_error("Only one prefix expected");
|
|
|
|
if (!net_type_match($3, NB_IP)) cf_error("Only IP networks accepted for 'in' argument");
|
|
|
|
$$->addr = $3;
|
2022-06-27 17:53:06 +00:00
|
|
|
$$->addr_mode = TE_ADDR_IN;
|
2021-12-02 01:22:30 +00:00
|
|
|
}
|
2022-05-04 10:24:30 +00:00
|
|
|
| r_args TABLE symbol_known {
|
2019-05-17 20:18:49 +00:00
|
|
|
cf_assert_symbol($3, SYM_TABLE);
|
2022-09-01 12:21:56 +00:00
|
|
|
if (!$3->table) cf_error("Table %s not configured", $3->name);
|
1999-12-01 15:10:21 +00:00
|
|
|
$$ = $1;
|
2019-02-15 12:53:17 +00:00
|
|
|
rt_show_add_table($$, $3->table->table);
|
2017-03-30 11:52:01 +00:00
|
|
|
$$->tables_defined_by = RSD_TDB_DIRECT;
|
|
|
|
}
|
|
|
|
| r_args TABLE ALL {
|
|
|
|
struct rtable_config *t;
|
|
|
|
$$ = $1;
|
|
|
|
WALK_LIST(t, config->tables)
|
|
|
|
rt_show_add_table($$, t->table);
|
|
|
|
$$->tables_defined_by = RSD_TDB_ALL;
|
1999-12-01 15:10:21 +00:00
|
|
|
}
|
2020-12-07 21:19:40 +00:00
|
|
|
| r_args IMPORT TABLE channel_arg {
|
2022-06-16 21:24:56 +00:00
|
|
|
if (!($4->in_keep & RIK_PREFILTER)) cf_error("No import table in channel %s.%s", $4->proto->name, $4->name);
|
2022-09-07 11:54:20 +00:00
|
|
|
RT_LOCKED($4->table, tab)
|
|
|
|
rt_show_add_exporter($$, &tab->exporter.e, "import")->prefilter = $4;
|
2018-09-27 20:57:55 +00:00
|
|
|
$$->tables_defined_by = RSD_TDB_DIRECT;
|
|
|
|
}
|
2020-12-07 21:19:40 +00:00
|
|
|
| r_args EXPORT TABLE channel_arg {
|
|
|
|
if (!$4->out_table) cf_error("No export table in channel %s.%s", $4->proto->name, $4->name);
|
2022-06-20 17:10:49 +00:00
|
|
|
rt_show_add_exporter($$, $4->out_table, "export");
|
2019-08-13 16:22:07 +00:00
|
|
|
$$->tables_defined_by = RSD_TDB_DIRECT;
|
|
|
|
}
|
1999-12-01 15:10:21 +00:00
|
|
|
| r_args FILTER filter {
|
|
|
|
$$ = $1;
|
1999-12-02 14:04:44 +00:00
|
|
|
if ($$->filter != FILTER_ACCEPT) cf_error("Filter specified twice");
|
1999-12-01 15:10:21 +00:00
|
|
|
$$->filter = $3;
|
|
|
|
}
|
1999-12-02 14:04:44 +00:00
|
|
|
| r_args where_filter {
|
|
|
|
$$ = $1;
|
|
|
|
if ($$->filter != FILTER_ACCEPT) cf_error("Filter specified twice");
|
|
|
|
$$->filter = $2;
|
|
|
|
}
|
1999-12-01 15:10:21 +00:00
|
|
|
| r_args ALL {
|
|
|
|
$$ = $1;
|
|
|
|
$$->verbose = 1;
|
|
|
|
}
|
2000-05-06 22:57:39 +00:00
|
|
|
| r_args PRIMARY {
|
|
|
|
$$ = $1;
|
|
|
|
$$->primary_only = 1;
|
|
|
|
}
|
2012-11-15 00:29:01 +00:00
|
|
|
| r_args FILTERED {
|
2012-11-10 13:26:13 +00:00
|
|
|
$$ = $1;
|
2012-11-15 00:29:01 +00:00
|
|
|
$$->filtered = 1;
|
2012-11-10 13:26:13 +00:00
|
|
|
}
|
2022-05-04 10:24:30 +00:00
|
|
|
| r_args export_mode symbol_known {
|
2019-05-17 20:18:49 +00:00
|
|
|
cf_assert_symbol($3, SYM_PROTO);
|
2019-02-15 12:53:17 +00:00
|
|
|
struct proto_config *c = (struct proto_config *) $3->proto;
|
2000-05-06 22:57:39 +00:00
|
|
|
$$ = $1;
|
2017-04-25 17:02:31 +00:00
|
|
|
if ($$->export_mode) cf_error("Export specified twice");
|
2019-01-30 13:03:47 +00:00
|
|
|
if (!c->proto) cf_error("%s is not a protocol", $3->name);
|
2009-05-22 15:12:15 +00:00
|
|
|
$$->export_mode = $2;
|
|
|
|
$$->export_protocol = c->proto;
|
2017-03-30 11:52:01 +00:00
|
|
|
$$->tables_defined_by = RSD_TDB_INDIRECT;
|
2000-05-06 22:57:39 +00:00
|
|
|
}
|
2020-12-07 21:19:40 +00:00
|
|
|
| r_args export_mode channel_arg {
|
2017-04-25 17:02:31 +00:00
|
|
|
$$ = $1;
|
|
|
|
if ($$->export_mode) cf_error("Export specified twice");
|
|
|
|
$$->export_mode = $2;
|
2020-12-07 21:19:40 +00:00
|
|
|
$$->export_channel = $3;
|
2017-04-25 17:02:31 +00:00
|
|
|
$$->tables_defined_by = RSD_TDB_INDIRECT;
|
|
|
|
}
|
2022-05-04 10:24:30 +00:00
|
|
|
| r_args PROTOCOL symbol_known {
|
2019-05-17 20:18:49 +00:00
|
|
|
cf_assert_symbol($3, SYM_PROTO);
|
2019-02-15 12:53:17 +00:00
|
|
|
struct proto_config *c = (struct proto_config *) $3->proto;
|
2009-05-11 00:01:11 +00:00
|
|
|
$$ = $1;
|
|
|
|
if ($$->show_protocol) cf_error("Protocol specified twice");
|
2019-01-30 13:03:47 +00:00
|
|
|
if (!c->proto) cf_error("%s is not a protocol", $3->name);
|
2009-05-11 00:01:11 +00:00
|
|
|
$$->show_protocol = c->proto;
|
2017-03-30 11:52:01 +00:00
|
|
|
$$->tables_defined_by = RSD_TDB_INDIRECT;
|
2000-05-06 22:57:39 +00:00
|
|
|
}
|
2000-05-07 11:28:59 +00:00
|
|
|
| r_args STATS {
|
|
|
|
$$ = $1;
|
|
|
|
$$->stats = 1;
|
|
|
|
}
|
2000-05-08 14:58:00 +00:00
|
|
|
| r_args COUNT {
|
|
|
|
$$ = $1;
|
|
|
|
$$->stats = 2;
|
|
|
|
}
|
2000-05-06 22:57:39 +00:00
|
|
|
;
|
|
|
|
|
2017-04-18 11:45:50 +00:00
|
|
|
r_args_for:
|
|
|
|
r_args_for_val {
|
|
|
|
$$ = cfg_alloc($1.length);
|
|
|
|
net_copy($$, &$1);
|
|
|
|
}
|
|
|
|
| net_vpn4_
|
|
|
|
| net_vpn6_
|
2018-02-13 15:27:57 +00:00
|
|
|
| net_ip6_sadr_
|
2017-04-18 11:45:50 +00:00
|
|
|
| VPN_RD IP4 {
|
|
|
|
$$ = cfg_alloc(sizeof(net_addr_vpn4));
|
|
|
|
net_fill_vpn4($$, $2, IP4_MAX_PREFIX_LENGTH, $1);
|
|
|
|
}
|
|
|
|
| VPN_RD IP6 {
|
|
|
|
$$ = cfg_alloc(sizeof(net_addr_vpn6));
|
|
|
|
net_fill_vpn6($$, $2, IP6_MAX_PREFIX_LENGTH, $1);
|
|
|
|
}
|
2018-02-13 15:27:57 +00:00
|
|
|
| IP6 FROM IP6 {
|
|
|
|
$$ = cfg_alloc(sizeof(net_addr_ip6_sadr));
|
|
|
|
net_fill_ip6_sadr($$, $1, IP6_MAX_PREFIX_LENGTH, $3, IP6_MAX_PREFIX_LENGTH);
|
|
|
|
}
|
2019-05-17 20:18:49 +00:00
|
|
|
| CF_SYM_KNOWN {
|
2017-04-18 11:45:50 +00:00
|
|
|
if ($1->class == (SYM_CONSTANT | T_IP))
|
|
|
|
{
|
|
|
|
$$ = cfg_alloc(ipa_is_ip4(SYM_VAL($1).ip) ? sizeof(net_addr_ip4) : sizeof(net_addr_ip6));
|
|
|
|
net_fill_ip_host($$, SYM_VAL($1).ip);
|
|
|
|
}
|
|
|
|
else if (($1->class == (SYM_CONSTANT | T_NET)) && net_type_match(SYM_VAL($1).net, NB_IP | NB_VPN))
|
2017-04-28 22:36:35 +00:00
|
|
|
$$ = (net_addr *) SYM_VAL($1).net; /* Avoid const warning */
|
2017-04-18 11:45:50 +00:00
|
|
|
else
|
2019-05-17 20:18:49 +00:00
|
|
|
cf_error("IP address or network constant expected");
|
2017-04-18 11:45:50 +00:00
|
|
|
}
|
|
|
|
;
|
|
|
|
|
|
|
|
r_args_for_val:
|
|
|
|
net_ip4_
|
|
|
|
| net_ip6_
|
|
|
|
| IP4 { net_fill_ip4(&($$), $1, IP4_MAX_PREFIX_LENGTH); }
|
|
|
|
| IP6 { net_fill_ip6(&($$), $1, IP6_MAX_PREFIX_LENGTH); }
|
|
|
|
|
2014-10-02 10:46:26 +00:00
|
|
|
export_mode:
|
|
|
|
PREEXPORT { $$ = RSEM_PREEXPORT; }
|
|
|
|
| EXPORT { $$ = RSEM_EXPORT; }
|
|
|
|
| NOEXPORT { $$ = RSEM_NOEXPORT; }
|
2019-09-09 00:55:32 +00:00
|
|
|
| EXPORTED { $$ = RSEM_EXPORTED; }
|
1999-12-01 15:10:21 +00:00
|
|
|
;
|
|
|
|
|
2017-04-25 17:02:31 +00:00
|
|
|
/* This is ugly hack */
|
2020-12-07 21:19:40 +00:00
|
|
|
channel_sym:
|
2017-04-25 17:02:31 +00:00
|
|
|
IPV4 { $$ = "ipv4"; }
|
|
|
|
| IPV4_MC { $$ = "ipv4-mc"; }
|
|
|
|
| IPV4_MPLS { $$ = "ipv4-mpls"; }
|
|
|
|
| IPV6 { $$ = "ipv6"; }
|
|
|
|
| IPV6_MC { $$ = "ipv6-mc"; }
|
|
|
|
| IPV6_MPLS { $$ = "ipv6-mpls"; }
|
2018-02-13 15:27:57 +00:00
|
|
|
| IPV6_SADR { $$ = "ipv6-sadr"; }
|
2017-04-25 17:02:31 +00:00
|
|
|
| VPN4 { $$ = "vpn4"; }
|
|
|
|
| VPN4_MC { $$ = "vpn4-mc"; }
|
|
|
|
| VPN4_MPLS { $$ = "vpn4-mpls"; }
|
|
|
|
| VPN6 { $$ = "vpn6"; }
|
|
|
|
| VPN6_MC { $$ = "vpn6-mc"; }
|
|
|
|
| VPN6_MPLS { $$ = "vpn6-mpls"; }
|
|
|
|
| ROA4 { $$ = "roa4"; }
|
|
|
|
| ROA6 { $$ = "roa6"; }
|
|
|
|
| FLOW4 { $$ = "flow4"; }
|
|
|
|
| FLOW6 { $$ = "flow6"; }
|
|
|
|
| MPLS { $$ = "mpls"; }
|
|
|
|
| PRI { $$ = "pri"; }
|
|
|
|
| SEC { $$ = "sec"; }
|
|
|
|
;
|
2012-03-18 16:32:30 +00:00
|
|
|
|
2020-12-07 21:19:40 +00:00
|
|
|
channel_arg:
|
|
|
|
CF_SYM_KNOWN '.' channel_sym {
|
|
|
|
cf_assert_symbol($1, SYM_PROTO);
|
|
|
|
struct proto *p = $1->proto->proto;
|
|
|
|
if (!p) cf_error("%s is not a protocol", $1->name);
|
|
|
|
$$ = proto_find_channel_by_name(p, $3);
|
|
|
|
if (!$$) cf_error("Channel %s.%s not found", $1->name, $3);
|
|
|
|
}
|
|
|
|
;
|
|
|
|
|
2012-03-22 10:46:38 +00:00
|
|
|
CF_CLI_HELP(SHOW SYMBOLS, ..., [[Show all known symbolic names]])
|
2015-12-11 14:35:37 +00:00
|
|
|
CF_CLI(SHOW SYMBOLS, sym_args, [table|filter|function|protocol|template|<symbol>], [[Show all known symbolic names]])
|
2000-01-19 12:30:19 +00:00
|
|
|
{ cmd_show_symbols($3); } ;
|
|
|
|
|
2012-03-16 11:47:12 +00:00
|
|
|
sym_args:
|
|
|
|
/* empty */ {
|
|
|
|
$$ = cfg_allocz(sizeof(struct sym_show_data));
|
|
|
|
}
|
|
|
|
| sym_args TABLE { $$ = $1; $$->type = SYM_TABLE; }
|
|
|
|
| sym_args FUNCTION { $$ = $1; $$->type = SYM_FUNCTION; }
|
|
|
|
| sym_args FILTER { $$ = $1; $$->type = SYM_FILTER; }
|
|
|
|
| sym_args PROTOCOL { $$ = $1; $$->type = SYM_PROTO; }
|
|
|
|
| sym_args TEMPLATE { $$ = $1; $$->type = SYM_TEMPLATE; }
|
2019-01-30 13:03:47 +00:00
|
|
|
| sym_args symbol { $$ = $1; $$->sym = $2; }
|
2012-03-16 11:47:12 +00:00
|
|
|
;
|
|
|
|
|
2012-03-18 16:32:30 +00:00
|
|
|
|
2000-03-07 20:49:48 +00:00
|
|
|
CF_CLI_HELP(DUMP, ..., [[Dump debugging information]])
|
|
|
|
CF_CLI(DUMP RESOURCES,,, [[Dump all allocated resource]])
|
2023-02-28 09:42:47 +00:00
|
|
|
{ rdump(&root_pool, 0); cli_msg(0, ""); } ;
|
2000-03-07 20:49:48 +00:00
|
|
|
CF_CLI(DUMP SOCKETS,,, [[Dump open sockets]])
|
1999-12-06 12:34:45 +00:00
|
|
|
{ sk_dump_all(); cli_msg(0, ""); } ;
|
2015-03-02 08:41:14 +00:00
|
|
|
CF_CLI(DUMP EVENTS,,, [[Dump event log]])
|
|
|
|
{ io_log_dump(); cli_msg(0, ""); } ;
|
2000-03-07 20:49:48 +00:00
|
|
|
CF_CLI(DUMP INTERFACES,,, [[Dump interface information]])
|
1999-12-06 12:34:45 +00:00
|
|
|
{ if_dump_all(); cli_msg(0, ""); } ;
|
2000-03-07 20:49:48 +00:00
|
|
|
CF_CLI(DUMP NEIGHBORS,,, [[Dump neighbor cache]])
|
1999-12-06 12:34:45 +00:00
|
|
|
{ neigh_dump_all(); cli_msg(0, ""); } ;
|
2000-03-07 20:49:48 +00:00
|
|
|
CF_CLI(DUMP ATTRIBUTES,,, [[Dump attribute cache]])
|
2022-05-30 10:03:03 +00:00
|
|
|
{ ea_dump_all(); cli_msg(0, ""); } ;
|
2021-06-21 15:07:31 +00:00
|
|
|
CF_CLI(DUMP ROUTES,,, [[Dump routes]])
|
1999-12-06 12:34:45 +00:00
|
|
|
{ rt_dump_all(); cli_msg(0, ""); } ;
|
2021-06-21 15:07:31 +00:00
|
|
|
CF_CLI(DUMP TABLES,,, [[Dump table connections]])
|
|
|
|
{ rt_dump_hooks_all(); cli_msg(0, ""); } ;
|
2000-03-07 20:49:48 +00:00
|
|
|
CF_CLI(DUMP PROTOCOLS,,, [[Dump protocol information]])
|
1999-12-06 12:34:45 +00:00
|
|
|
{ protos_dump_all(); cli_msg(0, ""); } ;
|
2019-07-03 06:13:07 +00:00
|
|
|
CF_CLI(DUMP FILTER ALL,,, [[Dump all filters in linearized form]])
|
|
|
|
{ filters_dump_all(); cli_msg(0, ""); } ;
|
1999-12-06 12:34:45 +00:00
|
|
|
|
2013-07-25 11:15:32 +00:00
|
|
|
CF_CLI(EVAL, term, <expr>, [[Evaluate an expression]])
|
2022-03-09 01:32:29 +00:00
|
|
|
{ cmd_eval(f_linearize($2, 1)); } ;
|
2013-07-25 11:15:32 +00:00
|
|
|
|
2023-10-03 12:07:11 +00:00
|
|
|
partial_opt:
|
|
|
|
PARTIAL term {
|
|
|
|
struct f_val val;
|
|
|
|
if (f_eval(f_linearize($2, 1), &val) > F_RETURN) cf_error("Runtime error");
|
2023-10-25 12:55:46 +00:00
|
|
|
if (val.type != T_PREFIX_SET) cf_error("Partial spec must be prefix set");
|
2023-10-03 12:07:11 +00:00
|
|
|
$$ = val.val.ti;
|
|
|
|
}
|
|
|
|
| /* empty */ { $$ = NULL; }
|
|
|
|
;
|
|
|
|
|
2017-12-07 20:54:47 +00:00
|
|
|
CF_CLI(DISABLE, proto_patt opttext, (<protocol> | \"<pattern>\" | all) [message], [[Disable protocol]])
|
2017-09-19 17:55:37 +00:00
|
|
|
{ proto_apply_cmd($2, proto_cmd_disable, 1, (uintptr_t) $3); } ;
|
2017-12-07 20:54:47 +00:00
|
|
|
CF_CLI(ENABLE, proto_patt opttext, (<protocol> | \"<pattern>\" | all) [message], [[Enable protocol]])
|
2017-09-19 17:55:37 +00:00
|
|
|
{ proto_apply_cmd($2, proto_cmd_enable, 1, (uintptr_t) $3); } ;
|
2017-12-07 20:54:47 +00:00
|
|
|
CF_CLI(RESTART, proto_patt opttext, (<protocol> | \"<pattern>\" | all) [message], [[Restart protocol]])
|
2017-09-19 17:55:37 +00:00
|
|
|
{ proto_apply_cmd($2, proto_cmd_restart, 1, (uintptr_t) $3); } ;
|
2023-10-25 12:55:46 +00:00
|
|
|
CF_CLI(RELOAD, proto_patt partial_opt, (<protocol> | \"<pattern>\" | all) [partial <prefix set>], [[Reload protocol]])
|
2023-10-03 12:07:11 +00:00
|
|
|
{ proto_call_cmd_reload($2, CMD_RELOAD, $3); } ;
|
|
|
|
CF_CLI(RELOAD IN, proto_patt partial_opt, <protocol> | \"<pattern>\" | all, [[Reload protocol (just imported routes)]])
|
|
|
|
{ proto_call_cmd_reload($3, CMD_RELOAD_IN, $4); } ;
|
|
|
|
CF_CLI(RELOAD OUT, proto_patt partial_opt, <protocol> | \"<pattern>\" | all, [[Reload protocol (just exported routes)]])
|
|
|
|
{ proto_call_cmd_reload($3, CMD_RELOAD_OUT, $4); } ;
|
2000-01-16 23:30:06 +00:00
|
|
|
|
2010-01-03 11:17:52 +00:00
|
|
|
CF_CLI_HELP(DEBUG, ..., [[Control protocol debugging via BIRD logs]])
|
2020-12-07 21:19:40 +00:00
|
|
|
CF_CLI(DEBUG, debug_args, (<protocol> | <channel> | \"<pattern>\" | all) (all | off | { states|routes|filters|interfaces|events|packets [, ...] }), [[Control protocol debugging via BIRD logs]])
|
|
|
|
{ /* Done in debug_args */ };
|
|
|
|
|
|
|
|
debug_args:
|
|
|
|
proto_patt debug_mask { proto_apply_cmd($1, proto_cmd_debug, 1, $2); }
|
|
|
|
| channel_arg debug_mask { channel_cmd_debug($1, $2); }
|
|
|
|
;
|
2010-01-03 11:17:52 +00:00
|
|
|
|
|
|
|
CF_CLI_HELP(MRTDUMP, ..., [[Control protocol debugging via MRTdump files]])
|
2016-09-05 09:20:28 +00:00
|
|
|
CF_CLI(MRTDUMP, proto_patt mrtdump_mask, (<protocol> | \"<pattern>\" | all) (all | off | { states|messages [, ...] }), [[Control protocol debugging via MRTdump format]])
|
2010-02-21 08:57:26 +00:00
|
|
|
{ proto_apply_cmd($2, proto_cmd_mrtdump, 1, $3); } ;
|
|
|
|
|
|
|
|
CF_CLI(RESTRICT,,,[[Restrict current CLI session to safe commands]])
|
|
|
|
{ this_cli->restricted = 1; cli_msg(16, "Access restricted"); } ;
|
2000-03-07 20:49:48 +00:00
|
|
|
|
2000-01-16 23:30:06 +00:00
|
|
|
proto_patt:
|
2019-05-17 20:18:49 +00:00
|
|
|
CF_SYM_KNOWN { cf_assert_symbol($1, SYM_PROTO); $$.ptr = $1; $$.patt = 0; }
|
2010-02-19 23:03:31 +00:00
|
|
|
| ALL { $$.ptr = NULL; $$.patt = 1; }
|
|
|
|
| TEXT { $$.ptr = $1; $$.patt = 1; }
|
2000-01-16 23:30:06 +00:00
|
|
|
;
|
|
|
|
|
2010-02-19 23:03:31 +00:00
|
|
|
proto_patt2:
|
2019-05-17 20:18:49 +00:00
|
|
|
CF_SYM_KNOWN { cf_assert_symbol($1, SYM_PROTO); $$.ptr = $1; $$.patt = 0; }
|
2010-02-19 23:03:31 +00:00
|
|
|
| { $$.ptr = NULL; $$.patt = 1; }
|
|
|
|
| TEXT { $$.ptr = $1; $$.patt = 1; }
|
|
|
|
;
|
|
|
|
|
1998-11-27 19:37:57 +00:00
|
|
|
CF_CODE
|
|
|
|
|
|
|
|
CF_END
|