diff options
| author | Daniel Walton <dwalton@cumulusnetworks.com> | 2017-04-05 15:19:00 +0000 |
|---|---|---|
| committer | Daniel Walton <dwalton@cumulusnetworks.com> | 2017-04-05 15:19:00 +0000 |
| commit | 9c41e88cc336e3d76087834bad5975140451916c (patch) | |
| tree | 1b22e5b71e265ccd96eb182cacd0f8c3ccc0fa3d | |
| parent | b3cfe637a66a5de00c72125f5fa051155ccb4a29 (diff) | |
bgpd: removing "allowas-in" for peer-group member still allows AS_PATHS
with our ASN
Signed-off-by: Daniel Walton <dwalton@cumulusnetworks.com>
Reviewed-by: Don Slice <dslice@cumulusnetworks.com>
| -rw-r--r-- | bgpd/bgpd.c | 35 |
1 files changed, 20 insertions, 15 deletions
diff --git a/bgpd/bgpd.c b/bgpd/bgpd.c index 1733f2956c..36483f0307 100644 --- a/bgpd/bgpd.c +++ b/bgpd/bgpd.c @@ -5013,8 +5013,28 @@ int peer_allowas_in_unset (struct peer *peer, afi_t afi, safi_t safi) { struct peer_group *group; + struct peer *tmp_peer; struct listnode *node, *nnode; + /* If this is a peer-group we must first clear the flags for all of the + * peer-group members + */ + if (CHECK_FLAG (peer->sflags, PEER_STATUS_GROUP)) + { + group = peer->group; + for (ALL_LIST_ELEMENTS (group->peer, node, nnode, tmp_peer)) + { + if (CHECK_FLAG (tmp_peer->af_flags[afi][safi], PEER_FLAG_ALLOWAS_IN) || + CHECK_FLAG (tmp_peer->af_flags[afi][safi], PEER_FLAG_ALLOWAS_IN_ORIGIN)) + { + tmp_peer->allowas_in[afi][safi] = 0; + peer_af_flag_unset (tmp_peer, afi, safi, PEER_FLAG_ALLOWAS_IN); + peer_af_flag_unset (tmp_peer, afi, safi, PEER_FLAG_ALLOWAS_IN_ORIGIN); + peer_on_policy_change (tmp_peer, afi, safi, 0); + } + } + } + if (CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_ALLOWAS_IN) || CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_ALLOWAS_IN_ORIGIN)) { @@ -5024,21 +5044,6 @@ peer_allowas_in_unset (struct peer *peer, afi_t afi, safi_t safi) peer_on_policy_change (peer, afi, safi, 0); } - if (! CHECK_FLAG (peer->sflags, PEER_STATUS_GROUP)) - return 0; - - group = peer->group; - for (ALL_LIST_ELEMENTS (group->peer, node, nnode, peer)) - { - if (CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_ALLOWAS_IN) || - CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_ALLOWAS_IN_ORIGIN)) - { - peer->allowas_in[afi][safi] = 0; - peer_af_flag_unset (peer, afi, safi, PEER_FLAG_ALLOWAS_IN); - peer_af_flag_unset (peer, afi, safi, PEER_FLAG_ALLOWAS_IN_ORIGIN); - peer_on_policy_change (peer, afi, safi, 0); - } - } return 0; } |
