File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / bird2 / proto / rip / config.Y
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Mon Oct 21 16:03:57 2019 UTC (5 years, 2 months ago) by misho
Branches: bird2, MAIN
CVS tags: v2_0_7p0, HEAD
bird2 ver 2.0.7

    1: /*
    2:  *	BIRD -- RIP Configuration
    3:  *
    4:  *	(c) 1998--1999 Pavel Machek <pavel@ucw.cz>
    5:  *	(c) 2004--2013 Ondrej Filip <feela@network.cz>
    6:  *	(c) 2009--2015 Ondrej Zajicek <santiago@crfreenet.org>
    7:  *	(c) 2009--2015 CZ.NIC z.s.p.o.
    8:  *
    9:  *	Can be freely distributed and used under the terms of the GNU GPL.
   10:  */
   11: 
   12: CF_HDR
   13: 
   14: #include "proto/rip/rip.h"
   15: #include "nest/iface.h"
   16: 
   17: CF_DEFINES
   18: 
   19: #define RIP_CFG ((struct rip_config *) this_proto)
   20: #define RIP_IFACE ((struct rip_iface_config *) this_ipatt)
   21: 
   22: static inline int rip_cfg_is_v2(void) { return RIP_CFG->rip2; }
   23: static inline int rip_cfg_is_ng(void) { return ! RIP_CFG->rip2; }
   24: 
   25: static inline void
   26: rip_check_auth(void)
   27: {
   28:   if (rip_cfg_is_ng())
   29:     cf_error("Authentication not supported in RIPng");
   30: }
   31: 
   32: 
   33: CF_DECLS
   34: 
   35: CF_KEYWORDS(RIP, NG, ECMP, LIMIT, WEIGHT, INFINITY, METRIC, UPDATE, TIMEOUT,
   36: 	    GARBAGE, PORT, ADDRESS, MODE, BROADCAST, MULTICAST, PASSIVE,
   37: 	    VERSION, SPLIT, HORIZON, POISON, REVERSE, CHECK, ZERO, TIME, BFD,
   38: 	    AUTHENTICATION, NONE, PLAINTEXT, CRYPTOGRAPHIC, MD5, TTL, SECURITY,
   39: 	    RX, TX, BUFFER, LENGTH, PRIORITY, ONLY, LINK, RIP_METRIC, RIP_TAG)
   40: 
   41: %type <i> rip_variant rip_auth
   42: 
   43: CF_GRAMMAR
   44: 
   45: proto: rip_proto ;
   46: 
   47: rip_variant:
   48:    RIP    { $$ = 1; }
   49:  | RIP NG { $$ = 0; }
   50:  ;
   51: 
   52: rip_proto_start: proto_start rip_variant
   53: {
   54:   this_proto = proto_config_new(&proto_rip, $1);
   55:   this_proto->net_type = $2 ? NET_IP4 : NET_IP6;
   56: 
   57:   init_list(&RIP_CFG->patt_list);
   58:   RIP_CFG->rip2 = $2;
   59:   RIP_CFG->ecmp = rt_default_ecmp;
   60:   RIP_CFG->infinity = RIP_DEFAULT_INFINITY;
   61:   RIP_CFG->min_timeout_time = 60 S_;
   62:   RIP_CFG->max_garbage_time = 60 S_;
   63: };
   64: 
   65: rip_proto_item:
   66:    proto_item
   67:  | proto_channel
   68:  | ECMP bool		{ RIP_CFG->ecmp = $2 ? RIP_DEFAULT_ECMP_LIMIT : 0; }
   69:  | ECMP bool LIMIT expr	{ RIP_CFG->ecmp = $2 ? $4 : 0; }
   70:  | INFINITY expr	{ RIP_CFG->infinity = $2; }
   71:  | INTERFACE rip_iface
   72:  ;
   73: 
   74: rip_proto_opts:
   75:    /* empty */
   76:  | rip_proto_opts rip_proto_item ';'
   77:  ;
   78: 
   79: rip_proto:
   80:    rip_proto_start proto_name '{' rip_proto_opts '}';
   81: 
   82: 
   83: rip_iface_start:
   84: {
   85:   this_ipatt = cfg_allocz(sizeof(struct rip_iface_config));
   86:   add_tail(&RIP_CFG->patt_list, NODE this_ipatt);
   87:   init_list(&this_ipatt->ipn_list);
   88:   reset_passwords();
   89: 
   90:   RIP_IFACE->metric = 1;
   91:   RIP_IFACE->port = rip_cfg_is_v2() ? RIP_PORT : RIP_NG_PORT;
   92:   RIP_IFACE->version = rip_cfg_is_v2() ? RIP_V2 : RIP_V1;
   93:   RIP_IFACE->split_horizon = 1;
   94:   RIP_IFACE->poison_reverse = 1;
   95:   RIP_IFACE->check_zero = 1;
   96:   RIP_IFACE->check_link = 1;
   97:   RIP_IFACE->ttl_security = rip_cfg_is_v2() ? 0 : 1;
   98:   RIP_IFACE->rx_buffer = rip_cfg_is_v2() ? RIP_MAX_PKT_LENGTH : 0;
   99:   RIP_IFACE->tx_length = rip_cfg_is_v2() ? RIP_MAX_PKT_LENGTH : 0;
  100:   RIP_IFACE->tx_tos = IP_PREC_INTERNET_CONTROL;
  101:   RIP_IFACE->tx_priority = sk_priority_control;
  102:   RIP_IFACE->update_time = RIP_DEFAULT_UPDATE_TIME;
  103:   RIP_IFACE->timeout_time = RIP_DEFAULT_TIMEOUT_TIME;
  104:   RIP_IFACE->garbage_time = RIP_DEFAULT_GARBAGE_TIME;
  105: };
  106: 
  107: rip_iface_finish:
  108: {
  109:   /* Default mode is broadcast for RIPv1, multicast for RIPv2 and RIPng */
  110:   if (!RIP_IFACE->mode)
  111:     RIP_IFACE->mode = (rip_cfg_is_v2() && (RIP_IFACE->version == RIP_V1)) ?
  112:       RIP_IM_BROADCAST : RIP_IM_MULTICAST;
  113: 
  114:   RIP_IFACE->passwords = get_passwords();
  115: 
  116:   if (!RIP_IFACE->auth_type != !RIP_IFACE->passwords)
  117:     log(L_WARN "Authentication and password options should be used together");
  118: 
  119:   if (RIP_IFACE->passwords)
  120:   {
  121:     struct password_item *pass;
  122:     WALK_LIST(pass, *RIP_IFACE->passwords)
  123:     {
  124:       if (pass->alg && (RIP_IFACE->auth_type != RIP_AUTH_CRYPTO))
  125: 	cf_error("Password algorithm option requires cryptographic authentication");
  126: 
  127:       /* Set default crypto algorithm (MD5) */
  128:       if (!pass->alg && (RIP_IFACE->auth_type == RIP_AUTH_CRYPTO))
  129: 	pass->alg = ALG_MD5;
  130:     }
  131:   }
  132: 
  133:   RIP_CFG->min_timeout_time = MIN_(RIP_CFG->min_timeout_time, RIP_IFACE->timeout_time);
  134:   RIP_CFG->max_garbage_time = MAX_(RIP_CFG->max_garbage_time, RIP_IFACE->garbage_time);
  135: };
  136: 
  137: rip_iface_item:
  138:    METRIC expr		{ RIP_IFACE->metric = $2; if (($2<1) || ($2>255)) cf_error("Metric must be in range 1-255"); }
  139:  | MODE MULTICAST	{ RIP_IFACE->mode = RIP_IM_MULTICAST; }
  140:  | MODE BROADCAST	{ RIP_IFACE->mode = RIP_IM_BROADCAST; if (rip_cfg_is_ng()) cf_error("Broadcast not supported in RIPng"); }
  141:  | PASSIVE bool		{ RIP_IFACE->passive = $2; }
  142:  | ADDRESS ipa		{ RIP_IFACE->address = $2; if (ipa_is_ip4($2) != rip_cfg_is_v2()) cf_error("IP address version mismatch"); }
  143:  | PORT expr		{ RIP_IFACE->port = $2; if (($2<1) || ($2>65535)) cf_error("Invalid port number"); }
  144:  | VERSION expr		{ RIP_IFACE->version = $2;
  145: 			  if (rip_cfg_is_ng()) cf_error("Version not supported in RIPng");
  146: 			  if (($2 != RIP_V1) && ($2 != RIP_V2)) cf_error("Unsupported version");
  147: 			}
  148:  | VERSION ONLY bool	{ RIP_IFACE->version_only = $3; }
  149:  | SPLIT HORIZON bool	{ RIP_IFACE->split_horizon = $3; }
  150:  | POISON REVERSE bool	{ RIP_IFACE->poison_reverse = $3; }
  151:  | CHECK ZERO bool	{ RIP_IFACE->check_zero = $3; }
  152:  | UPDATE TIME expr	{ RIP_IFACE->update_time = $3 S_; if ($3<=0) cf_error("Update time must be positive"); }
  153:  | TIMEOUT TIME expr	{ RIP_IFACE->timeout_time = $3 S_; if ($3<=0) cf_error("Timeout time must be positive"); }
  154:  | GARBAGE TIME expr	{ RIP_IFACE->garbage_time = $3 S_; if ($3<=0) cf_error("Garbage time must be positive"); }
  155:  | ECMP WEIGHT expr	{ RIP_IFACE->ecmp_weight = $3 - 1; if (($3<1) || ($3>256)) cf_error("ECMP weight must be in range 1-256"); }
  156:  | RX BUFFER expr	{ RIP_IFACE->rx_buffer = $3; if (($3<256) || ($3>65535)) cf_error("RX length must be in range 256-65535"); }
  157:  | TX LENGTH expr	{ RIP_IFACE->tx_length = $3; if (($3<256) || ($3>65535)) cf_error("TX length must be in range 256-65535"); }
  158:  | TX tos		{ RIP_IFACE->tx_tos = $2; }
  159:  | TX PRIORITY expr	{ RIP_IFACE->tx_priority = $3; }
  160:  | TTL SECURITY bool	{ RIP_IFACE->ttl_security = $3; }
  161:  | TTL SECURITY TX ONLY	{ RIP_IFACE->ttl_security = 2; }
  162:  | CHECK LINK bool	{ RIP_IFACE->check_link = $3; }
  163:  | BFD bool		{ RIP_IFACE->bfd = $2; cf_check_bfd($2); }
  164:  | AUTHENTICATION rip_auth { RIP_IFACE->auth_type = $2; if ($2) rip_check_auth(); }
  165:  | password_list	{ rip_check_auth(); }
  166: ;
  167: 
  168: rip_auth:
  169:    NONE			{ $$ = RIP_AUTH_NONE; }
  170:  | PLAINTEXT		{ $$ = RIP_AUTH_PLAIN; }
  171:  | CRYPTOGRAPHIC	{ $$ = RIP_AUTH_CRYPTO; }
  172:  | MD5			{ $$ = RIP_AUTH_CRYPTO; }	/* For backward compatibility */
  173:  ;
  174: 
  175: rip_iface_opts:
  176:    /* empty */
  177:  | rip_iface_opts rip_iface_item ';'
  178:  ;
  179: 
  180: rip_iface_opt_list:
  181:    /* empty */
  182:  | '{' rip_iface_opts '}'
  183:  ;
  184: 
  185: rip_iface:
  186:   rip_iface_start iface_patt_list_nopx rip_iface_opt_list rip_iface_finish;
  187: 
  188: 
  189: dynamic_attr: RIP_METRIC { $$ = f_new_dynamic_attr(EAF_TYPE_INT, T_INT, EA_RIP_METRIC); } ;
  190: dynamic_attr: RIP_TAG { $$ = f_new_dynamic_attr(EAF_TYPE_INT, T_INT, EA_RIP_TAG); } ;
  191: 
  192: CF_CLI_HELP(SHOW RIP, ..., [[Show information about RIP protocol]]);
  193: 
  194: CF_CLI(SHOW RIP INTERFACES, optproto opttext, [<name>] [\"<interface>\"], [[Show information about RIP interfaces]])
  195: { rip_show_interfaces(proto_get_named($4, &proto_rip), $5); };
  196: 
  197: CF_CLI(SHOW RIP NEIGHBORS, optproto opttext, [<name>] [\"<interface>\"], [[Show information about RIP neighbors]])
  198: { rip_show_neighbors(proto_get_named($4, &proto_rip), $5); };
  199: 
  200: 
  201: CF_CODE
  202: 
  203: CF_END

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>