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