bgpd: send bgp link-state prefixes

Add the ability to send link-state prefixes that are in the BGP table.

Signed-off-by: Louis Scalbert <louis.scalbert@6wind.com>
Signed-off-by: Olivier Dugeon <olivier.dugeon@orange.com>
This commit is contained in:
Louis Scalbert 2022-12-30 11:20:10 +01:00
parent 39a8d354c1
commit 0c94fb9cc8
4 changed files with 25 additions and 15 deletions

View File

@ -40,6 +40,7 @@
#endif #endif
#include "bgp_evpn.h" #include "bgp_evpn.h"
#include "bgp_flowspec_private.h" #include "bgp_flowspec_private.h"
#include "bgp_linkstate_tlv.h"
#include "bgp_mac.h" #include "bgp_mac.h"
/* Attribute strings for logging. */ /* Attribute strings for logging. */
@ -4005,8 +4006,6 @@ size_t bgp_packet_mpattr_start(struct stream *s, struct peer *peer, afi_t afi,
switch (safi) { switch (safi) {
case SAFI_LINKSTATE: case SAFI_LINKSTATE:
case SAFI_LINKSTATE_VPN: case SAFI_LINKSTATE_VPN:
/* TODO */
break;
case SAFI_UNICAST: case SAFI_UNICAST:
case SAFI_MULTICAST: case SAFI_MULTICAST:
case SAFI_LABELED_UNICAST: case SAFI_LABELED_UNICAST:
@ -4042,8 +4041,6 @@ size_t bgp_packet_mpattr_start(struct stream *s, struct peer *peer, afi_t afi,
switch (safi) { switch (safi) {
case SAFI_LINKSTATE: case SAFI_LINKSTATE:
case SAFI_LINKSTATE_VPN: case SAFI_LINKSTATE_VPN:
/* TODO */
break;
case SAFI_UNICAST: case SAFI_UNICAST:
case SAFI_MULTICAST: case SAFI_MULTICAST:
case SAFI_LABELED_UNICAST: case SAFI_LABELED_UNICAST:
@ -4095,10 +4092,8 @@ size_t bgp_packet_mpattr_start(struct stream *s, struct peer *peer, afi_t afi,
} }
break; break;
case AFI_LINKSTATE: case AFI_LINKSTATE:
/* TODO */
break;
case AFI_L2VPN: case AFI_L2VPN:
if (safi != SAFI_FLOWSPEC) if (nh_afi == AFI_L2VPN && safi != SAFI_FLOWSPEC)
flog_err( flog_err(
EC_BGP_ATTR_NH_SEND_LEN, EC_BGP_ATTR_NH_SEND_LEN,
"Bad nexthop when sending to %s, AFI %u SAFI %u nhlen %d", "Bad nexthop when sending to %s, AFI %u SAFI %u nhlen %d",
@ -4150,8 +4145,10 @@ void bgp_packet_mpattr_prefix(struct stream *s, afi_t afi, safi_t safi,
addpath_tx_id); addpath_tx_id);
break; break;
case SAFI_LINKSTATE: case SAFI_LINKSTATE:
bgp_nlri_encode_linkstate(s, p);
break;
case SAFI_LINKSTATE_VPN: case SAFI_LINKSTATE_VPN:
/* TODO */ /* not yet supported */
break; break;
case SAFI_FLOWSPEC: case SAFI_FLOWSPEC:
stream_putc(s, p->u.prefix_flowspec.prefixlen); stream_putc(s, p->u.prefix_flowspec.prefixlen);
@ -4181,8 +4178,6 @@ size_t bgp_packet_mpattr_prefix_size(afi_t afi, safi_t safi,
break; break;
case SAFI_LINKSTATE: case SAFI_LINKSTATE:
case SAFI_LINKSTATE_VPN: case SAFI_LINKSTATE_VPN:
/* TODO */
break;
case SAFI_UNICAST: case SAFI_UNICAST:
case SAFI_MULTICAST: case SAFI_MULTICAST:
break; break;

View File

@ -71,3 +71,17 @@ int bgp_nlri_parse_linkstate(struct peer *peer, struct attr *attr,
} }
return BGP_NLRI_PARSE_OK; return BGP_NLRI_PARSE_OK;
} }
/*
* Encode Link-State prefix in Update (MP_REACH)
*/
void bgp_nlri_encode_linkstate(struct stream *s, const struct prefix *p)
{
/* NLRI type */
stream_putw(s, p->u.prefix_linkstate.nlri_type);
/* Size */
stream_putw(s, p->prefixlen);
stream_put(s, (const void *)p->u.prefix_linkstate.ptr, p->prefixlen);
}

View File

@ -8,5 +8,6 @@
extern int bgp_nlri_parse_linkstate(struct peer *peer, struct attr *attr, extern int bgp_nlri_parse_linkstate(struct peer *peer, struct attr *attr,
struct bgp_nlri *packet, int withdraw); struct bgp_nlri *packet, int withdraw);
extern void bgp_nlri_encode_linkstate(struct stream *s, const struct prefix *p);
#endif /* BGP_LINKSTATE_TLV_H */ #endif /* BGP_LINKSTATE_TLV_H */

View File

@ -4729,8 +4729,8 @@ void bgp_update(struct peer *peer, const struct prefix *p, uint32_t addpath_id,
(safi == SAFI_UNICAST || safi == SAFI_LABELED_UNICAST || (safi == SAFI_UNICAST || safi == SAFI_LABELED_UNICAST ||
(safi == SAFI_MPLS_VPN && (safi == SAFI_MPLS_VPN &&
pi->sub_type != BGP_ROUTE_IMPORTED))) || pi->sub_type != BGP_ROUTE_IMPORTED))) ||
(safi == SAFI_EVPN && (safi == SAFI_EVPN && bgp_evpn_is_prefix_nht_supported(p)) ||
bgp_evpn_is_prefix_nht_supported(p))) { afi == AFI_LINKSTATE) {
if (safi != SAFI_EVPN && peer->sort == BGP_PEER_EBGP if (safi != SAFI_EVPN && peer->sort == BGP_PEER_EBGP
&& peer->ttl == BGP_DEFAULT_TTL && peer->ttl == BGP_DEFAULT_TTL
&& !CHECK_FLAG(peer->flags, && !CHECK_FLAG(peer->flags,
@ -4877,9 +4877,9 @@ void bgp_update(struct peer *peer, const struct prefix *p, uint32_t addpath_id,
/* Nexthop reachability check. */ /* Nexthop reachability check. */
if (((afi == AFI_IP || afi == AFI_IP6) && if (((afi == AFI_IP || afi == AFI_IP6) &&
(safi == SAFI_UNICAST || safi == SAFI_LABELED_UNICAST || (safi == SAFI_UNICAST || safi == SAFI_LABELED_UNICAST ||
(safi == SAFI_MPLS_VPN && (safi == SAFI_MPLS_VPN && new->sub_type != BGP_ROUTE_IMPORTED))) ||
new->sub_type != BGP_ROUTE_IMPORTED))) || (safi == SAFI_EVPN && bgp_evpn_is_prefix_nht_supported(p)) ||
(safi == SAFI_EVPN && bgp_evpn_is_prefix_nht_supported(p))) { afi == AFI_LINKSTATE) {
if (safi != SAFI_EVPN && peer->sort == BGP_PEER_EBGP if (safi != SAFI_EVPN && peer->sort == BGP_PEER_EBGP
&& peer->ttl == BGP_DEFAULT_TTL && peer->ttl == BGP_DEFAULT_TTL
&& !CHECK_FLAG(peer->flags, && !CHECK_FLAG(peer->flags,