Return to config.Y CVS log | Up to [ELWIX - Embedded LightWeight unIX -] / embedaddon / bird / proto / radv |
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