Return to config.Y CVS log | Up to [ELWIX - Embedded LightWeight unIX -] / embedaddon / bird / proto / bfd |
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/bfd/bfd.h" ! 11: ! 12: CF_DEFINES ! 13: ! 14: #define BFD_CFG ((struct bfd_config *) this_proto) ! 15: #define BFD_IFACE ((struct bfd_iface_config *) this_ipatt) ! 16: #define BFD_NEIGHBOR this_bfd_neighbor ! 17: ! 18: static struct bfd_neighbor *this_bfd_neighbor; ! 19: ! 20: extern struct bfd_config *bfd_cf; ! 21: ! 22: CF_DECLS ! 23: ! 24: CF_KEYWORDS(BFD, MIN, IDLE, RX, TX, INTERVAL, MULTIPLIER, PASSIVE, ! 25: INTERFACE, MULTIHOP, NEIGHBOR, DEV, LOCAL, AUTHENTICATION, ! 26: NONE, SIMPLE, METICULOUS, KEYED, MD5, SHA1) ! 27: ! 28: %type <iface> bfd_neigh_iface ! 29: %type <a> bfd_neigh_local ! 30: %type <i> bfd_neigh_multihop bfd_auth_type ! 31: ! 32: CF_GRAMMAR ! 33: ! 34: CF_ADDTO(proto, bfd_proto) ! 35: ! 36: bfd_proto_start: proto_start BFD ! 37: { ! 38: this_proto = proto_config_new(&proto_bfd, $1); ! 39: init_list(&BFD_CFG->patt_list); ! 40: init_list(&BFD_CFG->neigh_list); ! 41: ! 42: if (bfd_cf) ! 43: cf_error("Only one BFD instance allowed"); ! 44: bfd_cf = BFD_CFG; ! 45: }; ! 46: ! 47: bfd_proto_item: ! 48: proto_item ! 49: | INTERFACE bfd_iface ! 50: | MULTIHOP bfd_multihop ! 51: | NEIGHBOR bfd_neighbor ! 52: ; ! 53: ! 54: bfd_proto_opts: ! 55: /* empty */ ! 56: | bfd_proto_opts bfd_proto_item ';' ! 57: ; ! 58: ! 59: bfd_proto: ! 60: bfd_proto_start proto_name '{' bfd_proto_opts '}'; ! 61: ! 62: ! 63: bfd_iface_start: ! 64: { ! 65: this_ipatt = cfg_allocz(sizeof(struct bfd_iface_config)); ! 66: add_tail(&BFD_CFG->patt_list, NODE this_ipatt); ! 67: init_list(&this_ipatt->ipn_list); ! 68: ! 69: BFD_IFACE->min_rx_int = BFD_DEFAULT_MIN_RX_INT; ! 70: BFD_IFACE->min_tx_int = BFD_DEFAULT_MIN_TX_INT; ! 71: BFD_IFACE->idle_tx_int = BFD_DEFAULT_IDLE_TX_INT; ! 72: BFD_IFACE->multiplier = BFD_DEFAULT_MULTIPLIER; ! 73: ! 74: reset_passwords(); ! 75: }; ! 76: ! 77: bfd_iface_finish: ! 78: { ! 79: BFD_IFACE->passwords = get_passwords(); ! 80: ! 81: if (!BFD_IFACE->auth_type != !BFD_IFACE->passwords) ! 82: log(L_WARN "Authentication and password options should be used together"); ! 83: ! 84: if (BFD_IFACE->passwords) ! 85: { ! 86: struct password_item *pass; ! 87: WALK_LIST(pass, *BFD_IFACE->passwords) ! 88: { ! 89: if (pass->alg) ! 90: cf_error("Password algorithm option not available in BFD protocol"); ! 91: ! 92: pass->alg = bfd_auth_type_to_hash_alg[BFD_IFACE->auth_type]; ! 93: } ! 94: } ! 95: }; ! 96: ! 97: bfd_iface_item: ! 98: INTERVAL expr_us { BFD_IFACE->min_rx_int = BFD_IFACE->min_tx_int = $2; } ! 99: | MIN RX INTERVAL expr_us { BFD_IFACE->min_rx_int = $4; } ! 100: | MIN TX INTERVAL expr_us { BFD_IFACE->min_tx_int = $4; } ! 101: | IDLE TX INTERVAL expr_us { BFD_IFACE->idle_tx_int = $4; } ! 102: | MULTIPLIER expr { BFD_IFACE->multiplier = $2; } ! 103: | PASSIVE bool { BFD_IFACE->passive = $2; } ! 104: | AUTHENTICATION bfd_auth_type { BFD_IFACE->auth_type = $2; } ! 105: | password_list {} ! 106: ; ! 107: ! 108: bfd_auth_type: ! 109: NONE { $$ = BFD_AUTH_NONE; } ! 110: | SIMPLE { $$ = BFD_AUTH_SIMPLE; } ! 111: | KEYED MD5 { $$ = BFD_AUTH_KEYED_MD5; } ! 112: | KEYED SHA1 { $$ = BFD_AUTH_KEYED_SHA1; } ! 113: | METICULOUS KEYED MD5 { $$ = BFD_AUTH_METICULOUS_KEYED_MD5; } ! 114: | METICULOUS KEYED SHA1 { $$ = BFD_AUTH_METICULOUS_KEYED_SHA1; } ! 115: ; ! 116: ! 117: bfd_iface_opts: ! 118: /* empty */ ! 119: | bfd_iface_opts bfd_iface_item ';' ! 120: ; ! 121: ! 122: bfd_iface_opt_list: ! 123: /* empty */ ! 124: | '{' bfd_iface_opts '}' ! 125: ; ! 126: ! 127: bfd_iface: ! 128: bfd_iface_start iface_patt_list_nopx bfd_iface_opt_list bfd_iface_finish; ! 129: ! 130: bfd_multihop: ! 131: bfd_iface_start bfd_iface_opt_list bfd_iface_finish ! 132: { BFD_CFG->multihop = BFD_IFACE; }; ! 133: ! 134: ! 135: bfd_neigh_iface: ! 136: /* empty */ { $$ = NULL; } ! 137: | '%' SYM { $$ = if_get_by_name($2->name); } ! 138: | DEV text { $$ = if_get_by_name($2); } ! 139: ; ! 140: ! 141: bfd_neigh_local: ! 142: /* empty */ { $$ = IPA_NONE; } ! 143: | LOCAL ipa { $$ = $2; } ! 144: ; ! 145: ! 146: bfd_neigh_multihop: ! 147: /* empty */ { $$ = 0; } ! 148: | MULTIHOP bool { $$ = $2; } ! 149: ; ! 150: ! 151: bfd_neighbor: ipa bfd_neigh_iface bfd_neigh_local bfd_neigh_multihop ! 152: { ! 153: this_bfd_neighbor = cfg_allocz(sizeof(struct bfd_neighbor)); ! 154: add_tail(&BFD_CFG->neigh_list, NODE this_bfd_neighbor); ! 155: ! 156: BFD_NEIGHBOR->addr = $1; ! 157: BFD_NEIGHBOR->local = $3; ! 158: BFD_NEIGHBOR->iface = $2; ! 159: BFD_NEIGHBOR->multihop = $4; ! 160: ! 161: if ($4 && $2) ! 162: cf_error("Neighbor cannot set both interface and multihop"); ! 163: ! 164: if ($4 && ipa_zero($3)) ! 165: cf_error("Multihop neighbor requires specified local address"); ! 166: }; ! 167: ! 168: ! 169: CF_CLI_HELP(SHOW BFD, ..., [[Show information about BFD protocol]]); ! 170: CF_CLI(SHOW BFD SESSIONS, optsym, [<name>], [[Show information about BFD sessions]]) ! 171: { bfd_show_sessions(proto_get_named($4, &proto_bfd)); }; ! 172: ! 173: CF_CODE ! 174: ! 175: CF_END