Annotation of embedaddon/bird2/proto/static/config.Y, revision 1.1.1.1

1.1       misho       1: /*
                      2:  *     BIRD -- Static Protocol Configuration
                      3:  *
                      4:  *     (c) 1998--1999 Martin Mares <mj@ucw.cz>
                      5:  *
                      6:  *     Can be freely distributed and used under the terms of the GNU GPL.
                      7:  */
                      8: 
                      9: CF_HDR
                     10: 
                     11: #include "proto/static/static.h"
                     12: 
                     13: CF_DEFINES
                     14: 
                     15: #define STATIC_CFG ((struct static_config *) this_proto)
                     16: static struct static_route *this_srt, *this_snh;
                     17: static struct f_inst *this_srt_cmds, *this_srt_last_cmd;
                     18: 
                     19: static struct static_route *
                     20: static_nexthop_new(void)
                     21: {
                     22:   struct static_route *nh = this_srt;
                     23: 
                     24:   if (this_snh)
                     25:   {
                     26:     /* Additional next hop */
                     27:     nh = cfg_allocz(sizeof(struct static_route));
                     28:     nh->net = this_srt->net;
                     29:     this_snh->mp_next = nh;
                     30:   }
                     31: 
                     32:   nh->dest = RTD_UNICAST;
                     33:   nh->mp_head = this_srt;
                     34:   return nh;
                     35: };
                     36: 
                     37: static void
                     38: static_route_finish(void)
                     39: {
                     40:   if (net_type_match(this_srt->net, NB_DEST) == !this_srt->dest)
                     41:     cf_error("Unexpected or missing nexthop/type");
                     42: 
                     43:   this_srt->cmds = f_linearize(this_srt_cmds);
                     44: }
                     45: 
                     46: CF_DECLS
                     47: 
                     48: CF_KEYWORDS(STATIC, ROUTE, VIA, DROP, REJECT, PROHIBIT, PREFERENCE, CHECK, LINK)
                     49: CF_KEYWORDS(ONLINK, WEIGHT, RECURSIVE, IGP, TABLE, BLACKHOLE, UNREACHABLE, BFD, MPLS)
                     50: 
                     51: 
                     52: CF_GRAMMAR
                     53: 
                     54: proto: static_proto '}' ;
                     55: 
                     56: static_proto_start: proto_start STATIC
                     57: {
                     58:   this_proto = proto_config_new(&proto_static, $1);
                     59:   init_list(&STATIC_CFG->routes);
                     60: };
                     61: 
                     62: static_proto:
                     63:    static_proto_start proto_name '{'
                     64:  | static_proto proto_item ';'
                     65:  | static_proto proto_channel ';' { this_proto->net_type = $2->net_type; }
                     66:  | static_proto CHECK LINK bool ';' { STATIC_CFG->check_link = $4; }
                     67:  | static_proto IGP TABLE rtable ';' {
                     68:     if ($4->addr_type == NET_IP4)
                     69:       STATIC_CFG->igp_table_ip4 = $4;
                     70:     else if ($4->addr_type == NET_IP6)
                     71:       STATIC_CFG->igp_table_ip6 = $4;
                     72:     else
                     73:       cf_error("Incompatible IGP table type");
                     74:    }
                     75:  | static_proto stat_route stat_route_opt_list ';' { static_route_finish(); }
                     76:  ;
                     77: 
                     78: stat_nexthop:
                     79:     VIA ipa ipa_scope {
                     80:       this_snh = static_nexthop_new();
                     81:       this_snh->via = $2;
                     82:       this_snh->iface = $3;
                     83:     }
                     84:   | VIA TEXT {
                     85:       this_snh = static_nexthop_new();
                     86:       this_snh->via = IPA_NONE;
                     87:       this_snh->iface = if_get_by_name($2);
                     88:     }
                     89:   | stat_nexthop MPLS label_stack {
                     90:     this_snh->mls = $3;
                     91:   }
                     92:   | stat_nexthop ONLINK bool {
                     93:     this_snh->onlink = $3;
                     94:   }
                     95:   | stat_nexthop WEIGHT expr {
                     96:     this_snh->weight = $3 - 1;
                     97:     if (($3<1) || ($3>256)) cf_error("Weight must be in range 1-256");
                     98:   }
                     99:   | stat_nexthop BFD bool {
                    100:     this_snh->use_bfd = $3; cf_check_bfd($3);
                    101:   }
                    102: ;
                    103: 
                    104: stat_nexthops:
                    105:     stat_nexthop
                    106:   | stat_nexthops stat_nexthop
                    107: ;
                    108: 
                    109: stat_route0: ROUTE net_any {
                    110:      this_srt = cfg_allocz(sizeof(struct static_route));
                    111:      add_tail(&STATIC_CFG->routes, &this_srt->n);
                    112:      this_srt->net = $2;
                    113:      this_srt_cmds = NULL;
                    114:      this_srt_last_cmd = NULL;
                    115:      this_srt->mp_next = NULL;
                    116:      this_snh = NULL;
                    117:   }
                    118:  ;
                    119: 
                    120: stat_route:
                    121:    stat_route0 stat_nexthops
                    122:  | stat_route0 RECURSIVE ipa {
                    123:       this_srt->dest = RTDX_RECURSIVE;
                    124:       this_srt->via = $3;
                    125:    }
                    126:  | stat_route0 RECURSIVE ipa MPLS label_stack {
                    127:       this_srt->dest = RTDX_RECURSIVE;
                    128:       this_srt->via = $3;
                    129:       this_srt->mls = $5;
                    130:    }
                    131:  | stat_route0                 { this_srt->dest = RTD_NONE; }
                    132:  | stat_route0 DROP            { this_srt->dest = RTD_BLACKHOLE; }
                    133:  | stat_route0 REJECT          { this_srt->dest = RTD_UNREACHABLE; }
                    134:  | stat_route0 BLACKHOLE       { this_srt->dest = RTD_BLACKHOLE; }
                    135:  | stat_route0 UNREACHABLE     { this_srt->dest = RTD_UNREACHABLE; }
                    136:  | stat_route0 PROHIBIT                { this_srt->dest = RTD_PROHIBIT; }
                    137:  ;
                    138: 
                    139: stat_route_item:
                    140:    cmd {
                    141:      if (this_srt_last_cmd)
                    142:        this_srt_last_cmd->next = $1;
                    143:      else
                    144:        this_srt_cmds = $1;
                    145:      this_srt_last_cmd = $1;
                    146:    }
                    147:  ;
                    148: 
                    149: stat_route_opts:
                    150:    /* empty */
                    151:  | stat_route_opts stat_route_item
                    152:  ;
                    153: 
                    154: stat_route_opt_list:
                    155:    /* empty */
                    156:  | '{' stat_route_opts '}'
                    157:  ;
                    158: 
                    159: 
                    160: CF_CLI(SHOW STATIC, optproto, [<name>], [[Show details of static protocol]])
                    161: { static_show(proto_get_named($3, &proto_static)); } ;
                    162: 
                    163: CF_CODE
                    164: 
                    165: CF_END

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