Annotation of embedaddon/bird2/proto/radv/config.Y, revision 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>