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

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

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