diff --git a/bgpd/bgp_attr.c b/bgpd/bgp_attr.c index 8427b1b604..4115224641 100644 --- a/bgpd/bgp_attr.c +++ b/bgpd/bgp_attr.c @@ -40,6 +40,7 @@ #endif #include "bgp_evpn.h" #include "bgp_flowspec_private.h" +#include "bgp_linkstate_tlv.h" #include "bgp_mac.h" /* 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) { case SAFI_LINKSTATE: case SAFI_LINKSTATE_VPN: - /* TODO */ - break; case SAFI_UNICAST: case SAFI_MULTICAST: 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) { case SAFI_LINKSTATE: case SAFI_LINKSTATE_VPN: - /* TODO */ - break; case SAFI_UNICAST: case SAFI_MULTICAST: case SAFI_LABELED_UNICAST: @@ -4095,10 +4092,8 @@ size_t bgp_packet_mpattr_start(struct stream *s, struct peer *peer, afi_t afi, } break; case AFI_LINKSTATE: - /* TODO */ - break; case AFI_L2VPN: - if (safi != SAFI_FLOWSPEC) + if (nh_afi == AFI_L2VPN && safi != SAFI_FLOWSPEC) flog_err( EC_BGP_ATTR_NH_SEND_LEN, "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); break; case SAFI_LINKSTATE: + bgp_nlri_encode_linkstate(s, p); + break; case SAFI_LINKSTATE_VPN: - /* TODO */ + /* not yet supported */ break; case SAFI_FLOWSPEC: 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; case SAFI_LINKSTATE: case SAFI_LINKSTATE_VPN: - /* TODO */ - break; case SAFI_UNICAST: case SAFI_MULTICAST: break; diff --git a/bgpd/bgp_linkstate_tlv.c b/bgpd/bgp_linkstate_tlv.c index 60f2c029cd..eca6c066a5 100644 --- a/bgpd/bgp_linkstate_tlv.c +++ b/bgpd/bgp_linkstate_tlv.c @@ -71,3 +71,17 @@ int bgp_nlri_parse_linkstate(struct peer *peer, struct attr *attr, } 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); +} diff --git a/bgpd/bgp_linkstate_tlv.h b/bgpd/bgp_linkstate_tlv.h index cb2c6ac99c..6e34f1fda6 100644 --- a/bgpd/bgp_linkstate_tlv.h +++ b/bgpd/bgp_linkstate_tlv.h @@ -8,5 +8,6 @@ extern int bgp_nlri_parse_linkstate(struct peer *peer, struct attr *attr, struct bgp_nlri *packet, int withdraw); +extern void bgp_nlri_encode_linkstate(struct stream *s, const struct prefix *p); #endif /* BGP_LINKSTATE_TLV_H */ diff --git a/bgpd/bgp_route.c b/bgpd/bgp_route.c index 70c8238a74..a7e60886db 100644 --- a/bgpd/bgp_route.c +++ b/bgpd/bgp_route.c @@ -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_MPLS_VPN && pi->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 && peer->ttl == BGP_DEFAULT_TTL && !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. */ if (((afi == AFI_IP || afi == AFI_IP6) && (safi == SAFI_UNICAST || safi == SAFI_LABELED_UNICAST || - (safi == SAFI_MPLS_VPN && - new->sub_type != BGP_ROUTE_IMPORTED))) || - (safi == SAFI_EVPN && bgp_evpn_is_prefix_nht_supported(p))) { + (safi == SAFI_MPLS_VPN && new->sub_type != BGP_ROUTE_IMPORTED))) || + (safi == SAFI_EVPN && bgp_evpn_is_prefix_nht_supported(p)) || + afi == AFI_LINKSTATE) { if (safi != SAFI_EVPN && peer->sort == BGP_PEER_EBGP && peer->ttl == BGP_DEFAULT_TTL && !CHECK_FLAG(peer->flags,