|| (ri->extra && ri->extra->suppress) )
{
struct bgp_info info;
- struct attr dummy_attr = { 0 };
-
+ struct attr dummy_attr;
+ struct attr_extra dummy_extra;
+
+ dummy_attr.extra = &dummy_extra;
+
info.peer = peer;
info.attr = attr;
ret = route_map_apply (ROUTE_MAP_OUT (filter), p, RMAP_BGP, &info);
peer->rmap_type = 0;
-
- if (dummy_attr.extra)
- bgp_attr_extra_free (&dummy_attr);
-
+
if (ret == RMAP_DENYMATCH)
{
bgp_attr_flush (attr);
if (p->family == AF_INET6)
{
struct attr_extra *attre = attr->extra;
-
- assert (attr->extra);
-
+
/* Left nexthop_local unchanged if so configured. */
if ( CHECK_FLAG (rsclient->af_flags[afi][safi],
PEER_FLAG_NEXTHOP_LOCAL_UNCHANGED) )
struct bgp_node *rn, afi_t afi, safi_t safi)
{
struct prefix *p;
- struct attr attr = { 0 };
+ struct attr attr;
+ struct attr_extra extra;
p = &rn->p;
PEER_STATUS_ORF_WAIT_REFRESH))
return 0;
+ /* It's initialized in bgp_announce_[check|check_rsclient]() */
+ attr.extra = &extra;
+
switch (rn->table->type)
{
case BGP_TABLE_MAIN:
bgp_adj_out_unset (rn, peer, p, afi, safi);
break;
}
-
- bgp_attr_extra_free (&attr);
-
+
return 0;
}
{
struct bgp_node *rn;
struct bgp *bgp;
- struct attr new_attr = { 0 };
+ struct attr new_attr;
+ struct attr_extra new_extra;
struct attr *attr_new;
struct attr *attr_new2;
struct bgp_info *ri;
goto filtered;
}
+ new_attr.extra = &new_extra;
bgp_attr_dup (&new_attr, attr);
/* Apply export policy. */
goto filtered;
}
}
-
- /* new_attr isn't passed to any functions after here */
- bgp_attr_extra_free (&new_attr);
-
+
/* If the update is implicit withdraw. */
if (ri)
{
/* Process change. */
bgp_process (bgp, rn, afi, safi);
-
- bgp_attr_extra_free (&new_attr);
-
+
return;
filtered:
bgp_rib_remove (rn, ri, peer, afi, safi);
bgp_unlock_node (rn);
-
- if (new_attr.extra)
- bgp_attr_extra_free (&new_attr);
-
+
return;
}
int aspath_loop_count = 0;
struct bgp_node *rn;
struct bgp *bgp;
- struct attr new_attr = { 0 };
+ struct attr new_attr;
+ struct attr_extra new_extra;
struct attr *attr_new;
struct bgp_info *ri;
struct bgp_info *new;
goto filtered;
}
- /* Apply incoming route-map. */
+ new_attr.extra = &new_extra;
bgp_attr_dup (&new_attr, attr);
+ /* Apply incoming route-map. */
if (bgp_input_modifier (peer, p, &new_attr, afi, safi) == RMAP_DENY)
{
reason = "route-map;";
bgp_unlock_node (rn);
bgp_attr_unintern (&attr_new);
- bgp_attr_extra_free (&new_attr);
-
+
return 0;
}
if (ret == BGP_DAMP_SUPPRESSED)
{
bgp_unlock_node (rn);
- bgp_attr_extra_free (&new_attr);
return 0;
}
}
bgp_process (bgp, rn, afi, safi);
bgp_unlock_node (rn);
- bgp_attr_extra_free (&new_attr);
-
+
return 0;
}
/* route_node_get lock */
bgp_unlock_node (rn);
-
- bgp_attr_extra_free (&new_attr);
-
+
/* If maximum prefix count is configured and current prefix
count exeed it. */
if (bgp_maximum_prefix_overflow (peer, afi, safi, 0))
bgp_rib_remove (rn, ri, peer, afi, safi);
bgp_unlock_node (rn);
-
- bgp_attr_extra_free (&new_attr);
-
+
return 0;
}
{
struct bgp_node *rn;
struct bgp_info *ri;
- struct attr attr = { 0 };
-
+ struct attr attr;
+ struct attr_extra extra;
+
if (! table)
table = (rsclient) ? peer->rib[afi][safi] : peer->bgp->rib[afi][safi];
&& CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_DEFAULT_ORIGINATE))
bgp_default_originate (peer, afi, safi, 0);
+ /* It's initialized in bgp_announce_[check|check_rsclient]() */
+ attr.extra = &extra;
+
for (rn = bgp_table_top (table); rn; rn = bgp_route_next(rn))
for (ri = rn->info; ri; ri = ri->next)
if (CHECK_FLAG (ri->flags, BGP_INFO_SELECTED) && ri->peer != peer)
bgp_adj_out_set (rn, peer, &rn->p, &attr, afi, safi, ri);
else
bgp_adj_out_unset (rn, peer, &rn->p, afi, safi);
-
- bgp_attr_extra_free (&attr);
}
}
struct bgp_info info;
struct attr *attr_new;
struct attr attr;
- struct attr new_attr = { 0 };
+ struct attr new_attr;
+ struct attr_extra new_extra;
struct bgp *bgp;
int ret;
char buf[SU_ADDRSTRLEN];
}
else
attr_new = bgp_attr_intern (&attr);
-
+
+ new_attr.extra = &new_extra;
bgp_attr_dup(&new_attr, attr_new);
SET_FLAG (bgp->peer_self->rmap_type, PEER_RMAP_TYPE_NETWORK);
bgp_attr_unintern (&attr_new);
attr_new = bgp_attr_intern (&new_attr);
- bgp_attr_extra_free (&new_attr);
for (ri = rn->info; ri; ri = ri->next)
if (ri->peer == bgp->peer_self && ri->type == ZEBRA_ROUTE_BGP
struct bgp_info info;
struct bgp_node *bn;
struct attr attr;
- struct attr attr_new = { 0 };
struct attr *new_attr;
afi_t afi;
int ret;
if (bgp->redist[afi][type])
{
+ struct attr attr_new;
+ struct attr_extra extra_new;
+
/* Copy attribute for modification. */
+ attr_new.extra = &extra_new;
bgp_attr_dup (&attr_new, &attr);
if (bgp->redist_metric_flag[afi][type])
{
/* Free uninterned attribute. */
bgp_attr_flush (&attr_new);
- bgp_attr_extra_free (&attr_new);
-
+
/* Unintern original. */
aspath_unintern (&attr.aspath);
bgp_attr_extra_free (&attr);
afi, SAFI_UNICAST, p, NULL);
new_attr = bgp_attr_intern (&attr_new);
- bgp_attr_extra_free (&attr_new);
-
+
for (bi = bn->info; bi; bi = bi->next)
if (bi->peer == bgp->peer_self
&& bi->sub_type == BGP_ROUTE_REDISTRIBUTE)
{
struct route_map *rmap = output_arg;
struct bgp_info binfo;
- struct attr dummy_attr = { 0 };
+ struct attr dummy_attr;
+ struct attr_extra dummy_extra;
int ret;
+ dummy_attr.extra = &dummy_extra;
bgp_attr_dup (&dummy_attr, ri->attr);
+
binfo.peer = ri->peer;
binfo.attr = &dummy_attr;
ret = route_map_apply (rmap, &rn->p, RMAP_BGP, &binfo);
-
- bgp_attr_extra_free (&dummy_attr);
-
if (ret == RMAP_DENYMATCH)
continue;
}