forked from Mirror/frr
bgpd: add functions related to srte_color management
Signed-off-by: Francois Dumontet <francois.dumontet@6wind.com>
This commit is contained in:
parent
9ec092c6a2
commit
442e2edcfa
|
@ -2206,6 +2206,16 @@ cluster_list_ignore:
|
||||||
return bgp_attr_ignore(peer, args->type);
|
return bgp_attr_ignore(peer, args->type);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* get locally configure or received srte-color value*/
|
||||||
|
uint32_t bgp_attr_get_color(struct attr *attr)
|
||||||
|
{
|
||||||
|
if (attr->srte_color)
|
||||||
|
return attr->srte_color;
|
||||||
|
if (attr->ecommunity)
|
||||||
|
return ecommunity_select_color(attr->ecommunity);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
/* Multiprotocol reachability information parse. */
|
/* Multiprotocol reachability information parse. */
|
||||||
int bgp_mp_reach_parse(struct bgp_attr_parser_args *args,
|
int bgp_mp_reach_parse(struct bgp_attr_parser_args *args,
|
||||||
struct bgp_nlri *mp_update)
|
struct bgp_nlri *mp_update)
|
||||||
|
|
|
@ -466,6 +466,8 @@ extern void bgp_packet_mpunreach_end(struct stream *s, size_t attrlen_pnt);
|
||||||
extern enum bgp_attr_parse_ret bgp_attr_nexthop_valid(struct peer *peer,
|
extern enum bgp_attr_parse_ret bgp_attr_nexthop_valid(struct peer *peer,
|
||||||
struct attr *attr);
|
struct attr *attr);
|
||||||
|
|
||||||
|
extern uint32_t bgp_attr_get_color(struct attr *attr);
|
||||||
|
|
||||||
static inline bool bgp_rmap_nhop_changed(uint32_t out_rmap_flags,
|
static inline bool bgp_rmap_nhop_changed(uint32_t out_rmap_flags,
|
||||||
uint32_t in_rmap_flags)
|
uint32_t in_rmap_flags)
|
||||||
{
|
{
|
||||||
|
|
|
@ -1420,6 +1420,29 @@ bool ecommunity_match(const struct ecommunity *ecom1,
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* return last occurence of color */
|
||||||
|
/* it will be the greatest color value */
|
||||||
|
extern uint32_t ecommunity_select_color(const struct ecommunity *ecom)
|
||||||
|
{
|
||||||
|
|
||||||
|
uint32_t aux_color = 0;
|
||||||
|
uint8_t *p;
|
||||||
|
uint32_t c = 0;
|
||||||
|
|
||||||
|
/* If the value already exists in the structure return 0. */
|
||||||
|
|
||||||
|
for (p = ecom->val; c < ecom->size; p += ecom->unit_size, c++) {
|
||||||
|
if (p == NULL)
|
||||||
|
break;
|
||||||
|
|
||||||
|
if (p[0] == ECOMMUNITY_ENCODE_OPAQUE &&
|
||||||
|
p[1] == ECOMMUNITY_COLOR)
|
||||||
|
ptr_get_be32((const uint8_t *)&p[4], &aux_color);
|
||||||
|
}
|
||||||
|
return aux_color;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/* return first occurence of type */
|
/* return first occurence of type */
|
||||||
extern struct ecommunity_val *ecommunity_lookup(const struct ecommunity *ecom,
|
extern struct ecommunity_val *ecommunity_lookup(const struct ecommunity *ecom,
|
||||||
uint8_t type, uint8_t subtype)
|
uint8_t type, uint8_t subtype)
|
||||||
|
|
|
@ -349,6 +349,7 @@ extern char *ecommunity_str(struct ecommunity *ecom);
|
||||||
extern struct ecommunity_val *ecommunity_lookup(const struct ecommunity *,
|
extern struct ecommunity_val *ecommunity_lookup(const struct ecommunity *,
|
||||||
uint8_t, uint8_t);
|
uint8_t, uint8_t);
|
||||||
|
|
||||||
|
extern uint32_t ecommunity_select_color(const struct ecommunity *ecom);
|
||||||
extern bool ecommunity_add_val(struct ecommunity *ecom,
|
extern bool ecommunity_add_val(struct ecommunity *ecom,
|
||||||
struct ecommunity_val *eval,
|
struct ecommunity_val *eval,
|
||||||
bool unique, bool overwrite);
|
bool unique, bool overwrite);
|
||||||
|
|
|
@ -32,6 +32,7 @@
|
||||||
#include "bgpd/bgp_evpn.h"
|
#include "bgpd/bgp_evpn.h"
|
||||||
#include "bgpd/bgp_rd.h"
|
#include "bgpd/bgp_rd.h"
|
||||||
#include "bgpd/bgp_mplsvpn.h"
|
#include "bgpd/bgp_mplsvpn.h"
|
||||||
|
#include "bgpd/bgp_ecommunity.h"
|
||||||
|
|
||||||
extern struct zclient *zclient;
|
extern struct zclient *zclient;
|
||||||
|
|
||||||
|
@ -321,7 +322,10 @@ int bgp_find_or_add_nexthop(struct bgp *bgp_route, struct bgp *bgp_nexthop,
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
srte_color = pi->attr->srte_color;
|
if (CHECK_FLAG(pi->attr->flag,
|
||||||
|
ATTR_FLAG_BIT(BGP_ATTR_SRTE_COLOR)))
|
||||||
|
srte_color = bgp_attr_get_color(pi->attr);
|
||||||
|
|
||||||
} else if (peer) {
|
} else if (peer) {
|
||||||
/*
|
/*
|
||||||
* Gather the ifindex for if up/down events to be
|
* Gather the ifindex for if up/down events to be
|
||||||
|
@ -1238,9 +1242,9 @@ void evaluate_paths(struct bgp_nexthop_cache *bnc)
|
||||||
else if (bpi_ultimate->extra)
|
else if (bpi_ultimate->extra)
|
||||||
bpi_ultimate->extra->igpmetric = 0;
|
bpi_ultimate->extra->igpmetric = 0;
|
||||||
|
|
||||||
if (CHECK_FLAG(bnc->change_flags, BGP_NEXTHOP_METRIC_CHANGED)
|
if (CHECK_FLAG(bnc->change_flags, BGP_NEXTHOP_METRIC_CHANGED) ||
|
||||||
|| CHECK_FLAG(bnc->change_flags, BGP_NEXTHOP_CHANGED)
|
CHECK_FLAG(bnc->change_flags, BGP_NEXTHOP_CHANGED) ||
|
||||||
|| path->attr->srte_color != 0)
|
bgp_attr_get_color(path->attr))
|
||||||
SET_FLAG(path->flags, BGP_PATH_IGP_CHANGED);
|
SET_FLAG(path->flags, BGP_PATH_IGP_CHANGED);
|
||||||
|
|
||||||
path_valid = CHECK_FLAG(path->flags, BGP_PATH_VALID);
|
path_valid = CHECK_FLAG(path->flags, BGP_PATH_VALID);
|
||||||
|
|
|
@ -1440,7 +1440,7 @@ void bgp_zebra_announce(struct bgp_dest *dest, const struct prefix *p,
|
||||||
|
|
||||||
if (CHECK_FLAG(info->attr->flag,
|
if (CHECK_FLAG(info->attr->flag,
|
||||||
ATTR_FLAG_BIT(BGP_ATTR_SRTE_COLOR)))
|
ATTR_FLAG_BIT(BGP_ATTR_SRTE_COLOR)))
|
||||||
api_nh->srte_color = info->attr->srte_color;
|
api_nh->srte_color = bgp_attr_get_color(info->attr);
|
||||||
|
|
||||||
if (bgp_debug_zebra(&api.prefix)) {
|
if (bgp_debug_zebra(&api.prefix)) {
|
||||||
if (mpinfo->extra) {
|
if (mpinfo->extra) {
|
||||||
|
|
Loading…
Reference in a new issue