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>