Annotation of embedaddon/bird/proto/bfd/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/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

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