summaryrefslogtreecommitdiffstats
path: root/bgpd
diff options
context:
space:
mode:
authorDaniel Walton <dwalton76@gmail.com>2015-10-22 11:35:20 +0300
committerDonald Sharp <sharpd@cumulusnetworks.com>2015-12-08 14:12:09 -0500
commit0d7435f2138955b4b8aa9044eefbaff31ec33248 (patch)
treea7f3583dc4dbb582aa16fadc259241a661c6e8de /bgpd
parent5a2a1ec18c89daec5de6690a9b0f47c0d11a0f2d (diff)
downloadquagga-0d7435f2138955b4b8aa9044eefbaff31ec33248.tar.bz2
quagga-0d7435f2138955b4b8aa9044eefbaff31ec33248.tar.xz
bgpd: Add support for timer commands with peer-group syntax
The peer-groups parser is missing advertisement-interval and 'timers connect' Signed-off-by: Daniel Walton <dwalton@cumulusnetworks.com> Reviewed-by: Timo Teräs <timo.teras@iki.fi>
Diffstat (limited to 'bgpd')
-rw-r--r--bgpd/bgp_vty.c28
-rw-r--r--bgpd/bgpd.c104
2 files changed, 105 insertions, 27 deletions
diff --git a/bgpd/bgp_vty.c b/bgpd/bgp_vty.c
index 0b5be730..36fd263a 100644
--- a/bgpd/bgp_vty.c
+++ b/bgpd/bgp_vty.c
@@ -3379,7 +3379,7 @@ peer_timers_connect_set_vty (struct vty *vty, const char *ip_str,
struct peer *peer;
u_int32_t connect;
- peer = peer_lookup_vty (vty, ip_str);
+ peer = peer_and_group_lookup_vty (vty, ip_str);
if (! peer)
return CMD_WARNING;
@@ -3402,9 +3402,9 @@ peer_timers_connect_unset_vty (struct vty *vty, const char *ip_str)
DEFUN (neighbor_timers_connect,
neighbor_timers_connect_cmd,
- NEIGHBOR_CMD "timers connect <1-65535>",
+ NEIGHBOR_CMD2 "timers connect <1-65535>",
NEIGHBOR_STR
- NEIGHBOR_ADDR_STR
+ NEIGHBOR_ADDR_STR2
"BGP per neighbor timers\n"
"BGP connect timer\n"
"Connect timer\n")
@@ -3414,10 +3414,10 @@ DEFUN (neighbor_timers_connect,
DEFUN (no_neighbor_timers_connect,
no_neighbor_timers_connect_cmd,
- NO_NEIGHBOR_CMD "timers connect",
+ NO_NEIGHBOR_CMD2 "timers connect",
NO_STR
NEIGHBOR_STR
- NEIGHBOR_ADDR_STR
+ NEIGHBOR_ADDR_STR2
"BGP per neighbor timers\n"
"BGP connect timer\n")
{
@@ -3426,10 +3426,10 @@ DEFUN (no_neighbor_timers_connect,
ALIAS (no_neighbor_timers_connect,
no_neighbor_timers_connect_val_cmd,
- NO_NEIGHBOR_CMD "timers connect <1-65535>",
+ NO_NEIGHBOR_CMD2 "timers connect <1-65535>",
NO_STR
NEIGHBOR_STR
- NEIGHBOR_ADDR_STR
+ NEIGHBOR_ADDR_STR2
"BGP per neighbor timers\n"
"BGP connect timer\n"
"Connect timer\n")
@@ -3442,7 +3442,7 @@ peer_advertise_interval_vty (struct vty *vty, const char *ip_str,
struct peer *peer;
u_int32_t routeadv = 0;
- peer = peer_lookup_vty (vty, ip_str);
+ peer = peer_and_group_lookup_vty (vty, ip_str);
if (! peer)
return CMD_WARNING;
@@ -3459,9 +3459,9 @@ peer_advertise_interval_vty (struct vty *vty, const char *ip_str,
DEFUN (neighbor_advertise_interval,
neighbor_advertise_interval_cmd,
- NEIGHBOR_CMD "advertisement-interval <0-600>",
+ NEIGHBOR_CMD2 "advertisement-interval <0-600>",
NEIGHBOR_STR
- NEIGHBOR_ADDR_STR
+ NEIGHBOR_ADDR_STR2
"Minimum interval between sending BGP routing updates\n"
"time in seconds\n")
{
@@ -3470,10 +3470,10 @@ DEFUN (neighbor_advertise_interval,
DEFUN (no_neighbor_advertise_interval,
no_neighbor_advertise_interval_cmd,
- NO_NEIGHBOR_CMD "advertisement-interval",
+ NO_NEIGHBOR_CMD2 "advertisement-interval",
NO_STR
NEIGHBOR_STR
- NEIGHBOR_ADDR_STR
+ NEIGHBOR_ADDR_STR2
"Minimum interval between sending BGP routing updates\n")
{
return peer_advertise_interval_vty (vty, argv[0], NULL, 0);
@@ -3481,10 +3481,10 @@ DEFUN (no_neighbor_advertise_interval,
ALIAS (no_neighbor_advertise_interval,
no_neighbor_advertise_interval_val_cmd,
- NO_NEIGHBOR_CMD "advertisement-interval <0-600>",
+ NO_NEIGHBOR_CMD2 "advertisement-interval <0-600>",
NO_STR
NEIGHBOR_STR
- NEIGHBOR_ADDR_STR
+ NEIGHBOR_ADDR_STR2
"Minimum interval between sending BGP routing updates\n"
"time in seconds\n")
diff --git a/bgpd/bgpd.c b/bgpd/bgpd.c
index 734c0df4..2325f07c 100644
--- a/bgpd/bgpd.c
+++ b/bgpd/bgpd.c
@@ -922,6 +922,7 @@ static void
peer_as_change (struct peer *peer, as_t as)
{
bgp_peer_sort_t type;
+ struct peer *conf;
/* Stop peer. */
if (! CHECK_FLAG (peer->sflags, PEER_STATUS_GROUP))
@@ -946,10 +947,17 @@ peer_as_change (struct peer *peer, as_t as)
peer->local_as = peer->bgp->as;
/* Advertisement-interval reset */
- if (peer_sort (peer) == BGP_PEER_IBGP)
- peer->v_routeadv = BGP_DEFAULT_IBGP_ROUTEADV;
+ conf = NULL;
+ if (peer->group)
+ conf = peer->group->conf;
+
+ if (conf && CHECK_FLAG (conf->config, PEER_CONFIG_ROUTEADV))
+ peer->v_routeadv = conf->routeadv;
else
- peer->v_routeadv = BGP_DEFAULT_EBGP_ROUTEADV;
+ if (peer_sort (peer) == BGP_PEER_IBGP)
+ peer->v_routeadv = BGP_DEFAULT_IBGP_ROUTEADV;
+ else
+ peer->v_routeadv = BGP_DEFAULT_EBGP_ROUTEADV;
/* TTL reset */
if (peer_sort (peer) == BGP_PEER_IBGP)
@@ -1500,10 +1508,13 @@ peer_group2peer_config_copy (struct peer_group *group, struct peer *peer,
peer->v_connect = BGP_DEFAULT_CONNECT_RETRY;
/* advertisement-interval reset */
- if (peer_sort (peer) == BGP_PEER_IBGP)
- peer->v_routeadv = BGP_DEFAULT_IBGP_ROUTEADV;
+ if (CHECK_FLAG (conf->config, PEER_CONFIG_ROUTEADV))
+ peer->v_routeadv = conf->routeadv;
else
- peer->v_routeadv = BGP_DEFAULT_EBGP_ROUTEADV;
+ if (peer_sort (peer) == BGP_PEER_IBGP)
+ peer->v_routeadv = BGP_DEFAULT_IBGP_ROUTEADV;
+ else
+ peer->v_routeadv = BGP_DEFAULT_EBGP_ROUTEADV;
/* password apply */
if (conf->password && !peer->password)
@@ -1859,10 +1870,13 @@ peer_group_bind (struct bgp *bgp, union sockunion *su,
if (first_member)
{
/* Advertisement-interval reset */
- if (peer_sort (group->conf) == BGP_PEER_IBGP)
- group->conf->v_routeadv = BGP_DEFAULT_IBGP_ROUTEADV;
- else
- group->conf->v_routeadv = BGP_DEFAULT_EBGP_ROUTEADV;
+ if (! CHECK_FLAG (group->conf->config, PEER_CONFIG_ROUTEADV))
+ {
+ if (peer_sort (group->conf) == BGP_PEER_IBGP)
+ group->conf->v_routeadv = BGP_DEFAULT_IBGP_ROUTEADV;
+ else
+ group->conf->v_routeadv = BGP_DEFAULT_EBGP_ROUTEADV;
+ }
/* ebgp-multihop reset */
if (peer_sort (group->conf) == BGP_PEER_IBGP)
@@ -3341,6 +3355,9 @@ peer_timers_unset (struct peer *peer)
int
peer_timers_connect_set (struct peer *peer, u_int32_t connect)
{
+ struct peer_group *group;
+ struct listnode *node, *nnode;
+
if (peer_group_active (peer))
return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER;
@@ -3354,12 +3371,26 @@ peer_timers_connect_set (struct peer *peer, u_int32_t connect)
/* Set value to timer setting. */
peer->v_connect = connect;
+ if (! CHECK_FLAG (peer->sflags, PEER_STATUS_GROUP))
+ return 0;
+
+ /* peer-group member updates. */
+ group = peer->group;
+ for (ALL_LIST_ELEMENTS (group->peer, node, nnode, peer))
+ {
+ SET_FLAG (peer->config, PEER_CONFIG_CONNECT);
+ peer->connect = connect;
+ peer->v_connect = connect;
+ }
return 0;
}
int
peer_timers_connect_unset (struct peer *peer)
{
+ struct peer_group *group;
+ struct listnode *node, *nnode;
+
if (peer_group_active (peer))
return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER;
@@ -3370,12 +3401,26 @@ peer_timers_connect_unset (struct peer *peer)
/* Set timer setting to default value. */
peer->v_connect = BGP_DEFAULT_CONNECT_RETRY;
- return 0;
+ if (! CHECK_FLAG (peer->sflags, PEER_STATUS_GROUP))
+ return 0;
+
+ /* peer-group member updates. */
+ group = peer->group;
+ for (ALL_LIST_ELEMENTS (group->peer, node, nnode, peer))
+ {
+ UNSET_FLAG (peer->config, PEER_CONFIG_CONNECT);
+ peer->connect = 0;
+ peer->v_connect = BGP_DEFAULT_CONNECT_RETRY;
+ }
+ return 0;
}
int
peer_advertise_interval_set (struct peer *peer, u_int32_t routeadv)
{
+ struct peer_group *group;
+ struct listnode *node, *nnode;
+
if (peer_group_active (peer))
return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER;
@@ -3386,12 +3431,27 @@ peer_advertise_interval_set (struct peer *peer, u_int32_t routeadv)
peer->routeadv = routeadv;
peer->v_routeadv = routeadv;
+ if (! CHECK_FLAG (peer->sflags, PEER_STATUS_GROUP))
+ return 0;
+
+ /* peer-group member updates. */
+ group = peer->group;
+ for (ALL_LIST_ELEMENTS (group->peer, node, nnode, peer))
+ {
+ SET_FLAG (peer->config, PEER_CONFIG_ROUTEADV);
+ peer->routeadv = routeadv;
+ peer->v_routeadv = routeadv;
+ }
+
return 0;
}
int
peer_advertise_interval_unset (struct peer *peer)
{
+ struct peer_group *group;
+ struct listnode *node, *nnode;
+
if (peer_group_active (peer))
return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER;
@@ -3402,6 +3462,22 @@ peer_advertise_interval_unset (struct peer *peer)
peer->v_routeadv = BGP_DEFAULT_IBGP_ROUTEADV;
else
peer->v_routeadv = BGP_DEFAULT_EBGP_ROUTEADV;
+
+ if (! CHECK_FLAG (peer->sflags, PEER_STATUS_GROUP))
+ return 0;
+
+ /* peer-group member updates. */
+ group = peer->group;
+ for (ALL_LIST_ELEMENTS (group->peer, node, nnode, peer))
+ {
+ UNSET_FLAG (peer->config, PEER_CONFIG_ROUTEADV);
+ peer->routeadv = 0;
+
+ if (peer->sort == BGP_PEER_IBGP)
+ peer->v_routeadv = BGP_DEFAULT_IBGP_ROUTEADV;
+ else
+ peer->v_routeadv = BGP_DEFAULT_EBGP_ROUTEADV;
+ }
return 0;
}
@@ -4956,7 +5032,8 @@ bgp_config_write_peer (struct vty *vty, struct bgp *bgp,
VTY_NEWLINE);
/* advertisement-interval */
- if (CHECK_FLAG (peer->config, PEER_CONFIG_ROUTEADV))
+ if (CHECK_FLAG (peer->config, PEER_CONFIG_ROUTEADV) &&
+ ! peer_group_active (peer))
vty_out (vty, " neighbor %s advertisement-interval %d%s",
addr, peer->v_routeadv, VTY_NEWLINE);
@@ -4966,7 +5043,8 @@ bgp_config_write_peer (struct vty *vty, struct bgp *bgp,
vty_out (vty, " neighbor %s timers %d %d%s", addr,
peer->keepalive, peer->holdtime, VTY_NEWLINE);
- if (CHECK_FLAG (peer->config, PEER_CONFIG_CONNECT))
+ if (CHECK_FLAG (peer->config, PEER_CONFIG_CONNECT) &&
+ ! peer_group_active (peer))
vty_out (vty, " neighbor %s timers connect %d%s", addr,
peer->connect, VTY_NEWLINE);