Annotation of embedaddon/bird/proto/static/config.Y, revision 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_srt_nh, *last_srt_nh;
        !            17: static struct f_inst **this_srt_last_cmd;
        !            18: 
        !            19: static void
        !            20: static_route_finish(void)
        !            21: {
        !            22:   struct static_route *r;
        !            23: 
        !            24:   /* Update undefined use_bfd entries in multipath nexthops */
        !            25:   if (this_srt->dest == RTD_MULTIPATH)
        !            26:     for (r = this_srt->mp_next; r; r = r->mp_next)
        !            27:       if (r->use_bfd < 0)
        !            28:         r->use_bfd = this_srt->use_bfd;
        !            29: }
        !            30: 
        !            31: CF_DECLS
        !            32: 
        !            33: CF_KEYWORDS(STATIC, ROUTE, VIA, DROP, REJECT, PROHIBIT, PREFERENCE, CHECK, LINK)
        !            34: CF_KEYWORDS(MULTIPATH, WEIGHT, RECURSIVE, IGP, TABLE, BLACKHOLE, UNREACHABLE, BFD)
        !            35: 
        !            36: 
        !            37: CF_GRAMMAR
        !            38: 
        !            39: CF_ADDTO(proto, static_proto '}')
        !            40: 
        !            41: static_proto_start: proto_start STATIC {
        !            42:      this_proto = proto_config_new(&proto_static, $1);
        !            43:      static_init_config((struct static_config *) this_proto);
        !            44:   }
        !            45:  ;
        !            46: 
        !            47: static_proto:
        !            48:    static_proto_start proto_name '{'
        !            49:  | static_proto proto_item ';'
        !            50:  | static_proto CHECK LINK bool ';' { STATIC_CFG->check_link = $4; }
        !            51:  | static_proto IGP TABLE rtable ';' { STATIC_CFG->igp_table = $4; }
        !            52:  | static_proto stat_route stat_route_opt_list ';' { static_route_finish(); }
        !            53:  ;
        !            54: 
        !            55: stat_route0: ROUTE prefix {
        !            56:      this_srt = cfg_allocz(sizeof(struct static_route));
        !            57:      add_tail(&STATIC_CFG->other_routes, &this_srt->n);
        !            58:      this_srt->net = $2.addr;
        !            59:      this_srt->masklen = $2.len;
        !            60:      this_srt_last_cmd = &(this_srt->cmds);
        !            61:   }
        !            62:  ;
        !            63: 
        !            64: stat_multipath1:
        !            65:    VIA ipa ipa_scope {
        !            66:      last_srt_nh = this_srt_nh;
        !            67:      this_srt_nh = cfg_allocz(sizeof(struct static_route));
        !            68:      this_srt_nh->dest = RTD_NONE;
        !            69:      this_srt_nh->via = $2;
        !            70:      this_srt_nh->via_if = $3;
        !            71:      this_srt_nh->if_name = (void *) this_srt; /* really */
        !            72:      this_srt_nh->use_bfd = -1; /* undefined */
        !            73:    }
        !            74:  | stat_multipath1 WEIGHT expr {
        !            75:      this_srt_nh->masklen = $3 - 1; /* really */
        !            76:      if (($3<1) || ($3>256)) cf_error("Weight must be in range 1-256"); 
        !            77:    }
        !            78:  | stat_multipath1 BFD bool {
        !            79:      this_srt_nh->use_bfd = $3; cf_check_bfd($3);
        !            80:    }
        !            81:  ;
        !            82: 
        !            83: stat_multipath:
        !            84:    stat_multipath1 { this_srt->mp_next = this_srt_nh; }
        !            85:  | stat_multipath stat_multipath1 { last_srt_nh->mp_next = this_srt_nh; }
        !            86:  ;
        !            87: 
        !            88: stat_route:
        !            89:    stat_route0 VIA ipa ipa_scope {
        !            90:       this_srt->dest = RTD_ROUTER;
        !            91:       this_srt->via = $3;
        !            92:       this_srt->via_if = $4;
        !            93:    }
        !            94:  | stat_route0 VIA TEXT {
        !            95:       this_srt->dest = RTD_DEVICE;
        !            96:       this_srt->if_name = $3;
        !            97:       rem_node(&this_srt->n);
        !            98:       add_tail(&STATIC_CFG->iface_routes, &this_srt->n);
        !            99:    }
        !           100:  | stat_route0 MULTIPATH stat_multipath {
        !           101:       this_srt->dest = RTD_MULTIPATH;
        !           102:    }
        !           103:  | stat_route0 RECURSIVE ipa {
        !           104:       this_srt->dest = RTDX_RECURSIVE;
        !           105:       this_srt->via = $3;
        !           106:    }
        !           107: 
        !           108:  | stat_route0 DROP            { this_srt->dest = RTD_BLACKHOLE; }
        !           109:  | stat_route0 REJECT          { this_srt->dest = RTD_UNREACHABLE; }
        !           110:  | stat_route0 BLACKHOLE       { this_srt->dest = RTD_BLACKHOLE; }
        !           111:  | stat_route0 UNREACHABLE     { this_srt->dest = RTD_UNREACHABLE; }
        !           112:  | stat_route0 PROHIBIT                { this_srt->dest = RTD_PROHIBIT; }
        !           113:  ;
        !           114: 
        !           115: stat_route_item:
        !           116:    cmd { *this_srt_last_cmd = $1; this_srt_last_cmd = &($1->next); }
        !           117:  | BFD bool ';' { this_srt->use_bfd = $2; cf_check_bfd($2); }
        !           118:  ;
        !           119: 
        !           120: stat_route_opts:
        !           121:    /* empty */
        !           122:  | stat_route_opts stat_route_item
        !           123:  ;
        !           124: 
        !           125: stat_route_opt_list:
        !           126:    /* empty */
        !           127:  | '{' stat_route_opts '}'
        !           128:  ;
        !           129: 
        !           130: 
        !           131: CF_CLI(SHOW STATIC, optsym, [<name>], [[Show details of static protocol]])
        !           132: { static_show(proto_get_named($3, &proto_static)); } ;
        !           133: 
        !           134: CF_CODE
        !           135: 
        !           136: CF_END

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