mirror of
https://git.proxmox.com/git/mirror_frr
synced 2025-05-25 22:00:41 +00:00
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:
parent
39a8d354c1
commit
0c94fb9cc8
@ -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;
|
||||||
|
@ -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);
|
||||||
|
}
|
||||||
|
@ -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 */
|
||||||
|
@ -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,
|
||||||
|
Loading…
Reference in New Issue
Block a user