Annotation of embedaddon/bird2/proto/radv/config.Y, revision 1.1.1.1

1.1       misho       1: /*
                      2:  *     BIRD -- Router Advertisement Configuration
                      3:  *
                      4:  *     (c) 2011--2019 Ondrej Zajicek <santiago@crfreenet.org>
                      5:  *     (c) 2011--2019 CZ.NIC z.s.p.o.
                      6:  *
                      7:  *     Can be freely distributed and used under the terms of the GNU GPL.
                      8:  */
                      9: 
                     10: CF_HDR
                     11: 
                     12: #include "proto/radv/radv.h"
                     13: 
                     14: CF_DEFINES
                     15: 
                     16: #define RADV_CFG ((struct radv_config *) this_proto)
                     17: #define RADV_IFACE ((struct radv_iface_config *) this_ipatt)
                     18: #define RADV_PREFIX this_radv_prefix
                     19: #define RADV_RDNSS (&this_radv_rdnss)
                     20: #define RADV_DNSSL (&this_radv_dnssl)
                     21: 
                     22: static struct radv_prefix_config *this_radv_prefix;
                     23: static struct radv_rdnss_config this_radv_rdnss;
                     24: static struct radv_dnssl_config this_radv_dnssl;
                     25: static list radv_dns_list;     /* Used by radv_rdnss and radv_dnssl */
                     26: static u8 radv_mult_val;       /* Used by radv_mult for second return value */
                     27: 
                     28: 
                     29: CF_DECLS
                     30: 
                     31: CF_KEYWORDS(RADV, PREFIX, INTERFACE, MIN, MAX, RA, DELAY, INTERVAL, SOLICITED,
                     32:        UNICAST, MANAGED, OTHER, CONFIG, LINGER, LINK, MTU, REACHABLE, TIME,
                     33:        RETRANS, TIMER, CURRENT, HOP, LIMIT, DEFAULT, VALID, PREFERRED, MULT,
                     34:        LIFETIME, SKIP, ONLINK, AUTONOMOUS, RDNSS, DNSSL, NS, DOMAIN, LOCAL,
                     35:        TRIGGER, SENSITIVE, PREFERENCE, LOW, MEDIUM, HIGH, PROPAGATE, ROUTE,
                     36:        ROUTES, RA_PREFERENCE, RA_LIFETIME)
                     37: 
                     38: CF_ENUM(T_ENUM_RA_PREFERENCE, RA_PREF_, LOW, MEDIUM, HIGH)
                     39: 
                     40: %type<i> radv_mult radv_sensitive radv_preference
                     41: 
                     42: CF_GRAMMAR
                     43: 
                     44: proto: radv_proto ;
                     45: 
                     46: radv_proto_start: proto_start RADV
                     47: {
                     48:   this_proto = proto_config_new(&proto_radv, $1);
                     49: 
                     50:   init_list(&RADV_CFG->patt_list);
                     51:   init_list(&RADV_CFG->pref_list);
                     52:   init_list(&RADV_CFG->rdnss_list);
                     53:   init_list(&RADV_CFG->dnssl_list);
                     54: };
                     55: 
                     56: radv_proto_item:
                     57:    proto_item
                     58:  | proto_channel
                     59:  | INTERFACE radv_iface
                     60:  | PREFIX radv_prefix { add_tail(&RADV_CFG->pref_list, NODE this_radv_prefix); }
                     61:  | RDNSS { init_list(&radv_dns_list); } radv_rdnss { add_tail_list(&RADV_CFG->rdnss_list, &radv_dns_list); }
                     62:  | DNSSL { init_list(&radv_dns_list); } radv_dnssl { add_tail_list(&RADV_CFG->dnssl_list, &radv_dns_list); }
                     63:  | TRIGGER net_ip6 { RADV_CFG->trigger = $2; }
                     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 = (u32) -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 = (u32) -1;
                     89:   RADV_IFACE->route_linger_time = (u32) -1;
                     90:   RADV_IFACE->current_hop_limit = DEFAULT_CURRENT_HOP_LIMIT;
                     91:   RADV_IFACE->default_lifetime = (u32) -1;
                     92:   RADV_IFACE->default_lifetime_sensitive = 1;
                     93:   RADV_IFACE->default_preference = RA_PREF_MEDIUM;
                     94:   RADV_IFACE->route_lifetime = (u32) -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:  | SOLICITED RA UNICAST bool { RADV_IFACE->solicited_ra_unicast = $4; }
                    104:  | MANAGED bool { RADV_IFACE->managed = $2; }
                    105:  | OTHER CONFIG bool { RADV_IFACE->other_config = $3; }
                    106:  | LINK MTU expr { RADV_IFACE->link_mtu = $3; }
                    107:  | REACHABLE TIME expr { RADV_IFACE->reachable_time = $3; if ($3 > 3600000) cf_error("Reachable time must be in range 0-3600000"); }
                    108:  | RETRANS TIMER expr { RADV_IFACE->retrans_timer = $3; }
                    109:  | CURRENT HOP LIMIT expr { RADV_IFACE->current_hop_limit = $4; if ($4 > 255) cf_error("Current hop limit must be in range 0-255"); }
                    110:  | DEFAULT LIFETIME expr radv_sensitive {
                    111:      RADV_IFACE->default_lifetime = $3;
                    112:      if ($3 > 9000)  cf_error("Default lifetime must be in range 0-9000");
                    113:      if ($4 != (uint) -1) RADV_IFACE->default_lifetime_sensitive = $4;
                    114:    }
                    115:  | ROUTE LIFETIME expr radv_sensitive {
                    116:      RADV_IFACE->route_lifetime = $3;
                    117:      if ($4 != (uint) -1) RADV_IFACE->route_lifetime_sensitive = $4;
                    118:    }
                    119:  | DEFAULT PREFERENCE radv_preference { RADV_IFACE->default_preference = $3; }
                    120:  | ROUTE PREFERENCE radv_preference { RADV_IFACE->route_preference = $3; }
                    121:  | PREFIX LINGER TIME expr { RADV_IFACE->prefix_linger_time = $4; }
                    122:  | ROUTE LINGER TIME expr { RADV_IFACE->route_linger_time = $4; }
                    123:  | PREFIX radv_prefix { add_tail(&RADV_IFACE->pref_list, NODE this_radv_prefix); }
                    124:  | RDNSS { init_list(&radv_dns_list); } radv_rdnss { add_tail_list(&RADV_IFACE->rdnss_list, &radv_dns_list); }
                    125:  | DNSSL { init_list(&radv_dns_list); } radv_dnssl { add_tail_list(&RADV_IFACE->dnssl_list, &radv_dns_list); }
                    126:  | RDNSS LOCAL bool { RADV_IFACE->rdnss_local = $3; }
                    127:  | DNSSL LOCAL bool { RADV_IFACE->dnssl_local = $3; }
                    128:  ;
                    129: 
                    130: radv_preference:
                    131:    LOW { $$ = RA_PREF_LOW; }
                    132:  | MEDIUM { $$ = RA_PREF_MEDIUM; }
                    133:  | HIGH { $$ = RA_PREF_HIGH; }
                    134: 
                    135: radv_iface_finish:
                    136: {
                    137:   struct radv_iface_config *ic = RADV_IFACE;
                    138: 
                    139:   if (ic->min_ra_int == (u32) -1)
                    140:     ic->min_ra_int = MAX_(ic->max_ra_int / 3, 3);
                    141: 
                    142:   if (ic->default_lifetime == (u32) -1)
                    143:     ic->default_lifetime = 3 * ic->max_ra_int;
                    144: 
                    145:   if (ic->route_lifetime == (u32) -1)
                    146:     ic->route_lifetime = 3 * ic->max_ra_int;
                    147: 
                    148:   if (ic->prefix_linger_time == (u32) -1)
                    149:     ic->prefix_linger_time = 3 * ic->max_ra_int;
                    150: 
                    151:   if (ic->route_linger_time == (u32) -1)
                    152:     ic->route_linger_time = 3 * ic->max_ra_int;
                    153: 
                    154:   if ((ic->min_ra_int > 3) &&
                    155:       (ic->min_ra_int > (ic->max_ra_int * 3 / 4)))
                    156:     cf_error("Min RA interval must be at most 3/4 * Max RA interval");
                    157: 
                    158:   if ((ic->default_lifetime > 0) && (ic->default_lifetime < ic->max_ra_int))
                    159:     cf_error("Default lifetime must be either 0 or at least Max RA interval");
                    160: 
                    161:   if ((ic->route_lifetime > 0) && (ic->route_lifetime < ic->max_ra_int))
                    162:     cf_error("Route lifetime must be either 0 or at least Max RA interval");
                    163: 
                    164:   if ((ic->prefix_linger_time > 0) && (ic->prefix_linger_time < ic->max_ra_int))
                    165:     cf_error("Prefix linger time must be either 0 or at least Max RA interval");
                    166: 
                    167:   if ((ic->route_linger_time > 0) && (ic->route_linger_time < ic->max_ra_int))
                    168:     cf_error("Route linger time must be either 0 or at least Max RA interval");
                    169: 
                    170:   RADV_CFG->max_linger_time = MAX_(RADV_CFG->max_linger_time, ic->route_linger_time);
                    171: };
                    172: 
                    173: 
                    174: radv_iface_opts:
                    175:    /* empty */
                    176:  | radv_iface_opts radv_iface_item ';'
                    177:  ;
                    178: 
                    179: radv_iface_opt_list:
                    180:    /* empty */
                    181:  | '{' radv_iface_opts '}'
                    182:  ;
                    183: 
                    184: radv_iface:
                    185:   radv_iface_start iface_patt_list_nopx radv_iface_opt_list radv_iface_finish;
                    186: 
                    187: 
                    188: radv_prefix_start: net_ip6
                    189: {
                    190:   this_radv_prefix = cfg_allocz(sizeof(struct radv_prefix_config));
                    191:   RADV_PREFIX->prefix = *(net_addr_ip6 *) &($1);
                    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 != (uint) -1) RADV_PREFIX->valid_lifetime_sensitive = $4;
                    206:    }
                    207:  | PREFERRED LIFETIME expr radv_sensitive {
                    208:      RADV_PREFIX->preferred_lifetime = $3;
                    209:      if ($4 != (uint) -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 */ { $$ = (uint) -1; }
                    335:  | SENSITIVE bool { $$ = $2; }
                    336:  ;
                    337: 
                    338: dynamic_attr: RA_PREFERENCE { $$ = f_new_dynamic_attr(EAF_TYPE_INT, T_ENUM_RA_PREFERENCE, EA_RA_PREFERENCE); } ;
                    339: 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>