File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / bird / proto / bfd / config.Y
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Tue Aug 22 12:33:54 2017 UTC (6 years, 10 months ago) by misho
Branches: bird, MAIN
CVS tags: v1_6_3p0, v1_6_3, HEAD
bird 1.6.3

    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>