diff options
author | Ondrej Zajicek <santiago@crfreenet.org> | 2022-07-12 15:03:17 +0200 |
---|---|---|
committer | Ondrej Zajicek <santiago@crfreenet.org> | 2022-07-12 15:03:17 +0200 |
commit | 971721c9b50d361e886762f1c7d0392e10f74021 (patch) | |
tree | 89063aca980d745fbf2c0916263ac1a29c210219 | |
parent | c73b5d2d3d94204d2a81d93efd02c4c115859353 (diff) |
BGP: Minor improvements to BGP roles
Add support for bgp_otc in filters and warning for configuration
inside confederations.
-rw-r--r-- | doc/bird.sgml | 3 | ||||
-rw-r--r-- | proto/bgp/bgp.c | 5 | ||||
-rw-r--r-- | proto/bgp/config.Y | 4 |
3 files changed, 9 insertions, 3 deletions
diff --git a/doc/bird.sgml b/doc/bird.sgml index c1ce1b91..a0d9c405 100644 --- a/doc/bird.sgml +++ b/doc/bird.sgml @@ -2829,7 +2829,8 @@ using the following configuration parameters: leaks created by third parties. This option is valid for EBGP sessions, but it is not recommended to be - used within AS confederations. + used within AS confederations (which would require manual filtering of + <cf/bgp_otc/ attribute on confederation boundaries). Possible <cf><m/role-name/</cf> values are: <cf/provider/, <cf/rs_server/, <cf/rs_client/, <cf/customer/ and <cf/peer/. diff --git a/proto/bgp/bgp.c b/proto/bgp/bgp.c index 3b28a338..0f06746f 100644 --- a/proto/bgp/bgp.c +++ b/proto/bgp/bgp.c @@ -1987,6 +1987,9 @@ bgp_postconfig(struct proto_config *CF) if (internal && (cf->local_role != BGP_ROLE_UNDEFINED)) cf_error("Local role cannot be set on IBGP sessions"); + if (interior && (cf->local_role != BGP_ROLE_UNDEFINED)) + log(L_WARN "BGP roles are not recommended to be used within AS confederations"); + if (cf->require_roles && (cf->local_role == BGP_ROLE_UNDEFINED)) cf_error("Local role must be set if roles are required"); @@ -2357,7 +2360,7 @@ bgp_format_role_name(u8 role) { static const char *bgp_role_names[] = { "provider", "rs_server", "rs_client", "customer", "peer" }; if (role == BGP_ROLE_UNDEFINED) return "undefined"; - if (role < 5) return bgp_role_names[role]; + if (role < ARRAY_SIZE(bgp_role_names)) return bgp_role_names[role]; return "?"; } diff --git a/proto/bgp/config.Y b/proto/bgp/config.Y index a00aa156..cb410a5e 100644 --- a/proto/bgp/config.Y +++ b/proto/bgp/config.Y @@ -32,7 +32,7 @@ CF_KEYWORDS(BGP, LOCAL, NEIGHBOR, AS, HOLD, TIME, CONNECT, RETRY, KEEPALIVE, LIVED, STALE, IMPORT, IBGP, EBGP, MANDATORY, INTERNAL, EXTERNAL, SETS, DYNAMIC, RANGE, NAME, DIGITS, BGP_AIGP, AIGP, ORIGINATE, COST, ENFORCE, FIRST, FREE, VALIDATE, BASE, ROLE, ROLES, PEER, PROVIDER, CUSTOMER, - RS_SERVER, RS_CLIENT, REQUIRE) + RS_SERVER, RS_CLIENT, REQUIRE, BGP_OTC) %type <i> bgp_nh %type <i32> bgp_afi @@ -355,6 +355,8 @@ dynamic_attr: BGP_AIGP { $$ = f_new_dynamic_attr(EAF_TYPE_OPAQUE, T_ENUM_EMPTY, EA_CODE(PROTOCOL_BGP, BA_AIGP)); } ; dynamic_attr: BGP_LARGE_COMMUNITY { $$ = f_new_dynamic_attr(EAF_TYPE_LC_SET, T_LCLIST, EA_CODE(PROTOCOL_BGP, BA_LARGE_COMMUNITY)); } ; +dynamic_attr: BGP_OTC + { $$ = f_new_dynamic_attr(EAF_TYPE_INT, T_INT, EA_CODE(PROTOCOL_BGP, BA_ONLY_TO_CUSTOMER)); } ; |