]> git.ipfire.org Git - thirdparty/bird.git/blame - proto/bgp/config.Y
Direct: Fixes behavior for the same routes on different interfaces
[thirdparty/bird.git] / proto / bgp / config.Y
CommitLineData
2638249d
MM
1/*
2 * BIRD -- Border Gateway Protocol Configuration
3 *
4 * (c) 2000 Martin Mares <mj@ucw.cz>
5 *
6 * Can be freely distributed and used under the terms of the GNU GPL.
7 */
8
9CF_HDR
10
11#include "proto/bgp/bgp.h"
12
cea63664
MM
13CF_DEFINES
14
2638249d
MM
15#define BGP_CFG ((struct bgp_config *) this_proto)
16
17CF_DECLS
18
087cecd0
OZ
19CF_KEYWORDS(BGP, LOCAL, NEIGHBOR, AS, HOLD, TIME, CONNECT, RETRY,
20 KEEPALIVE, MULTIHOP, STARTUP, VIA, NEXT, HOP, SELF, DEFAULT,
21 PATH, METRIC, ERROR, START, DELAY, FORGET, WAIT, ENABLE,
22 DISABLE, AFTER, BGP_PATH, BGP_LOCAL_PREF, BGP_MED, BGP_ORIGIN,
23 BGP_NEXT_HOP, BGP_ATOMIC_AGGR, BGP_AGGREGATOR, BGP_COMMUNITY,
42a0c054
OZ
24 BGP_EXT_COMMUNITY, SOURCE, ADDRESS, PASSWORD, RR, RS, CLIENT,
25 CLUSTER, ID, AS4, ADVERTISE, IPV4, CAPABILITIES, LIMIT, PASSIVE,
26 PREFER, OLDER, MISSING, LLADDR, DROP, IGNORE, ROUTE, REFRESH,
27 INTERPRET, COMMUNITIES, BGP_ORIGINATOR_ID, BGP_CLUSTER_LIST, IGP,
00a09f3c 28 TABLE, GATEWAY, DIRECT, RECURSIVE, MED, TTL, SECURITY, DETERMINISTIC,
523f020b 29 SECONDARY, ALLOW, BFD, ADD, PATHS, RX, TX, GRACEFUL, RESTART, AWARE,
a1beb8f3 30 CHECK, LINK, PORT)
2638249d
MM
31
32CF_GRAMMAR
33
a7f23f58 34CF_ADDTO(proto, bgp_proto '}' { bgp_check_config(BGP_CFG); } )
2638249d
MM
35
36bgp_proto_start: proto_start BGP {
2bbc3083 37 this_proto = proto_config_new(&proto_bgp, $1);
a1beb8f3 38 BGP_CFG->remote_port = BGP_PORT;
f3e59178 39 BGP_CFG->multihop = -1; /* undefined */
c01e3741 40 BGP_CFG->hold_time = 240;
b552ecc4 41 BGP_CFG->initial_hold_time = 240;
56a2bed4 42 BGP_CFG->compare_path_lengths = 1;
d1e146f2 43 BGP_CFG->igp_metric = 1;
6cf72d7a
OZ
44 BGP_CFG->connect_delay_time = 5;
45 BGP_CFG->connect_retry_time = 120;
6fd766c1
MM
46 BGP_CFG->error_amnesia_time = 300;
47 BGP_CFG->error_delay_time_min = 60;
48 BGP_CFG->error_delay_time_max = 300;
bf47fe4b 49 BGP_CFG->enable_refresh = 1;
43c1cecc 50 BGP_CFG->enable_as4 = 1;
e8ba557c
OZ
51 BGP_CFG->capabilities = 2;
52 BGP_CFG->advertise_ipv4 = 1;
41677025 53 BGP_CFG->interpret_communities = 1;
fbcb7d5f 54 BGP_CFG->default_local_pref = 100;
0c791f87
OZ
55 BGP_CFG->gr_mode = BGP_GR_AWARE;
56 BGP_CFG->gr_time = 120;
6fd766c1 57 }
2638249d
MM
58 ;
59
a1beb8f3
OZ
60bgp_nbr_opts:
61 /* empty */
62 | bgp_nbr_opts PORT expr { BGP_CFG->remote_port = $3; if (($3<1) || ($3>65535)) cf_error("Invalid port number"); }
63 | bgp_nbr_opts AS expr { BGP_CFG->remote_as = $3; }
64 ;
65
2638249d
MM
66bgp_proto:
67 bgp_proto_start proto_name '{'
68 | bgp_proto proto_item ';'
11cb6202 69 | bgp_proto LOCAL AS expr ';' { BGP_CFG->local_as = $4; }
9be9a264 70 | bgp_proto LOCAL ipa AS expr ';' { BGP_CFG->source_addr = $3; BGP_CFG->local_as = $5; }
a1beb8f3
OZ
71 | bgp_proto NEIGHBOR bgp_nbr_opts ';'
72 | bgp_proto NEIGHBOR ipa ipa_scope bgp_nbr_opts ';' {
53ffbff3
OZ
73 if (ipa_nonzero(BGP_CFG->remote_ip))
74 cf_error("Only one neighbor per BGP instance is allowed");
2638249d 75 BGP_CFG->remote_ip = $3;
a1beb8f3 76 if ($4) BGP_CFG->iface = $4;
2638249d 77 }
a1beb8f3 78 | bgp_proto INTERFACE TEXT ';' { BGP_CFG->iface = if_get_by_name($3); }
89534cda 79 | bgp_proto RR CLUSTER ID idval ';' { BGP_CFG->rr_cluster_id = $5; }
4847a894 80 | bgp_proto RR CLIENT ';' { BGP_CFG->rr_client = 1; }
a92fe607 81 | bgp_proto RS CLIENT ';' { BGP_CFG->rs_client = 1; }
e3f2d5fc
MM
82 | bgp_proto HOLD TIME expr ';' { BGP_CFG->hold_time = $4; }
83 | bgp_proto STARTUP HOLD TIME expr ';' { BGP_CFG->initial_hold_time = $5; }
f3e59178 84 | bgp_proto DIRECT ';' { BGP_CFG->multihop = 0; }
9be9a264 85 | bgp_proto MULTIHOP ';' { BGP_CFG->multihop = 64; }
b1b19433 86 | bgp_proto MULTIHOP expr ';' { BGP_CFG->multihop = $3; if (($3<1) || ($3>255)) cf_error("Multihop must be in range 1-255"); }
48bc232f
OZ
87 | bgp_proto NEXT HOP SELF ';' { BGP_CFG->next_hop_self = 1; BGP_CFG->next_hop_keep = 0; }
88 | bgp_proto NEXT HOP KEEP ';' { BGP_CFG->next_hop_keep = 1; BGP_CFG->next_hop_self = 0; }
3f9b7bfe
OZ
89 | bgp_proto MISSING LLADDR SELF ';' { BGP_CFG->missing_lladdr = MLL_SELF; }
90 | bgp_proto MISSING LLADDR DROP ';' { BGP_CFG->missing_lladdr = MLL_DROP; }
91 | bgp_proto MISSING LLADDR IGNORE ';' { BGP_CFG->missing_lladdr = MLL_IGNORE; }
087cecd0
OZ
92 | bgp_proto GATEWAY DIRECT ';' { BGP_CFG->gw_mode = GW_DIRECT; }
93 | bgp_proto GATEWAY RECURSIVE ';' { BGP_CFG->gw_mode = GW_RECURSIVE; }
7294f68b 94 | bgp_proto PATH METRIC bool ';' { BGP_CFG->compare_path_lengths = $4; }
73272f04 95 | bgp_proto MED METRIC bool ';' { BGP_CFG->med_metric = $4; }
d1e146f2 96 | bgp_proto IGP METRIC bool ';' { BGP_CFG->igp_metric = $4; }
3228c72c 97 | bgp_proto PREFER OLDER bool ';' { BGP_CFG->prefer_older = $4; }
be4cd99a 98 | bgp_proto DETERMINISTIC MED bool ';' { BGP_CFG->deterministic_med = $4; }
e3f2d5fc
MM
99 | bgp_proto DEFAULT BGP_MED expr ';' { BGP_CFG->default_med = $4; }
100 | bgp_proto DEFAULT BGP_LOCAL_PREF expr ';' { BGP_CFG->default_local_pref = $4; }
101 | bgp_proto SOURCE ADDRESS ipa ';' { BGP_CFG->source_addr = $4; }
6cf72d7a
OZ
102 | bgp_proto START DELAY TIME expr ';' { BGP_CFG->connect_delay_time = $5; log(L_WARN "%s: Start delay time option is deprecated, use connect delay time", this_proto->name); }
103 | bgp_proto CONNECT DELAY TIME expr ';' { BGP_CFG->connect_delay_time = $5; }
104 | bgp_proto CONNECT RETRY TIME expr ';' { BGP_CFG->connect_retry_time = $5; }
105 | bgp_proto KEEPALIVE TIME expr ';' { BGP_CFG->keepalive_time = $4; }
523f020b 106 | bgp_proto ERROR FORGET TIME expr ';' { BGP_CFG->error_amnesia_time = $5; }
e3f2d5fc 107 | bgp_proto ERROR WAIT TIME expr ',' expr ';' { BGP_CFG->error_delay_time_min = $5; BGP_CFG->error_delay_time_max = $7; }
7294f68b 108 | bgp_proto DISABLE AFTER ERROR bool ';' { BGP_CFG->disable_after_error = $5; }
bf47fe4b 109 | bgp_proto ENABLE ROUTE REFRESH bool ';' { BGP_CFG->enable_refresh = $5; }
ba5ed6f3 110 | bgp_proto ENABLE AS4 bool ';' { BGP_CFG->enable_as4 = $4; }
e8ba557c
OZ
111 | bgp_proto CAPABILITIES bool ';' { BGP_CFG->capabilities = $3; }
112 | bgp_proto ADVERTISE IPV4 bool ';' { BGP_CFG->advertise_ipv4 = $4; }
9eceab33 113 | bgp_proto PASSWORD text ';' { BGP_CFG->password = $3; }
ebecb6f6
OZ
114 | bgp_proto ROUTE LIMIT expr ';' {
115 this_proto->in_limit = cfg_allocz(sizeof(struct proto_limit));
116 this_proto->in_limit->limit = $4;
117 this_proto->in_limit->action = PLA_RESTART;
6cf72d7a 118 log(L_WARN "%s: Route limit option is deprecated, use import limit", this_proto->name);
ebecb6f6 119 }
be6e39eb 120 | bgp_proto PASSIVE bool ';' { BGP_CFG->passive = $3; }
41677025 121 | bgp_proto INTERPRET COMMUNITIES bool ';' { BGP_CFG->interpret_communities = $4; }
00a09f3c 122 | bgp_proto SECONDARY bool ';' { BGP_CFG->secondary = $3; }
094d2bdb
OZ
123 | bgp_proto ADD PATHS RX ';' { BGP_CFG->add_path = ADD_PATH_RX; }
124 | bgp_proto ADD PATHS TX ';' { BGP_CFG->add_path = ADD_PATH_TX; }
125 | bgp_proto ADD PATHS bool ';' { BGP_CFG->add_path = $4 ? ADD_PATH_FULL : 0; }
a15dab76
OZ
126 | bgp_proto ALLOW LOCAL AS ';' { BGP_CFG->allow_local_as = -1; }
127 | bgp_proto ALLOW LOCAL AS expr ';' { BGP_CFG->allow_local_as = $5; }
0c791f87
OZ
128 | bgp_proto GRACEFUL RESTART bool ';' { BGP_CFG->gr_mode = $4; }
129 | bgp_proto GRACEFUL RESTART AWARE ';' { BGP_CFG->gr_mode = BGP_GR_AWARE; }
130 | bgp_proto GRACEFUL RESTART TIME expr ';' { BGP_CFG->gr_time = $5; }
cfe34a31 131 | bgp_proto IGP TABLE rtable ';' { BGP_CFG->igp_table = $4; }
b1b19433 132 | bgp_proto TTL SECURITY bool ';' { BGP_CFG->ttl_security = $4; }
523f020b 133 | bgp_proto CHECK LINK bool ';' { BGP_CFG->check_link = $4; }
1ec52253 134 | bgp_proto BFD bool ';' { BGP_CFG->bfd = $3; cf_check_bfd($3); }
2638249d
MM
135 ;
136
56a2bed4 137CF_ADDTO(dynamic_attr, BGP_ORIGIN
cea63664 138 { $$ = f_new_dynamic_attr(EAF_TYPE_INT, T_ENUM_BGP_ORIGIN, EA_CODE(EAP_BGP, BA_ORIGIN)); })
126683fe
OZ
139CF_ADDTO(dynamic_attr, BGP_PATH
140 { $$ = f_new_dynamic_attr(EAF_TYPE_AS_PATH, T_PATH, EA_CODE(EAP_BGP, BA_AS_PATH)); })
56a2bed4
MM
141CF_ADDTO(dynamic_attr, BGP_NEXT_HOP
142 { $$ = f_new_dynamic_attr(EAF_TYPE_IP_ADDRESS, T_IP, EA_CODE(EAP_BGP, BA_NEXT_HOP)); })
126683fe
OZ
143CF_ADDTO(dynamic_attr, BGP_MED
144 { $$ = f_new_dynamic_attr(EAF_TYPE_INT, T_INT, EA_CODE(EAP_BGP, BA_MULTI_EXIT_DISC)); })
145CF_ADDTO(dynamic_attr, BGP_LOCAL_PREF
146 { $$ = f_new_dynamic_attr(EAF_TYPE_INT, T_INT, EA_CODE(EAP_BGP, BA_LOCAL_PREF)); })
56a2bed4
MM
147CF_ADDTO(dynamic_attr, BGP_ATOMIC_AGGR
148 { $$ = f_new_dynamic_attr(EAF_TYPE_OPAQUE, T_ENUM_EMPTY, EA_CODE(EAP_BGP, BA_ATOMIC_AGGR)); })
149CF_ADDTO(dynamic_attr, BGP_AGGREGATOR
150 { $$ = f_new_dynamic_attr(EAF_TYPE_INT, T_INT, EA_CODE(EAP_BGP, BA_AGGREGATOR)); })
151CF_ADDTO(dynamic_attr, BGP_COMMUNITY
152 { $$ = f_new_dynamic_attr(EAF_TYPE_INT_SET, T_CLIST, EA_CODE(EAP_BGP, BA_COMMUNITY)); })
126683fe
OZ
153CF_ADDTO(dynamic_attr, BGP_ORIGINATOR_ID
154 { $$ = f_new_dynamic_attr(EAF_TYPE_ROUTER_ID, T_QUAD, EA_CODE(EAP_BGP, BA_ORIGINATOR_ID)); })
155CF_ADDTO(dynamic_attr, BGP_CLUSTER_LIST
156 { $$ = f_new_dynamic_attr(EAF_TYPE_INT_SET, T_CLIST, EA_CODE(EAP_BGP, BA_CLUSTER_LIST)); })
42a0c054
OZ
157CF_ADDTO(dynamic_attr, BGP_EXT_COMMUNITY
158 { $$ = f_new_dynamic_attr(EAF_TYPE_EC_SET, T_ECLIST, EA_CODE(EAP_BGP, BA_EXT_COMMUNITY)); })
159
126683fe 160
12d5677a 161
cea63664
MM
162CF_ENUM(T_ENUM_BGP_ORIGIN, ORIGIN_, IGP, EGP, INCOMPLETE)
163
2638249d
MM
164CF_CODE
165
166CF_END