summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--bgpd/bgp_attr.c15
-rw-r--r--bgpd/bgp_linkstate_tlv.c14
-rw-r--r--bgpd/bgp_linkstate_tlv.h1
-rw-r--r--bgpd/bgp_route.c10
4 files changed, 25 insertions, 15 deletions
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,