MIX(ecommunity_hash_make(attr->ecommunity));
if (bgp_attr_get_ipv6_ecommunity(attr))
MIX(ecommunity_hash_make(bgp_attr_get_ipv6_ecommunity(attr)));
- if (attr->cluster)
- MIX(cluster_hash_key_make(attr->cluster));
+ if (bgp_attr_get_cluster(attr))
+ MIX(cluster_hash_key_make(bgp_attr_get_cluster(attr)));
if (bgp_attr_get_transit(attr))
MIX(transit_hash_key_make(bgp_attr_get_transit(attr)));
if (attr->encap_subtlvs)
&& bgp_attr_get_ipv6_ecommunity(attr1)
== bgp_attr_get_ipv6_ecommunity(attr2)
&& attr1->lcommunity == attr2->lcommunity
- && attr1->cluster == attr2->cluster
+ && bgp_attr_get_cluster(attr1)
+ == bgp_attr_get_cluster(attr2)
&& bgp_attr_get_transit(attr1)
== bgp_attr_get_transit(attr2)
&& attr1->rmap_table_id == attr2->rmap_table_id
else
attr->lcommunity->refcnt++;
}
- if (attr->cluster) {
- if (!attr->cluster->refcnt)
- attr->cluster = cluster_intern(attr->cluster);
+
+ struct cluster_list *cluster = bgp_attr_get_cluster(attr);
+
+ if (cluster) {
+ if (!cluster->refcnt)
+ bgp_attr_set_cluster(attr, cluster_intern(cluster));
else
- attr->cluster->refcnt++;
+ cluster->refcnt++;
}
struct transit *transit = bgp_attr_get_transit(attr);
void bgp_attr_unintern_sub(struct attr *attr)
{
struct ecommunity *ecomm;
+ struct cluster_list *cluster;
/* aspath refcount shoud be decrement. */
if (attr->aspath)
lcommunity_unintern(&attr->lcommunity);
UNSET_FLAG(attr->flag, ATTR_FLAG_BIT(BGP_ATTR_LARGE_COMMUNITIES));
- if (attr->cluster)
- cluster_unintern(&attr->cluster);
+ cluster = bgp_attr_get_cluster(attr);
+ if (cluster) {
+ cluster_unintern(&cluster);
+ bgp_attr_set_cluster(attr, cluster);
+ }
UNSET_FLAG(attr->flag, ATTR_FLAG_BIT(BGP_ATTR_CLUSTER_LIST));
struct transit *transit = bgp_attr_get_transit(attr);
void bgp_attr_flush(struct attr *attr)
{
struct ecommunity *ecomm;
+ struct cluster_list *cluster;
if (attr->aspath && !attr->aspath->refcnt) {
aspath_free(attr->aspath);
bgp_attr_set_ipv6_ecommunity(attr, NULL);
if (attr->lcommunity && !attr->lcommunity->refcnt)
lcommunity_free(&attr->lcommunity);
- if (attr->cluster && !attr->cluster->refcnt) {
- cluster_free(attr->cluster);
- attr->cluster = NULL;
+
+ cluster = bgp_attr_get_cluster(attr);
+ if (cluster && !cluster->refcnt) {
+ cluster_free(cluster);
+ bgp_attr_set_cluster(attr, NULL);
}
struct transit *transit = bgp_attr_get_transit(attr);
args->total);
}
- attr->cluster =
- cluster_parse((struct in_addr *)stream_pnt(peer->curr), length);
+ bgp_attr_set_cluster(
+ attr, cluster_parse((struct in_addr *)stream_pnt(peer->curr),
+ length));
/* XXX: Fix cluster_parse to use stream API and then remove this */
stream_forward_getp(peer->curr, length);
/* Route Reflector. */
if (peer->sort == BGP_PEER_IBGP && from
&& from->sort == BGP_PEER_IBGP) {
+ struct cluster_list *cluster = bgp_attr_get_cluster(attr);
+
/* Originator ID. */
stream_putc(s, BGP_ATTR_FLAG_OPTIONAL);
stream_putc(s, BGP_ATTR_ORIGINATOR_ID);
stream_putc(s, BGP_ATTR_FLAG_OPTIONAL);
stream_putc(s, BGP_ATTR_CLUSTER_LIST);
- if (attr->cluster) {
- stream_putc(s, attr->cluster->length + 4);
+ if (cluster) {
+ stream_putc(s, cluster->length + 4);
/* If this peer configuration's parent BGP has
* cluster_id. */
if (bgp->config & BGP_CONFIG_CLUSTER_ID)
stream_put_in_addr(s, &bgp->cluster_id);
else
stream_put_in_addr(s, &bgp->router_id);
- stream_put(s, attr->cluster->list,
- attr->cluster->length);
+ stream_put(s, cluster->list, cluster->length);
} else {
stream_putc(s, 4);
/* If this peer configuration's parent BGP has
", originator %pI4", &attr->originator_id);
if (CHECK_FLAG(attr->flag, ATTR_FLAG_BIT(BGP_ATTR_CLUSTER_LIST))) {
+ struct cluster_list *cluster;
int i;
snprintf(buf + strlen(buf), size - strlen(buf),
", clusterlist");
- for (i = 0; i < attr->cluster->length / 4; i++)
+
+ cluster = bgp_attr_get_cluster(attr);
+ for (i = 0; i < cluster->length / 4; i++)
snprintfrr(buf + strlen(buf), size - strlen(buf),
- " %pI4", &attr->cluster->list[i]);
+ " %pI4", &cluster->list[i]);
}
if (CHECK_FLAG(attr->flag, ATTR_FLAG_BIT(BGP_ATTR_PMSI_TUNNEL)))
static bool bgp_cluster_filter(struct peer *peer, struct attr *attr)
{
struct in_addr cluster_id;
+ struct cluster_list *cluster = bgp_attr_get_cluster(attr);
- if (attr->cluster) {
+ if (cluster) {
if (peer->bgp->config & BGP_CONFIG_CLUSTER_ID)
cluster_id = peer->bgp->cluster_id;
else
cluster_id = peer->bgp->router_id;
- if (cluster_loop_check(attr->cluster, cluster_id))
+ if (cluster_loop_check(cluster, cluster_id))
return true;
}
return false;
}
if (attr->flag & ATTR_FLAG_BIT(BGP_ATTR_CLUSTER_LIST)) {
+ struct cluster_list *cluster =
+ bgp_attr_get_cluster(attr);
int i;
if (json_paths) {
json_cluster_list_list =
json_object_new_array();
- for (i = 0; i < attr->cluster->length / 4;
- i++) {
+ for (i = 0; i < cluster->length / 4; i++) {
json_string = json_object_new_string(
- inet_ntop(
- AF_INET,
- &attr->cluster->list[i],
- buf, sizeof(buf)));
+ inet_ntop(AF_INET,
+ &cluster->list[i],
+ buf, sizeof(buf)));
json_object_array_add(
json_cluster_list_list,
json_string);
* do. Add this someday if someone asks
* for it.
* json_object_string_add(json_cluster_list,
- * "string", attr->cluster->str);
+ * "string", cluster->str);
*/
json_object_object_add(json_cluster_list,
"list",
} else {
vty_out(vty, ", Cluster list: ");
- for (i = 0; i < attr->cluster->length / 4;
- i++) {
+ for (i = 0; i < cluster->length / 4; i++) {
vty_out(vty, "%pI4 ",
- &attr->cluster->list[i]);
+ &cluster->list[i]);
}
}
}
void *out;
const char *vty_newline;
struct transit *transit;
+ struct cluster_list *cluster;
char buf[BUFSIZ];
if (rfapiStream2Vty(stream, &fp, &vty, &out, &vty_newline) == 0)
fp(out, " ecommunity=%p, refcnt=%d%s", attr->ecommunity,
(attr->ecommunity ? attr->ecommunity->refcnt : 0), HVTYNL);
- fp(out, " cluster=%p, refcnt=%d%s", attr->cluster,
- (attr->cluster ? attr->cluster->refcnt : 0), HVTYNL);
+
+ cluster = bgp_attr_get_cluster(attr);
+ fp(out, " cluster=%p, refcnt=%d%s", cluster,
+ (cluster ? cluster->refcnt : 0), HVTYNL);
transit = bgp_attr_get_transit(attr);
fp(out, " transit=%p, refcnt=%d%s", transit,