This commit enhances the ability to configure from capnproto the maximum path field per vrf. The ability to configure multipath for an afi/safi is also made possible.
Signed-off-by: Philippe Guibert <philippe.guib...@6wind.com> --- bgpd/bgp.bcapnp.c | 61 +++++++++++++++++++++++++++++++++++++++++++++++++++---- bgpd/bgp.bcapnp.h | 1 + bgpd/bgp.capnp | 1 + bgpd/bgpd.ndef.i | 21 +++++++++++++++++++ 4 files changed, 80 insertions(+), 4 deletions(-) diff --git a/bgpd/bgp.bcapnp.c b/bgpd/bgp.bcapnp.c index 2bf038128cd1..135a54f34dc6 100644 --- a/bgpd/bgp.bcapnp.c +++ b/bgpd/bgp.bcapnp.c @@ -415,6 +415,16 @@ void qcapn_BGPAfiSafi_read(struct bgp *s, capn_ptr p, afi_t afi, safi_t safi) if (tmp) s->af_flags[afi][safi] |= BGP_CONFIG_DAMPENING; else s->af_flags[afi][safi] &= ~BGP_CONFIG_DAMPENING; } + { bool tmp; + tmp = !!(capn_read8(p, 0) & (1 << 1)); + if (tmp) s->af_flags[afi][safi] |= BGP_CONFIG_ASPATH_MULTIPATH_RELAX; + else s->af_flags[afi][safi] &= ~BGP_CONFIG_ASPATH_MULTIPATH_RELAX; + } + { bool tmp; + tmp = !!(capn_read8(p, 0) & (1 << 2)); + if (tmp) s->af_flags[afi][safi] |= BGP_CONFIG_MULTIPATH; + else s->af_flags[afi][safi] &= ~BGP_CONFIG_MULTIPATH; + } } @@ -423,6 +433,8 @@ void qcapn_BGPAfiSafi_write(const struct bgp *s, capn_ptr p, afi_t afi, safi_t s { capn_resolve(&p); capn_write1(p, 0, !!(s->af_flags[afi][safi] & BGP_CONFIG_DAMPENING)); + capn_write1(p, 1, !!(s->af_flags[afi][safi] & BGP_CONFIG_ASPATH_MULTIPATH_RELAX)); + capn_write1(p, 2, !!(s->af_flags[afi][safi] & BGP_CONFIG_MULTIPATH)); } @@ -435,13 +447,51 @@ void qcapn_BGPAfiSafi_set(struct bgp *s, capn_ptr p, afi_t afi, safi_t safi) flags = !!(capn_read8(p, 0) & (1 << 0)); if (flags) bgp_af_flag_set(s, BGP_CONFIG_DAMPENING, afi, safi); else bgp_af_flag_unset(s, BGP_CONFIG_DAMPENING, afi, safi); + flags = !!(capn_read8(p, 0) & (1 << 1)); + if (flags) + { + bgp_af_flag_set(s, BGP_CONFIG_ASPATH_MULTIPATH_RELAX, afi, safi); + } + else + { + bgp_af_flag_unset(s, BGP_CONFIG_ASPATH_MULTIPATH_RELAX, afi, safi); + } + } + { + u_int16_t flags; + flags = !!(capn_read8(p, 0) & (1 << 2)); + if (flags) + { + uint8_t max = capn_read8(p, 3); + bgp_af_flag_set(s, BGP_CONFIG_MULTIPATH, afi, safi); + bgp_maximum_paths_set (s, AFI_IP, SAFI_MPLS_VPN, + BGP_PEER_EBGP, max); + bgp_maximum_paths_set (s, AFI_IP, SAFI_MPLS_VPN, + BGP_PEER_IBGP, max); + bgp_maximum_paths_set (s, AFI_IP, SAFI_UNICAST, + BGP_PEER_EBGP, max); + bgp_maximum_paths_set (s, AFI_IP, SAFI_UNICAST, + BGP_PEER_IBGP, max); + } + else + { + bgp_af_flag_unset(s, BGP_CONFIG_MULTIPATH, afi, safi); + bgp_maximum_paths_unset (s, AFI_IP, SAFI_MPLS_VPN, + BGP_PEER_EBGP); + bgp_maximum_paths_unset (s, AFI_IP, SAFI_MPLS_VPN, + BGP_PEER_IBGP); + bgp_maximum_paths_unset (s, AFI_IP, SAFI_UNICAST, + BGP_PEER_EBGP); + bgp_maximum_paths_unset (s, AFI_IP, SAFI_UNICAST, + BGP_PEER_IBGP); + } } } capn_ptr qcapn_new_BGPAfiSafi(struct capn_segment *s) { - return capn_new_struct(s, 8, 0); + return capn_new_struct(s, 16, 0); } @@ -936,7 +986,7 @@ void qcapn_BGPVRF_read(struct bgp_vrf *s, capn_ptr p) memcpy(&s->outbound_rd.val, &tmp, 8); s->outbound_rd.family = AF_UNSPEC; s->outbound_rd.prefixlen = 64; - + s->max_mpath = capn_read32(p, 8); { capn_ptr tmp_p = capn_getp(p, 0, 1); capn_list64 listptr = { .p = capn_getp(tmp_p, 0, 1) }; @@ -969,7 +1019,7 @@ void qcapn_BGPVRF_write(const struct bgp_vrf *s, capn_ptr p) memcpy(&tmp,&(s->outbound_rd.val), 8); capn_resolve(&p); capn_write64(p, 0, tmp); - + capn_write32(p, 8, s->max_mpath); { capn_ptr tempptr = capn_new_struct(p.seg, 0, 1); size_t size = s->rt_import ? s->rt_import->size : 0; @@ -997,6 +1047,9 @@ void qcapn_BGPVRF_set(struct bgp_vrf *s, capn_ptr p) { capn_resolve(&p); { + s->max_mpath = capn_read32(p, 8); + } + { /* MISSING: outbound_rd */ } { @@ -1048,7 +1101,7 @@ struct prefix_rd qcapn_BGPVRF_get_outbound_rd(capn_ptr p) capn_ptr qcapn_new_BGPVRF(struct capn_segment *s) { - return capn_new_struct(s, 8, 2); + return capn_new_struct(s, 12, 2); } diff --git a/bgpd/bgp.bcapnp.h b/bgpd/bgp.bcapnp.h index 3b8ce361f6b2..eb0cba4a43c7 100644 --- a/bgpd/bgp.bcapnp.h +++ b/bgpd/bgp.bcapnp.h @@ -7,6 +7,7 @@ #include "zebra.h" #include "bgpd.h" +#include "bgp_mpath.h" afi_t qcapn_AfiSafiKey_get_afi(capn_ptr p); safi_t qcapn_AfiSafiKey_get_safi(capn_ptr p); capn_ptr qcapn_new_AfiSafiKey(struct capn_segment *s); diff --git a/bgpd/bgp.capnp b/bgpd/bgp.capnp index 27a917ff62cd..fcee0c975962 100644 --- a/bgpd/bgp.capnp +++ b/bgpd/bgp.capnp @@ -163,6 +163,7 @@ struct BGPVRF $ctype("struct bgp_vrf") $cgen outboundRd @0 :UInt64 $cgetfield; rtImport @1 :ExtCommunityList; rtExport @2 :ExtCommunityList; + max_mpath @3 :UInt32 $cgetfield; } struct BGPVRFRoute $ctype("struct bgp_api_route") $cgen diff --git a/bgpd/bgpd.ndef.i b/bgpd/bgpd.ndef.i index c235b557479f..c7be77b98688 100644 --- a/bgpd/bgpd.ndef.i +++ b/bgpd/bgpd.ndef.i @@ -246,6 +246,24 @@ _qzc_set_bgp_1(struct bgp *p, qcapn_BGP_set(p, req->data); } +static void +_qzc_set_bgp_2(struct bgp *p, + struct QZCSetReq *req, + struct capn_segment *seg) +{ + afi_t afi; + safi_t safi; + + afi = qcapn_AfiSafiKey_get_afi (req->ctxdata); + safi = qcapn_AfiSafiKey_get_safi (req->ctxdata); + + if (req->datatype != 0xfd0316f1800ae916) + /* error */ + return; + + qcapn_BGPAfiSafi_set(p, req->data, afi, safi); +} + /* [3fafaa5ff15d4317] bgp <> bgp */ static void _qzc_get_bgp(void *entity, struct QZCGetReq *req, struct QZCGetRep *rep, @@ -296,6 +314,9 @@ _qzc_set_bgp(void *entity, case 1: _qzc_set_bgp_1(p, req, seg); return; + case 2: + _qzc_set_bgp_2(p, req, seg); + return; default: return; } -- 2.1.4 _______________________________________________ Quagga-dev mailing list Quagga-dev@lists.quagga.net https://lists.quagga.net/mailman/listinfo/quagga-dev