File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / bird / proto / radv / config.Y
Revision 1.1.1.2 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Wed Mar 17 19:50:23 2021 UTC (3 years, 4 months ago) by misho
Branches: bird, MAIN
CVS tags: v1_6_8p3, HEAD
bird 1.6.8

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

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