summaryrefslogtreecommitdiffstats
path: root/bgpd/bgp_addpath.c
diff options
context:
space:
mode:
Diffstat (limited to 'bgpd/bgp_addpath.c')
-rw-r--r--bgpd/bgp_addpath.c33
1 files changed, 32 insertions, 1 deletions
diff --git a/bgpd/bgp_addpath.c b/bgpd/bgp_addpath.c
index de4b4a4..f391c13 100644
--- a/bgpd/bgp_addpath.c
+++ b/bgpd/bgp_addpath.c
@@ -10,6 +10,8 @@
#include "bgp_addpath.h"
#include "bgp_route.h"
+#include "bgp_open.h"
+#include "bgp_packet.h"
static const struct bgp_addpath_strategy_names strat_names[BGP_ADDPATH_MAX] = {
{
@@ -359,6 +361,31 @@ void bgp_addpath_type_changed(struct bgp *bgp)
}
}
+int bgp_addpath_capability_action(enum bgp_addpath_strat addpath_type,
+ uint8_t paths)
+{
+ int action = CAPABILITY_ACTION_UNSET;
+
+ switch (addpath_type) {
+ case BGP_ADDPATH_ALL:
+ case BGP_ADDPATH_BEST_PER_AS:
+ action = CAPABILITY_ACTION_SET;
+ break;
+ case BGP_ADDPATH_BEST_SELECTED:
+ if (paths)
+ action = CAPABILITY_ACTION_SET;
+ else
+ action = CAPABILITY_ACTION_UNSET;
+ break;
+ case BGP_ADDPATH_NONE:
+ case BGP_ADDPATH_MAX:
+ action = CAPABILITY_ACTION_UNSET;
+ break;
+ }
+
+ return action;
+}
+
/*
* Change the addpath type assigned to a peer, or peer group. In addition to
* adjusting the counts, peer sessions will be reset as needed to make the
@@ -373,6 +400,7 @@ void bgp_addpath_set_peer_type(struct peer *peer, afi_t afi, safi_t safi,
struct listnode *node, *nnode;
struct peer *tmp_peer;
struct peer_group *group;
+ int action = bgp_addpath_capability_action(addpath_type, paths);
if (safi == SAFI_LABELED_UNICAST)
safi = SAFI_UNICAST;
@@ -430,9 +458,12 @@ void bgp_addpath_set_peer_type(struct peer *peer, afi_t afi, safi_t safi,
}
}
} else {
- peer_change_action(peer, afi, safi, peer_change_reset);
+ if (!CHECK_FLAG(peer->cap, PEER_CAP_DYNAMIC_RCV) &&
+ !CHECK_FLAG(peer->cap, PEER_CAP_DYNAMIC_ADV))
+ peer_change_action(peer, afi, safi, peer_change_reset);
}
+ bgp_capability_send(peer, afi, safi, CAPABILITY_CODE_ADDPATH, action);
}
/*