summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--bgpd/bgp_fsm.c9
-rw-r--r--bgpd/bgp_nht.c4
-rw-r--r--bgpd/bgp_route.c19
-rw-r--r--bgpd/bgp_snmp.c14
-rw-r--r--bgpd/bgp_vty.c39
-rw-r--r--bgpd/bgpd.c619
-rw-r--r--bgpd/bgpd.h17
-rw-r--r--lib/libospf.h6
-rwxr-xr-xtools/quagga-reload.py21
-rw-r--r--vtysh/vtysh_config.c9
-rw-r--r--zebra/rt_netlink.c12
-rw-r--r--zebra/zebra_rib.c4
12 files changed, 412 insertions, 361 deletions
diff --git a/bgpd/bgp_fsm.c b/bgpd/bgp_fsm.c
index bd13e1c4b9..c8605da956 100644
--- a/bgpd/bgp_fsm.c
+++ b/bgpd/bgp_fsm.c
@@ -143,7 +143,6 @@ peer_xfer_conn(struct peer *from_peer)
peer->as = from_peer->as;
peer->v_holdtime = from_peer->v_holdtime;
peer->v_keepalive = from_peer->v_keepalive;
- peer->v_asorig = from_peer->v_asorig;
peer->routeadv = from_peer->routeadv;
peer->v_routeadv = from_peer->v_routeadv;
peer->v_gr_restart = from_peer->v_gr_restart;
@@ -236,7 +235,6 @@ bgp_timer_set (struct peer *peer)
BGP_TIMER_OFF (peer->t_connect);
BGP_TIMER_OFF (peer->t_holdtime);
BGP_TIMER_OFF (peer->t_keepalive);
- BGP_TIMER_OFF (peer->t_asorig);
BGP_TIMER_OFF (peer->t_routeadv);
break;
@@ -248,7 +246,6 @@ bgp_timer_set (struct peer *peer)
BGP_TIMER_ON (peer->t_connect, bgp_connect_timer, peer->v_connect);
BGP_TIMER_OFF (peer->t_holdtime);
BGP_TIMER_OFF (peer->t_keepalive);
- BGP_TIMER_OFF (peer->t_asorig);
BGP_TIMER_OFF (peer->t_routeadv);
break;
@@ -268,7 +265,6 @@ bgp_timer_set (struct peer *peer)
}
BGP_TIMER_OFF (peer->t_holdtime);
BGP_TIMER_OFF (peer->t_keepalive);
- BGP_TIMER_OFF (peer->t_asorig);
BGP_TIMER_OFF (peer->t_routeadv);
break;
@@ -286,7 +282,6 @@ bgp_timer_set (struct peer *peer)
BGP_TIMER_OFF (peer->t_holdtime);
}
BGP_TIMER_OFF (peer->t_keepalive);
- BGP_TIMER_OFF (peer->t_asorig);
BGP_TIMER_OFF (peer->t_routeadv);
break;
@@ -309,7 +304,6 @@ bgp_timer_set (struct peer *peer)
BGP_TIMER_ON (peer->t_keepalive, bgp_keepalive_timer,
peer->v_keepalive);
}
- BGP_TIMER_OFF (peer->t_asorig);
BGP_TIMER_OFF (peer->t_routeadv);
break;
@@ -333,7 +327,6 @@ bgp_timer_set (struct peer *peer)
BGP_TIMER_ON (peer->t_keepalive, bgp_keepalive_timer,
peer->v_keepalive);
}
- BGP_TIMER_OFF (peer->t_asorig);
break;
case Deleted:
BGP_TIMER_OFF (peer->t_gr_restart);
@@ -344,7 +337,6 @@ bgp_timer_set (struct peer *peer)
BGP_TIMER_OFF (peer->t_connect);
BGP_TIMER_OFF (peer->t_holdtime);
BGP_TIMER_OFF (peer->t_keepalive);
- BGP_TIMER_OFF (peer->t_asorig);
BGP_TIMER_OFF (peer->t_routeadv);
break;
}
@@ -1072,7 +1064,6 @@ bgp_stop (struct peer *peer)
BGP_TIMER_OFF (peer->t_connect);
BGP_TIMER_OFF (peer->t_holdtime);
BGP_TIMER_OFF (peer->t_keepalive);
- BGP_TIMER_OFF (peer->t_asorig);
BGP_TIMER_OFF (peer->t_routeadv);
/* Stream reset. */
diff --git a/bgpd/bgp_nht.c b/bgpd/bgp_nht.c
index ab4effcb1e..70a4309628 100644
--- a/bgpd/bgp_nht.c
+++ b/bgpd/bgp_nht.c
@@ -175,14 +175,14 @@ bgp_find_or_add_nexthop (struct bgp *bgp, afi_t afi, struct bgp_info *ri,
SET_FLAG(bnc->flags, BGP_STATIC_ROUTE);
/* If we're toggling the type, re-register */
- if ((bgp_flag_check(bgp, BGP_FLAG_IMPORT_CHECK_EXACT_MATCH)) &&
+ if ((bgp_flag_check(bgp, BGP_FLAG_IMPORT_CHECK)) &&
!CHECK_FLAG(bnc->flags, BGP_STATIC_ROUTE_EXACT_MATCH))
{
SET_FLAG(bnc->flags, BGP_STATIC_ROUTE_EXACT_MATCH);
UNSET_FLAG(bnc->flags, BGP_NEXTHOP_REGISTERED);
UNSET_FLAG(bnc->flags, BGP_NEXTHOP_VALID);
}
- else if ((!bgp_flag_check(bgp, BGP_FLAG_IMPORT_CHECK_EXACT_MATCH)) &&
+ else if ((!bgp_flag_check(bgp, BGP_FLAG_IMPORT_CHECK)) &&
CHECK_FLAG(bnc->flags, BGP_STATIC_ROUTE_EXACT_MATCH))
{
UNSET_FLAG(bnc->flags, BGP_STATIC_ROUTE_EXACT_MATCH);
diff --git a/bgpd/bgp_route.c b/bgpd/bgp_route.c
index 42613d49b5..fafb29943f 100644
--- a/bgpd/bgp_route.c
+++ b/bgpd/bgp_route.c
@@ -2199,9 +2199,12 @@ bgp_process_queue_init (void)
/* Use a higher yield value of 50ms for main queue processing */
bm->process_main_queue->spec.yield = 50 * 1000L;
- memcpy (bm->process_rsclient_queue, bm->process_main_queue,
- sizeof (struct work_queue));
bm->process_rsclient_queue->spec.workfunc = &bgp_process_rsclient;
+ bm->process_rsclient_queue->spec.del_item_data = &bgp_processq_del;
+ bm->process_rsclient_queue->spec.max_retries = 0;
+ bm->process_rsclient_queue->spec.hold = 50;
+ /* Use a higher yield value of 50ms for main queue processing */
+ bm->process_rsclient_queue->spec.yield = 50 * 1000L;
}
void
@@ -4849,7 +4852,7 @@ bgp_config_write_table_map (struct vty *vty, struct bgp *bgp, afi_t afi,
if (bgp->table_map[afi][safi].name)
{
bgp_config_write_family_header (vty, afi, safi, write);
- vty_out (vty, " table-map %s%s",
+ vty_out (vty, " table-map %s%s",
bgp->table_map[afi][safi].name, VTY_NEWLINE);
}
@@ -15141,7 +15144,7 @@ bgp_config_write_network_vpnv4 (struct vty *vty, struct bgp *bgp,
prefix_rd2str (prd, rdbuf, RD_ADDRSTRLEN);
label = decode_label (bgp_static->tag);
- vty_out (vty, " network %s/%d rd %s tag %d",
+ vty_out (vty, " network %s/%d rd %s tag %d",
inet_ntop (p->family, &p->u.prefix, buf, SU_ADDRSTRLEN),
p->prefixlen,
rdbuf, label);
@@ -15182,7 +15185,7 @@ bgp_config_write_network (struct vty *vty, struct bgp *bgp,
destination = ntohl (p->u.prefix4.s_addr);
masklen2ip (p->prefixlen, &netmask);
- vty_out (vty, " network %s",
+ vty_out (vty, " network %s",
inet_ntop (p->family, &p->u.prefix, buf, SU_ADDRSTRLEN));
if ((IN_CLASSC (destination) && p->prefixlen == 24)
@@ -15197,7 +15200,7 @@ bgp_config_write_network (struct vty *vty, struct bgp *bgp,
}
else
{
- vty_out (vty, " network %s/%d",
+ vty_out (vty, " network %s/%d",
inet_ntop (p->family, &p->u.prefix, buf, SU_ADDRSTRLEN),
p->prefixlen);
}
@@ -15227,13 +15230,13 @@ bgp_config_write_network (struct vty *vty, struct bgp *bgp,
struct in_addr netmask;
masklen2ip (p->prefixlen, &netmask);
- vty_out (vty, " aggregate-address %s %s",
+ vty_out (vty, " aggregate-address %s %s",
inet_ntop (p->family, &p->u.prefix, buf, SU_ADDRSTRLEN),
inet_ntoa (netmask));
}
else
{
- vty_out (vty, " aggregate-address %s/%d",
+ vty_out (vty, " aggregate-address %s/%d",
inet_ntop (p->family, &p->u.prefix, buf, SU_ADDRSTRLEN),
p->prefixlen);
}
diff --git a/bgpd/bgp_snmp.c b/bgpd/bgp_snmp.c
index 79aaa03a6e..0d1aa4df84 100644
--- a/bgpd/bgp_snmp.c
+++ b/bgpd/bgp_snmp.c
@@ -74,9 +74,8 @@ Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
#define BGPPEERKEEPALIVE 19
#define BGPPEERHOLDTIMECONFIGURED 20
#define BGPPEERKEEPALIVECONFIGURED 21
-#define BGPPEERMINASORIGINATIONINTERVAL 22
-#define BGPPEERMINROUTEADVERTISEMENTINTERVAL 23
-#define BGPPEERINUPDATEELAPSEDTIME 24
+#define BGPPEERMINROUTEADVERTISEMENTINTERVAL 22
+#define BGPPEERINUPDATEELAPSEDTIME 23
/* BGP MIB bgpIdentifier. */
#define BGPIDENTIFIER 0
@@ -189,8 +188,6 @@ struct variable bgp_variables[] =
3, {3, 1, 20}},
{BGPPEERKEEPALIVECONFIGURED, INTEGER, RWRITE, bgpPeerTable,
3, {3, 1, 21}},
- {BGPPEERMINASORIGINATIONINTERVAL, INTEGER, RWRITE, bgpPeerTable,
- 3, {3, 1, 22}},
{BGPPEERMINROUTEADVERTISEMENTINTERVAL, INTEGER, RWRITE, bgpPeerTable,
3, {3, 1, 23}},
{BGPPEERINUPDATEELAPSEDTIME, GAUGE32, RONLY, bgpPeerTable,
@@ -438,9 +435,6 @@ write_bgpPeerTable (int action, u_char *var_val,
peer->keepalive = intval;
peer->v_keepalive = intval;
break;
- case BGPPEERMINASORIGINATIONINTERVAL:
- peer->v_asorig = intval;
- break;
case BGPPEERMINROUTEADVERTISEMENTINTERVAL:
peer->v_routeadv = intval;
break;
@@ -569,10 +563,6 @@ bgpPeerTable (struct variable *v, oid name[], size_t *length,
else
return SNMP_INTEGER (peer->v_keepalive);
break;
- case BGPPEERMINASORIGINATIONINTERVAL:
- *write_method = write_bgpPeerTable;
- return SNMP_INTEGER (peer->v_asorig);
- break;
case BGPPEERMINROUTEADVERTISEMENTINTERVAL:
*write_method = write_bgpPeerTable;
return SNMP_INTEGER (peer->v_routeadv);
diff --git a/bgpd/bgp_vty.c b/bgpd/bgp_vty.c
index d2c0a41bab..bd124aa783 100644
--- a/bgpd/bgp_vty.c
+++ b/bgpd/bgp_vty.c
@@ -1466,14 +1466,14 @@ bgp_config_write_maxpaths (struct vty *vty, struct bgp *bgp, afi_t afi,
if (bgp->maxpaths[afi][safi].maxpaths_ebgp != BGP_DEFAULT_MAXPATHS)
{
bgp_config_write_family_header (vty, afi, safi, write);
- vty_out (vty, " maximum-paths %d%s",
+ vty_out (vty, " maximum-paths %d%s",
bgp->maxpaths[afi][safi].maxpaths_ebgp, VTY_NEWLINE);
}
if (bgp->maxpaths[afi][safi].maxpaths_ibgp != BGP_DEFAULT_MAXPATHS)
{
bgp_config_write_family_header (vty, afi, safi, write);
- vty_out (vty, " maximum-paths ibgp %d",
+ vty_out (vty, " maximum-paths ibgp %d",
bgp->maxpaths[afi][safi].maxpaths_ibgp);
if (CHECK_FLAG (bgp->maxpaths[afi][safi].ibgp_flags,
BGP_FLAG_IBGP_MULTIPATH_SAME_CLUSTERLEN))
@@ -2153,45 +2153,26 @@ DEFUN (no_bgp_default_show_hostname,
/* "bgp import-check" configuration. */
DEFUN (bgp_network_import_check,
bgp_network_import_check_cmd,
- "bgp network import-check {exact}",
+ "bgp network import-check",
"BGP specific commands\n"
"BGP network command\n"
- "Check BGP network route exists in IGP\n"
- "Match route precisely")
+ "Check BGP network route exists in IGP\n")
{
struct bgp *bgp;
- int trigger = 0;
bgp = vty->index;
if (!bgp_flag_check(bgp, BGP_FLAG_IMPORT_CHECK))
{
bgp_flag_set (bgp, BGP_FLAG_IMPORT_CHECK);
- trigger = 1;
- }
-
- if (argv[0] != NULL)
- {
- if (!bgp_flag_check(bgp, BGP_FLAG_IMPORT_CHECK_EXACT_MATCH))
- {
- bgp_flag_set (bgp, BGP_FLAG_IMPORT_CHECK_EXACT_MATCH);
- trigger = 1;
- }
- }
- else if (bgp_flag_check(bgp, BGP_FLAG_IMPORT_CHECK_EXACT_MATCH))
- {
- bgp_flag_unset (bgp, BGP_FLAG_IMPORT_CHECK_EXACT_MATCH);
- trigger = 1;
+ bgp_static_redo_import_check(bgp);
}
- if (trigger)
- bgp_static_redo_import_check(bgp);
-
return CMD_SUCCESS;
}
DEFUN (no_bgp_network_import_check,
no_bgp_network_import_check_cmd,
- "no bgp network import-check {exact}",
+ "no bgp network import-check",
NO_STR
"BGP specific commands\n"
"BGP network command\n"
@@ -2203,9 +2184,9 @@ DEFUN (no_bgp_network_import_check,
if (bgp_flag_check(bgp, BGP_FLAG_IMPORT_CHECK))
{
bgp_flag_unset (bgp, BGP_FLAG_IMPORT_CHECK);
- bgp_flag_unset (bgp, BGP_FLAG_IMPORT_CHECK_EXACT_MATCH);
bgp_static_redo_import_check(bgp);
}
+
return CMD_SUCCESS;
}
@@ -4836,7 +4817,7 @@ peer_timers_connect_unset_vty (struct vty *vty, const char *ip_str)
DEFUN (neighbor_timers_connect,
neighbor_timers_connect_cmd,
- NEIGHBOR_CMD2 "timers connect <0-65535>",
+ NEIGHBOR_CMD2 "timers connect <1-65535>",
NEIGHBOR_STR
NEIGHBOR_ADDR_STR2
"BGP per neighbor timers\n"
@@ -4860,7 +4841,7 @@ DEFUN (no_neighbor_timers_connect,
ALIAS (no_neighbor_timers_connect,
no_neighbor_timers_connect_val_cmd,
- NO_NEIGHBOR_CMD2 "timers connect <0-65535>",
+ NO_NEIGHBOR_CMD2 "timers connect <1-65535>",
NO_STR
NEIGHBOR_STR
NEIGHBOR_ADDR_STR2
@@ -12459,7 +12440,7 @@ bgp_config_write_redistribute (struct vty *vty, struct bgp *bgp, afi_t afi,
bgp_config_write_family_header (vty, afi, safi, write);
/* "redistribute" configuration. */
- vty_out (vty, " redistribute %s", zebra_route_string(i));
+ vty_out (vty, " redistribute %s", zebra_route_string(i));
if (red->instance)
vty_out (vty, " %d", red->instance);
if (red->redist_metric_flag)
diff --git a/bgpd/bgpd.c b/bgpd/bgpd.c
index 8ba772be1b..cdbe75c2e2 100644
--- a/bgpd/bgpd.c
+++ b/bgpd/bgpd.c
@@ -822,7 +822,6 @@ peer_global_config_reset (struct peer *peer)
/* Reset some other configs back to defaults. */
peer->v_start = BGP_INIT_START_TIMER;
- peer->v_asorig = BGP_DEFAULT_ASORIGINATE;
peer->password = NULL;
peer->local_id = peer->bgp->router_id;
peer->v_holdtime = peer->bgp->default_holdtime;
@@ -1029,7 +1028,6 @@ peer_new (struct bgp *bgp)
peer->fd = -1;
peer->v_start = BGP_INIT_START_TIMER;
peer->v_connect = BGP_DEFAULT_CONNECT_RETRY;
- peer->v_asorig = BGP_DEFAULT_ASORIGINATE;
peer->status = Idle;
peer->ostatus = Idle;
peer->cur_event = peer->last_event = peer->last_major_event = 0;
@@ -1119,7 +1117,6 @@ peer_xfer_config (struct peer *peer_dst, struct peer *peer_src)
peer_dst->connect = peer_src->connect;
peer_dst->v_holdtime = peer_src->v_holdtime;
peer_dst->v_keepalive = peer_src->v_keepalive;
- peer_dst->v_asorig = peer_src->v_asorig;
peer_dst->routeadv = peer_src->routeadv;
peer_dst->v_routeadv = peer_src->v_routeadv;
@@ -2701,6 +2698,9 @@ bgp_create (as_t *as, const char *name)
bgp->stalepath_time = BGP_DEFAULT_STALEPATH_TIME;
bgp->dynamic_neighbors_limit = BGP_DYNAMIC_NEIGHBORS_LIMIT_DEFAULT;
bgp->dynamic_neighbors_count = 0;
+ bgp_flag_set (bgp, BGP_FLAG_IMPORT_CHECK);
+ bgp_flag_set (bgp, BGP_FLAG_SHOW_HOSTNAME);
+ bgp_flag_set (bgp, BGP_FLAG_LOG_NEIGHBOR_CHANGES);
bgp->as = *as;
@@ -6062,61 +6062,61 @@ bgp_config_write_filter (struct vty *vty, struct peer *peer,
if (filter->dlist[in].name)
if (! gfilter || ! gfilter->dlist[in].name
|| strcmp (filter->dlist[in].name, gfilter->dlist[in].name) != 0)
- vty_out (vty, " neighbor %s distribute-list %s in%s", addr,
+ vty_out (vty, " neighbor %s distribute-list %s in%s", addr,
filter->dlist[in].name, VTY_NEWLINE);
if (filter->dlist[out].name && ! gfilter)
- vty_out (vty, " neighbor %s distribute-list %s out%s", addr,
+ vty_out (vty, " neighbor %s distribute-list %s out%s", addr,
filter->dlist[out].name, VTY_NEWLINE);
/* prefix-list. */
if (filter->plist[in].name)
if (! gfilter || ! gfilter->plist[in].name
|| strcmp (filter->plist[in].name, gfilter->plist[in].name) != 0)
- vty_out (vty, " neighbor %s prefix-list %s in%s", addr,
+ vty_out (vty, " neighbor %s prefix-list %s in%s", addr,
filter->plist[in].name, VTY_NEWLINE);
if (filter->plist[out].name && ! gfilter)
- vty_out (vty, " neighbor %s prefix-list %s out%s", addr,
+ vty_out (vty, " neighbor %s prefix-list %s out%s", addr,
filter->plist[out].name, VTY_NEWLINE);
/* route-map. */
if (filter->map[RMAP_IN].name)
if (! gfilter || ! gfilter->map[RMAP_IN].name
|| strcmp (filter->map[RMAP_IN].name, gfilter->map[RMAP_IN].name) != 0)
- vty_out (vty, " neighbor %s route-map %s in%s", addr,
+ vty_out (vty, " neighbor %s route-map %s in%s", addr,
filter->map[RMAP_IN].name, VTY_NEWLINE);
if (filter->map[RMAP_OUT].name && ! gfilter)
- vty_out (vty, " neighbor %s route-map %s out%s", addr,
+ vty_out (vty, " neighbor %s route-map %s out%s", addr,
filter->map[RMAP_OUT].name, VTY_NEWLINE);
if (filter->map[RMAP_IMPORT].name && ! gfilter)
- vty_out (vty, " neighbor %s route-map %s import%s", addr,
+ vty_out (vty, " neighbor %s route-map %s import%s", addr,
filter->map[RMAP_IMPORT].name, VTY_NEWLINE);
if (filter->map[RMAP_EXPORT].name)
if (! gfilter || ! gfilter->map[RMAP_EXPORT].name
|| strcmp (filter->map[RMAP_EXPORT].name,
gfilter->map[RMAP_EXPORT].name) != 0)
- vty_out (vty, " neighbor %s route-map %s export%s", addr,
+ vty_out (vty, " neighbor %s route-map %s export%s", addr,
filter->map[RMAP_EXPORT].name, VTY_NEWLINE);
/* unsuppress-map */
if (filter->usmap.name && ! gfilter)
- vty_out (vty, " neighbor %s unsuppress-map %s%s", addr,
+ vty_out (vty, " neighbor %s unsuppress-map %s%s", addr,
filter->usmap.name, VTY_NEWLINE);
/* filter-list. */
if (filter->aslist[in].name)
if (! gfilter || ! gfilter->aslist[in].name
|| strcmp (filter->aslist[in].name, gfilter->aslist[in].name) != 0)
- vty_out (vty, " neighbor %s filter-list %s in%s", addr,
+ vty_out (vty, " neighbor %s filter-list %s in%s", addr,
filter->aslist[in].name, VTY_NEWLINE);
if (filter->aslist[out].name && ! gfilter)
- vty_out (vty, " neighbor %s filter-list %s out%s", addr,
+ vty_out (vty, " neighbor %s filter-list %s out%s", addr,
filter->aslist[out].name, VTY_NEWLINE);
}
/* BGP peer configuration display function. */
static void
-bgp_config_write_peer (struct vty *vty, struct bgp *bgp,
- struct peer *peer, afi_t afi, safi_t safi)
+bgp_config_write_peer_global (struct vty *vty, struct bgp *bgp,
+ struct peer *peer)
{
struct peer *g_peer = NULL;
char buf[SU_ADDRSTRLEN];
@@ -6137,244 +6137,325 @@ bgp_config_write_peer (struct vty *vty, struct bgp *bgp,
/************************************
****** Global to the neighbor ******
************************************/
- if (afi == AFI_IP && safi == SAFI_UNICAST)
+ if (peer->conf_if)
{
- if (peer->conf_if)
- {
- if (CHECK_FLAG(peer->flags, PEER_FLAG_IFPEER_V6ONLY))
- vty_out (vty, " neighbor %s interface v6only %s", addr, VTY_NEWLINE);
- else
- vty_out (vty, " neighbor %s interface%s", addr, VTY_NEWLINE);
- }
+ if (CHECK_FLAG(peer->flags, PEER_FLAG_IFPEER_V6ONLY))
+ vty_out (vty, " neighbor %s interface v6only %s", addr, VTY_NEWLINE);
+ else
+ vty_out (vty, " neighbor %s interface%s", addr, VTY_NEWLINE);
+ }
- /* remote-as. */
- if (! peer_group_active (peer))
+ /* remote-as */
+ if (! peer_group_active (peer))
+ {
+ if (CHECK_FLAG (peer->sflags, PEER_STATUS_GROUP))
+ {
+ vty_out (vty, " neighbor %s peer-group%s", addr,
+ VTY_NEWLINE);
+ }
+
+ if (peer->as_type == AS_SPECIFIED)
{
- if (CHECK_FLAG (peer->sflags, PEER_STATUS_GROUP))
- vty_out (vty, " neighbor %s peer-group%s", addr,
- VTY_NEWLINE);
- if (peer->as_type == AS_SPECIFIED)
- {
vty_out (vty, " neighbor %s remote-as %u%s", addr, peer->as,
VTY_NEWLINE);
- }
- else if (peer->as_type == AS_INTERNAL)
- {
+ }
+ else if (peer->as_type == AS_INTERNAL)
+ {
vty_out (vty, " neighbor %s remote-as internal%s", addr, VTY_NEWLINE);
- }
- else if (peer->as_type == AS_EXTERNAL)
- {
- vty_out (vty, " neighbor %s remote-as external%s", addr, VTY_NEWLINE);
- }
}
- else
+ else if (peer->as_type == AS_EXTERNAL)
{
- if (! g_peer->as)
- {
- if (peer->as_type == AS_SPECIFIED)
- {
- vty_out (vty, " neighbor %s remote-as %u%s", addr, peer->as,
- VTY_NEWLINE);
- }
- else if (peer->as_type == AS_INTERNAL)
- {
- vty_out (vty, " neighbor %s remote-as internal%s", addr, VTY_NEWLINE);
- }
- else if (peer->as_type == AS_EXTERNAL)
- {
- vty_out (vty, " neighbor %s remote-as external%s", addr, VTY_NEWLINE);
- }
- }
- if (peer->af_group[AFI_IP][SAFI_UNICAST])
- vty_out (vty, " neighbor %s peer-group %s%s", addr,
- peer->group->name, VTY_NEWLINE);
+ vty_out (vty, " neighbor %s remote-as external%s", addr, VTY_NEWLINE);
}
+ }
+ else
+ {
+ if (! g_peer->as)
+ {
+ if (peer->as_type == AS_SPECIFIED)
+ {
+ vty_out (vty, " neighbor %s remote-as %u%s", addr, peer->as,
+ VTY_NEWLINE);
+ }
+ else if (peer->as_type == AS_INTERNAL)
+ {
+ vty_out (vty, " neighbor %s remote-as internal%s", addr, VTY_NEWLINE);
+ }
+ else if (peer->as_type == AS_EXTERNAL)
+ {
+ vty_out (vty, " neighbor %s remote-as external%s", addr, VTY_NEWLINE);
+ }
+ }
+ if (peer->af_group[AFI_IP][SAFI_UNICAST])
+ {
+ vty_out (vty, " neighbor %s peer-group %s%s", addr,
+ peer->group->name, VTY_NEWLINE);
+ }
+ }
- /* local-as. */
- if (peer->change_local_as)
- if (! peer_group_active (peer))
- vty_out (vty, " neighbor %s local-as %u%s%s%s", addr,
- peer->change_local_as,
- CHECK_FLAG (peer->flags, PEER_FLAG_LOCAL_AS_NO_PREPEND) ?
- " no-prepend" : "",
- CHECK_FLAG (peer->flags, PEER_FLAG_LOCAL_AS_REPLACE_AS) ?
- " replace-as" : "", VTY_NEWLINE);
-
- /* Description. */
- if (peer->desc)
- vty_out (vty, " neighbor %s description %s%s", addr, peer->desc,
- VTY_NEWLINE);
+ /* local-as */
+ if (peer->change_local_as)
+ {
+ if (! peer_group_active (peer))
+ {
+ vty_out (vty, " neighbor %s local-as %u%s%s%s", addr,
+ peer->change_local_as,
+ CHECK_FLAG (peer->flags, PEER_FLAG_LOCAL_AS_NO_PREPEND) ?
+ " no-prepend" : "",
+ CHECK_FLAG (peer->flags, PEER_FLAG_LOCAL_AS_REPLACE_AS) ?
+ " replace-as" : "", VTY_NEWLINE);
+ }
+ }
- /* Shutdown. */
- if (CHECK_FLAG (peer->flags, PEER_FLAG_SHUTDOWN))
- if (! peer_group_active (peer) ||
- ! CHECK_FLAG (g_peer->flags, PEER_FLAG_SHUTDOWN))
- vty_out (vty, " neighbor %s shutdown%s", addr, VTY_NEWLINE);
+ /* description */
+ if (peer->desc)
+ {
+ vty_out (vty, " neighbor %s description %s%s", addr, peer->desc,
+ VTY_NEWLINE);
+ }
- /* bfd. */
- if (peer->bfd_info)
- if (! peer_group_active (peer) || ! g_peer->bfd_info)
- {
- bgp_bfd_peer_config_write(vty, peer, addr);
- }
+ /* shutdown */
+ if (CHECK_FLAG (peer->flags, PEER_FLAG_SHUTDOWN))
+ {
+ if (! peer_group_active (peer) ||
+ ! CHECK_FLAG (g_peer->flags, PEER_FLAG_SHUTDOWN))
+ {
+ vty_out (vty, " neighbor %s shutdown%s", addr, VTY_NEWLINE);
+ }
+ }
- /* Password. */
- if (peer->password)
- if (!peer_group_active (peer)
- || ! g_peer->password
- || strcmp (peer->password, g_peer->password) != 0)
- vty_out (vty, " neighbor %s password %s%s", addr, peer->password,
- VTY_NEWLINE);
-
- /* neighbor solo */
- if (CHECK_FLAG(peer->flags, PEER_FLAG_LONESOUL))
- if (!peer_group_active (peer))
- vty_out (vty, " neighbor %s solo%s", addr, VTY_NEWLINE);
-
- /* BGP port. */
- if (peer->port != BGP_PORT_DEFAULT)
- vty_out (vty, " neighbor %s port %d%s", addr, peer->port,
- VTY_NEWLINE);
+ /* bfd */
+ if (peer->bfd_info)
+ {
+ if (! peer_group_active (peer) || ! g_peer->bfd_info)
+ {
+ bgp_bfd_peer_config_write(vty, peer, addr);
+ }
+ }
- /* Local interface name. */
- if (peer->ifname)
- vty_out (vty, " neighbor %s interface %s%s", addr, peer->ifname,
- VTY_NEWLINE);
-
- /* Passive. */
- if (CHECK_FLAG (peer->flags, PEER_FLAG_PASSIVE))
- if (! peer_group_active (peer) ||
- ! CHECK_FLAG (g_peer->flags, PEER_FLAG_PASSIVE))
- vty_out (vty, " neighbor %s passive%s", addr, VTY_NEWLINE);
-
- /* EBGP multihop. */
- if (peer->sort != BGP_PEER_IBGP && peer->ttl != 1 &&
- !(peer->gtsm_hops != 0 && peer->ttl == MAXTTL))
- if (! peer_group_active (peer) ||
- g_peer->ttl != peer->ttl)
- vty_out (vty, " neighbor %s ebgp-multihop %d%s", addr, peer->ttl,
- VTY_NEWLINE);
-
- /* ttl-security hops */
- if (peer->gtsm_hops != 0)
- if (! peer_group_active (peer) || g_peer->gtsm_hops != peer->gtsm_hops)
+ /* password */
+ if (peer->password)
+ {
+ if (!peer_group_active (peer)
+ || ! g_peer->password
+ || strcmp (peer->password, g_peer->password) != 0)
+ {
+ vty_out (vty, " neighbor %s password %s%s", addr, peer->password,
+ VTY_NEWLINE);
+ }
+ }
+
+ /* neighbor solo */
+ if (CHECK_FLAG(peer->flags, PEER_FLAG_LONESOUL))
+ {
+ if (!peer_group_active (peer))
+ {
+ vty_out (vty, " neighbor %s solo%s", addr, VTY_NEWLINE);
+ }
+ }
+
+ /* BGP port */
+ if (peer->port != BGP_PORT_DEFAULT)
+ {
+ vty_out (vty, " neighbor %s port %d%s", addr, peer->port,
+ VTY_NEWLINE);
+ }
+
+ /* Local interface name */
+ if (peer->ifname)
+ {
+ vty_out (vty, " neighbor %s interface %s%s", addr, peer->ifname,
+ VTY_NEWLINE);
+ }
+
+ /* passive */
+ if (CHECK_FLAG (peer->flags, PEER_FLAG_PASSIVE))
+ {
+ if (! peer_group_active (peer) ||
+ ! CHECK_FLAG (g_peer->flags, PEER_FLAG_PASSIVE))
+ {
+ vty_out (vty, " neighbor %s passive%s", addr, VTY_NEWLINE);
+ }
+ }
+
+ /* ebgp-multihop */
+ if (peer->sort != BGP_PEER_IBGP && peer->ttl != 1 &&
+ !(peer->gtsm_hops != 0 && peer->ttl == MAXTTL))
+ {
+ if (! peer_group_active (peer) || g_peer->ttl != peer->ttl)
+ {
+ vty_out (vty, " neighbor %s ebgp-multihop %d%s", addr, peer->ttl,
+ VTY_NEWLINE);
+ }
+ }
+
+ /* ttl-security hops */
+ if (peer->gtsm_hops != 0)
+ {
+ if (! peer_group_active (peer) || g_peer->gtsm_hops != peer->gtsm_hops)
+ {
vty_out (vty, " neighbor %s ttl-security hops %d%s", addr,
peer->gtsm_hops, VTY_NEWLINE);
+ }
+ }
- /* disable-connected-check. */
- if (CHECK_FLAG (peer->flags, PEER_FLAG_DISABLE_CONNECTED_CHECK))
- if (! peer_group_active (peer) ||
- ! CHECK_FLAG (g_peer->flags, PEER_FLAG_DISABLE_CONNECTED_CHECK))
- vty_out (vty, " neighbor %s disable-connected-check%s", addr, VTY_NEWLINE);
+ /* disable-connected-check */
+ if (CHECK_FLAG (peer->flags, PEER_FLAG_DISABLE_CONNECTED_CHECK))
+ {
+ if (! peer_group_active (peer) ||
+ ! CHECK_FLAG (g_peer->flags, PEER_FLAG_DISABLE_CONNECTED_CHECK))
+ {
+ vty_out (vty, " neighbor %s disable-connected-check%s", addr, VTY_NEWLINE);
+ }
+ }
- /* Update-source. */
- if (peer->update_if)
- if (! peer_group_active (peer) || ! g_peer->update_if
- || strcmp (g_peer->update_if, peer->update_if) != 0)
- vty_out (vty, " neighbor %s update-source %s%s", addr,
- peer->update_if, VTY_NEWLINE);
- if (peer->update_source)
- if (! peer_group_active (peer) || ! g_peer->update_source
- || sockunion_cmp (g_peer->update_source,
- peer->update_source) != 0)
- vty_out (vty, " neighbor %s update-source %s%s", addr,
- sockunion2str (peer->update_source, buf, SU_ADDRSTRLEN),
- VTY_NEWLINE);
-
- /* advertisement-interval */
- 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);
-
- /* timers. */
- if (CHECK_FLAG (peer->config, PEER_CONFIG_TIMER)
- && ! peer_group_active (peer))
- vty_out (vty, " neighbor %s timers %d %d%s", addr,
- peer->keepalive, peer->holdtime, VTY_NEWLINE);
-
- 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);
-
- /* Default weight. */
- if (CHECK_FLAG (peer->config, PEER_CONFIG_WEIGHT))
- if (! peer_group_active (peer) ||
- g_peer->weight != peer->weight)
- vty_out (vty, " neighbor %s weight %d%s", addr, peer->weight,
- VTY_NEWLINE);
-
- /* Dynamic capability. */
- if (CHECK_FLAG (peer->flags, PEER_FLAG_DYNAMIC_CAPABILITY))
- if (! peer_group_active (peer) ||
- ! CHECK_FLAG (g_peer->flags, PEER_FLAG_DYNAMIC_CAPABILITY))
- vty_out (vty, " neighbor %s capability dynamic%s", addr,
- VTY_NEWLINE);
+ /* update-source */
+ if (peer->update_if)
+ {
+ if (! peer_group_active (peer) || ! g_peer->update_if
+ || strcmp (g_peer->update_if, peer->update_if) != 0)
+ {
+ vty_out (vty, " neighbor %s update-source %s%s", addr,
+ peer->update_if, VTY_NEWLINE);
+ }
+ }
+ if (peer->update_source)
+ {
+ if (! peer_group_active (peer) || ! g_peer->update_source
+ || sockunion_cmp (g_peer->update_source,
+ peer->update_source) != 0)
+ {
+ vty_out (vty, " neighbor %s update-source %s%s", addr,
+ sockunion2str (peer->update_source, buf, SU_ADDRSTRLEN),
+ VTY_NEWLINE);
+ }
+ }
- /* Extended next-hop capability. */
- if (CHECK_FLAG (peer->flags, PEER_FLAG_CAPABILITY_ENHE))
- if (! peer_group_active (peer) ||
- ! CHECK_FLAG (g_peer->flags, PEER_FLAG_CAPABILITY_ENHE))
- vty_out (vty, " neighbor %s capability extended-nexthop%s", addr,
- VTY_NEWLINE);
+ /* advertisement-interval */
+ 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);
+ }
- /* dont capability negotiation. */
- if (CHECK_FLAG (peer->flags, PEER_FLAG_DONT_CAPABILITY))
- if (! peer_group_active (peer) ||
- ! CHECK_FLAG (g_peer->flags, PEER_FLAG_DONT_CAPABILITY))
- vty_out (vty, " neighbor %s dont-capability-negotiate%s", addr,
- VTY_NEWLINE);
+ /* timers */
+ if (CHECK_FLAG (peer->config, PEER_CONFIG_TIMER)
+ && ! peer_group_active (peer))
+ {
+ vty_out (vty, " neighbor %s timers %d %d%s", addr,
+ peer->keepalive, peer->holdtime, VTY_NEWLINE);
+ }
- /* override capability negotiation. */
- if (CHECK_FLAG (peer->flags, PEER_FLAG_OVERRIDE_CAPABILITY))
- if (! peer_group_active (peer) ||
- ! CHECK_FLAG (g_peer->flags, PEER_FLAG_OVERRIDE_CAPABILITY))
- vty_out (vty, " neighbor %s override-capability%s", addr,
- VTY_NEWLINE);
+ 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);
+ }
- /* strict capability negotiation. */
- if (CHECK_FLAG (peer->flags, PEER_FLAG_STRICT_CAP_MATCH))
- if (! peer_group_active (peer) ||
- ! CHECK_FLAG (g_peer->flags, PEER_FLAG_STRICT_CAP_MATCH))
- vty_out (vty, " neighbor %s strict-capability-match%s", addr,
- VTY_NEWLINE);
+ /* weight */
+ if (CHECK_FLAG (peer->config, PEER_CONFIG_WEIGHT))
+ {
+ if (! peer_group_active (peer) || g_peer->weight != peer->weight)
+ {
+ vty_out (vty, " neighbor %s weight %d%s", addr, peer->weight,
+ VTY_NEWLINE);
+ }
+ }
- if (! peer->af_group[AFI_IP][SAFI_UNICAST])
- {
- if (bgp_flag_check (bgp, BGP_FLAG_NO_DEFAULT_IPV4))
- {
- if (peer->afc[AFI_IP][SAFI_UNICAST])
- vty_out (vty, " neighbor %s activate%s", addr, VTY_NEWLINE);
- }
- else
- {
- if (! peer->afc[AFI_IP][SAFI_UNICAST])
- vty_out (vty, " no neighbor %s activate%s", addr, VTY_NEWLINE);
- }
- }
+ /* capability dynamic */
+ if (CHECK_FLAG (peer->flags, PEER_FLAG_DYNAMIC_CAPABILITY))
+ {
+ if (! peer_group_active (peer) ||
+ ! CHECK_FLAG (g_peer->flags, PEER_FLAG_DYNAMIC_CAPABILITY))
+ {
+ vty_out (vty, " neighbor %s capability dynamic%s", addr,
+ VTY_NEWLINE);
+ }
+ }
+
+ /* capability extended-nexthop */
+ if (CHECK_FLAG (peer->flags, PEER_FLAG_CAPABILITY_ENHE))
+ {
+ if (! peer_group_active (peer) ||
+ ! CHECK_FLAG (g_peer->flags, PEER_FLAG_CAPABILITY_ENHE))
+ {
+ vty_out (vty, " neighbor %s capability extended-nexthop%s", addr,
+ VTY_NEWLINE);
+ }
}
+ /* dont-capability-negotiation */
+ if (CHECK_FLAG (peer->flags, PEER_FLAG_DONT_CAPABILITY))
+ {
+ if (! peer_group_active (peer) ||
+ ! CHECK_FLAG (g_peer->flags, PEER_FLAG_DONT_CAPABILITY))
+ {
+ vty_out (vty, " neighbor %s dont-capability-negotiate%s", addr,
+ VTY_NEWLINE);
+ }
+ }
- /************************************
- ****** Per AF to the neighbor ******
- ************************************/
+ /* override-capability */
+ if (CHECK_FLAG (peer->flags, PEER_FLAG_OVERRIDE_CAPABILITY))
+ {
+ if (! peer_group_active (peer) ||
+ ! CHECK_FLAG (g_peer->flags, PEER_FLAG_OVERRIDE_CAPABILITY))
+ {
+ vty_out (vty, " neighbor %s override-capability%s", addr,
+ VTY_NEWLINE);
+ }
+ }
- if (! (afi == AFI_IP && safi == SAFI_UNICAST))
+ /* strict-capability-match */
+ if (CHECK_FLAG (peer->flags, PEER_FLAG_STRICT_CAP_MATCH))
{
- if (peer->af_group[afi][safi])
- vty_out (vty, " neighbor %s peer-group %s%s", addr,
- peer->group->name, VTY_NEWLINE);
- else
- vty_out (vty, " neighbor %s activate%s", addr, VTY_NEWLINE);
+ if (! peer_group_active (peer) ||
+ ! CHECK_FLAG (g_peer->flags, PEER_FLAG_STRICT_CAP_MATCH))
+ {
+ vty_out (vty, " neighbor %s strict-capability-match%s", addr,
+ VTY_NEWLINE);
+ }
}
+}
+
+
+/* BGP peer configuration display function. */
+static void
+bgp_config_write_peer_af (struct vty *vty, struct bgp *bgp,
+ struct peer *peer, afi_t afi, safi_t safi)
+{
+ struct peer *g_peer = NULL;
+ char *addr;
+
+ /* Skip dynamic neighbors. */
+ if (peer_dynamic_neighbor (peer))
+ return;
+
+ if (peer->conf_if)
+ addr = peer->conf_if;
+ else
+ addr = peer->host;
+
+ if (peer_group_active (peer))
+ g_peer = peer->group->conf;
+
+ /************************************
+ ****** Per AF to the neighbor ******
+ ************************************/
+ if (peer->af_group[afi][safi])
+ vty_out (vty, " neighbor %s peer-group %s%s", addr,
+ peer->group->name, VTY_NEWLINE);
+ else
+ vty_out (vty, " neighbor %s activate%s", addr, VTY_NEWLINE);
/* ORF capability. */
if (CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_ORF_PREFIX_SM)
|| CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_ORF_PREFIX_RM))
if (! peer->af_group[afi][safi])
{
- vty_out (vty, " neighbor %s capability orf prefix-list", addr);
+ vty_out (vty, " neighbor %s capability orf prefix-list", addr);
if (CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_ORF_PREFIX_SM)
&& CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_ORF_PREFIX_RM))
@@ -6389,39 +6470,39 @@ bgp_config_write_peer (struct vty *vty, struct bgp *bgp,
/* Route reflector client. */
if (peer_af_flag_check (peer, afi, safi, PEER_FLAG_REFLECTOR_CLIENT)
&& ! peer->af_group[afi][safi])
- vty_out (vty, " neighbor %s route-reflector-client%s", addr,
+ vty_out (vty, " neighbor %s route-reflector-client%s", addr,
VTY_NEWLINE);
/* Nexthop self. */
if (peer_af_flag_check (peer, afi, safi, PEER_FLAG_FORCE_NEXTHOP_SELF)
&& ! peer->af_group[afi][safi])
- vty_out (vty, " neighbor %s next-hop-self force%s",
+ vty_out (vty, " neighbor %s next-hop-self force%s",
addr, VTY_NEWLINE);
else if (peer_af_flag_check (peer, afi, safi, PEER_FLAG_NEXTHOP_SELF)
&& ! peer->af_group[afi][safi])
- vty_out (vty, " neighbor %s next-hop-self%s", addr, VTY_NEWLINE);
+ vty_out (vty, " neighbor %s next-hop-self%s", addr, VTY_NEWLINE);
/* remove-private-AS */
if (peer_af_flag_check (peer, afi, safi, PEER_FLAG_REMOVE_PRIVATE_AS) && !peer->af_group[afi][safi])
{
if (peer_af_flag_check (peer, afi, safi, PEER_FLAG_REMOVE_PRIVATE_AS_ALL) &&
peer_af_flag_check (peer, afi, safi, PEER_FLAG_REMOVE_PRIVATE_AS_REPLACE))
- vty_out (vty, " neighbor %s remove-private-AS all replace-AS%s", addr, VTY_NEWLINE);
+ vty_out (vty, " neighbor %s remove-private-AS all replace-AS%s", addr, VTY_NEWLINE);
else if (peer_af_flag_check (peer, afi, safi, PEER_FLAG_REMOVE_PRIVATE_AS_REPLACE))
- vty_out (vty, " neighbor %s remove-private-AS replace-AS%s", addr, VTY_NEWLINE);
+ vty_out (vty, " neighbor %s remove-private-AS replace-AS%s", addr, VTY_NEWLINE);
else if (peer_af_flag_check (peer, afi, safi, PEER_FLAG_REMOVE_PRIVATE_AS_ALL))
- vty_out (vty, " neighbor %s remove-private-AS all%s", addr, VTY_NEWLINE);
+ vty_out (vty, " neighbor %s remove-private-AS all%s", addr, VTY_NEWLINE);
else
- vty_out (vty, " neighbor %s remove-private-AS%s", addr, VTY_NEWLINE);
+ vty_out (vty, " neighbor %s remove-private-AS%s", addr, VTY_NEWLINE);
}
/* as-override */
if (peer_af_flag_check (peer, afi, safi, PEER_FLAG_AS_OVERRIDE) &&
!peer->af_group[afi][safi])
- vty_out (vty, " neighbor %s as-override%s", addr, VTY_NEWLINE);
+ vty_out (vty, " neighbor %s as-override%s", addr, VTY_NEWLINE);
/* send-community print. */
if (! peer->af_group[afi][safi])
@@ -6430,24 +6511,24 @@ bgp_config_write_peer (struct vty *vty, struct bgp *bgp,
{
if (peer_af_flag_check (peer, afi, safi, PEER_FLAG_SEND_COMMUNITY)
&& peer_af_flag_check (peer, afi, safi, PEER_FLAG_SEND_EXT_COMMUNITY))
- vty_out (vty, " neighbor %s send-community both%s", addr, VTY_NEWLINE);
+ vty_out (vty, " neighbor %s send-community both%s", addr, VTY_NEWLINE);
else if (peer_af_flag_check (peer, afi, safi, PEER_FLAG_SEND_EXT_COMMUNITY))
- vty_out (vty, " neighbor %s send-community extended%s",
+ vty_out (vty, " neighbor %s send-community extended%s",
addr, VTY_NEWLINE);
else if (peer_af_flag_check (peer, afi, safi, PEER_FLAG_SEND_COMMUNITY))
- vty_out (vty, " neighbor %s send-community%s", addr, VTY_NEWLINE);
+ vty_out (vty, " neighbor %s send-community%s", addr, VTY_NEWLINE);
}
else
{
if (! peer_af_flag_check (peer, afi, safi, PEER_FLAG_SEND_COMMUNITY)
&& ! peer_af_flag_check (peer, afi, safi, PEER_FLAG_SEND_EXT_COMMUNITY))
- vty_out (vty, " no neighbor %s send-community both%s",
+ vty_out (vty, " no neighbor %s send-community both%s",
addr, VTY_NEWLINE);
else if (! peer_af_flag_check (peer, afi, safi, PEER_FLAG_SEND_EXT_COMMUNITY))
- vty_out (vty, " no neighbor %s send-community extended%s",
+ vty_out (vty, " no neighbor %s send-community extended%s",
addr, VTY_NEWLINE);
else if (! peer_af_flag_check (peer, afi, safi, PEER_FLAG_SEND_COMMUNITY))
- vty_out (vty, " no neighbor %s send-community%s",
+ vty_out (vty, " no neighbor %s send-community%s",
addr, VTY_NEWLINE);
}
}
@@ -6456,9 +6537,9 @@ bgp_config_write_peer (struct vty *vty, struct bgp *bgp,
if (peer_af_flag_check (peer, afi, safi, PEER_FLAG_DEFAULT_ORIGINATE)
&& ! peer->af_group[afi][safi])
{
- vty_out (vty, " neighbor %s default-originate", addr);
+ vty_out (vty, " neighbor %s default-originate", addr);
if (peer->default_rmap[afi][safi].name)
- vty_out (vty, " route-map %s", peer->default_rmap[afi][safi].name);
+ vty_out (vty, " route-map %s", peer->default_rmap[afi][safi].name);
vty_out (vty, "%s", VTY_NEWLINE);
}
@@ -6466,7 +6547,7 @@ bgp_config_write_peer (struct vty *vty, struct bgp *bgp,
if (CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_SOFT_RECONFIG))
if (! peer->af_group[afi][safi] ||
! CHECK_FLAG (g_peer->af_flags[afi][safi], PEER_FLAG_SOFT_RECONFIG))
- vty_out (vty, " neighbor %s soft-reconfiguration inbound%s", addr,
+ vty_out (vty, " neighbor %s soft-reconfiguration inbound%s", addr,
VTY_NEWLINE);
/* maximum-prefix. */
@@ -6477,7 +6558,7 @@ bgp_config_write_peer (struct vty *vty, struct bgp *bgp,
|| CHECK_FLAG (g_peer->af_flags[afi][safi], PEER_FLAG_MAX_PREFIX_WARNING)
!= CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_MAX_PREFIX_WARNING))
{
- vty_out (vty, " neighbor %s maximum-prefix %ld", addr, peer->pmax[afi][safi]);
+ vty_out (vty, " neighbor %s maximum-prefix %ld", addr, peer->pmax[afi][safi]);
if (peer->pmax_threshold[afi][safi] != MAXIMUM_PREFIX_THRESHOLD_DEFAULT)
vty_out (vty, " %d", peer->pmax_threshold[afi][safi]);
if (CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_MAX_PREFIX_WARNING))
@@ -6490,12 +6571,12 @@ bgp_config_write_peer (struct vty *vty, struct bgp *bgp,
/* Route server client. */
if (CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_RSERVER_CLIENT)
&& ! peer->af_group[afi][safi])
- vty_out (vty, " neighbor %s route-server-client%s", addr, VTY_NEWLINE);
+ vty_out (vty, " neighbor %s route-server-client%s", addr, VTY_NEWLINE);
/* Nexthop-local unchanged. */
if (CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_NEXTHOP_LOCAL_UNCHANGED)
&& ! peer->af_group[afi][safi])
- vty_out (vty, " neighbor %s nexthop-local unchanged%s", addr, VTY_NEWLINE);
+ vty_out (vty, " neighbor %s nexthop-local unchanged%s", addr, VTY_NEWLINE);
/* Allow AS in. */
if (peer_af_flag_check (peer, afi, safi, PEER_FLAG_ALLOWAS_IN))
@@ -6504,9 +6585,9 @@ bgp_config_write_peer (struct vty *vty, struct bgp *bgp,
|| peer->allowas_in[afi][safi] != g_peer->allowas_in[afi][safi])
{
if (peer->allowas_in[afi][safi] == 3)
- vty_out (vty, " neighbor %s allowas-in%s", addr, VTY_NEWLINE);
+ vty_out (vty, " neighbor %s allowas-in%s", addr, VTY_NEWLINE);
else
- vty_out (vty, " neighbor %s allowas-in %d%s", addr,
+ vty_out (vty, " neighbor %s allowas-in %d%s", addr,
peer->allowas_in[afi][safi], VTY_NEWLINE);
}
@@ -6522,9 +6603,9 @@ bgp_config_write_peer (struct vty *vty, struct bgp *bgp,
if (CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_AS_PATH_UNCHANGED)
&& CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_NEXTHOP_UNCHANGED)
&& CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_MED_UNCHANGED))
- vty_out (vty, " neighbor %s attribute-unchanged%s", addr, VTY_NEWLINE);
+ vty_out (vty, " neighbor %s attribute-unchanged%s", addr, VTY_NEWLINE);
else
- vty_out (vty, " neighbor %s attribute-unchanged%s%s%s%s", addr,
+ vty_out (vty, " neighbor %s attribute-unchanged%s%s%s%s", addr,
(CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_AS_PATH_UNCHANGED)) ?
" as-path" : "",
(CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_NEXTHOP_UNCHANGED)) ?
@@ -6542,24 +6623,23 @@ bgp_config_write_family_header (struct vty *vty, afi_t afi, safi_t safi,
if (*write)
return;
- if (afi == AFI_IP && safi == SAFI_UNICAST)
- return;
-
- vty_out (vty, "!%s address-family ", VTY_NEWLINE);
+ vty_out (vty, " address-family ");
if (afi == AFI_IP)
{
- if (safi == SAFI_MULTICAST)
+ if (safi == SAFI_UNICAST)
+ vty_out (vty, "ipv4 unicast");
+ else if (safi == SAFI_MULTICAST)
vty_out (vty, "ipv4 multicast");
else if (safi == SAFI_MPLS_VPN)
vty_out (vty, "vpnv4 unicast");
}
else if (afi == AFI_IP6)
{
- vty_out (vty, "ipv6");
-
- if (safi == SAFI_MULTICAST)
- vty_out (vty, " multicast");
+ if (safi == SAFI_UNICAST)
+ vty_out (vty, "ipv6 unicast");
+ else if (safi == SAFI_MULTICAST)
+ vty_out (vty, "ipv6 multicast");
}
vty_out (vty, "%s", VTY_NEWLINE);
@@ -6586,7 +6666,7 @@ bgp_config_write_family (struct vty *vty, struct bgp *bgp, afi_t afi,
if (group->conf->afc[afi][safi])
{
bgp_config_write_family_header (vty, afi, safi, &write);
- bgp_config_write_peer (vty, bgp, group->conf, afi, safi);
+ bgp_config_write_peer_af (vty, bgp, group->conf, afi, safi);
}
}
for (ALL_LIST_ELEMENTS (bgp->peer, node, nnode, peer))
@@ -6600,7 +6680,7 @@ bgp_config_write_family (struct vty *vty, struct bgp *bgp, afi_t afi,
if (CHECK_FLAG (peer->flags, PEER_FLAG_CONFIG_NODE))
{
bgp_config_write_family_header (vty, afi, safi, &write);
- bgp_config_write_peer (vty, bgp, peer, afi, safi);
+ bgp_config_write_peer_af (vty, bgp, peer, afi, safi);
}
}
}
@@ -6668,8 +6748,8 @@ bgp_config_write (struct vty *vty)
VTY_NEWLINE);
/* BGP log-neighbor-changes. */
- if (bgp_flag_check (bgp, BGP_FLAG_LOG_NEIGHBOR_CHANGES))
- vty_out (vty, " bgp log-neighbor-changes%s", VTY_NEWLINE);
+ if (!bgp_flag_check (bgp, BGP_FLAG_LOG_NEIGHBOR_CHANGES))
+ vty_out (vty, " no bgp log-neighbor-changes%s", VTY_NEWLINE);
/* BGP configuration. */
if (bgp_flag_check (bgp, BGP_FLAG_ALWAYS_COMPARE_MED))
@@ -6685,8 +6765,8 @@ bgp_config_write (struct vty *vty)
bgp->default_local_pref, VTY_NEWLINE);
/* BGP default show-hostname */
- if (bgp_flag_check(bgp, BGP_FLAG_SHOW_HOSTNAME))
- vty_out (vty, " bgp default show-hostname%s", VTY_NEWLINE);
+ if (!bgp_flag_check(bgp, BGP_FLAG_SHOW_HOSTNAME))
+ vty_out (vty, " no bgp default show-hostname%s", VTY_NEWLINE);
/* BGP default subgroup-pkt-queue-max. */
if (bgp->default_subgroup_pkt_queue_max != BGP_DEFAULT_SUBGROUP_PKT_QUEUE_MAX)
@@ -6795,22 +6875,14 @@ bgp_config_write (struct vty *vty)
}
/* BGP network import check. */
- if (bgp_flag_check (bgp, BGP_FLAG_IMPORT_CHECK_EXACT_MATCH))
- vty_out (vty, " bgp network import-check exact%s", VTY_NEWLINE);
- else if (bgp_flag_check (bgp, BGP_FLAG_IMPORT_CHECK))
- vty_out (vty, " bgp network import-check%s", VTY_NEWLINE);
+ if (!bgp_flag_check (bgp, BGP_FLAG_IMPORT_CHECK))
+ vty_out (vty, " no bgp network import-check%s", VTY_NEWLINE);
/* BGP flag dampening. */
if (CHECK_FLAG (bgp->af_flags[AFI_IP][SAFI_UNICAST],
BGP_CONFIG_DAMPENING))
bgp_config_write_damp (vty);
- /* BGP static route configuration. */
- bgp_config_write_network (vty, bgp, AFI_IP, SAFI_UNICAST, &write);
-
- /* BGP redistribute configuration. */
- bgp_config_write_redistribute (vty, bgp, AFI_IP, SAFI_UNICAST, &write);
-
/* BGP timers configuration. */
if (bgp->default_keepalive != BGP_DEFAULT_KEEPALIVE
&& bgp->default_holdtime != BGP_DEFAULT_HOLDTIME)
@@ -6824,20 +6896,16 @@ bgp_config_write (struct vty *vty)
/* peer-group */
for (ALL_LIST_ELEMENTS (bgp->group, node, nnode, group))
{
- bgp_config_write_peer (vty, bgp, group->conf, AFI_IP, SAFI_UNICAST);
+ bgp_config_write_peer_global (vty, bgp, group->conf);
}
/* Normal neighbor configuration. */
for (ALL_LIST_ELEMENTS (bgp->peer, node, nnode, peer))
{
if (CHECK_FLAG (peer->flags, PEER_FLAG_CONFIG_NODE))
- bgp_config_write_peer (vty, bgp, peer, AFI_IP, SAFI_UNICAST);
+ bgp_config_write_peer_global (vty, bgp, peer);
}
- /* maximum-paths */
- bgp_config_write_maxpaths (vty, bgp, AFI_IP, SAFI_UNICAST, &write);
- bgp_config_write_table_map (vty, bgp, AFI_IP, SAFI_UNICAST, &write);
-
/* Distance configuration. */
bgp_config_write_distance (vty, bgp);
@@ -6848,6 +6916,9 @@ bgp_config_write (struct vty *vty)
if (bgp_option_check (BGP_OPT_CONFIG_CISCO))
vty_out (vty, " no auto-summary%s", VTY_NEWLINE);
+ /* IPv4 unicast configuration. */
+ write += bgp_config_write_family (vty, bgp, AFI_IP, SAFI_UNICAST);
+
/* IPv4 multicast configuration. */
write += bgp_config_write_family (vty, bgp, AFI_IP, SAFI_MULTICAST);
diff --git a/bgpd/bgpd.h b/bgpd/bgpd.h
index 69ce7219f5..22c4d20306 100644
--- a/bgpd/bgpd.h
+++ b/bgpd/bgpd.h
@@ -255,8 +255,7 @@ struct bgp
#define BGP_FLAG_DISABLE_NH_CONNECTED_CHK (1 << 16)
#define BGP_FLAG_MULTIPATH_RELAX_NO_AS_SET (1 << 17)
#define BGP_FLAG_FORCE_STATIC_PROCESS (1 << 18)
-#define BGP_FLAG_IMPORT_CHECK_EXACT_MATCH (1 << 19)
-#define BGP_FLAG_SHOW_HOSTNAME (1 << 20)
+#define BGP_FLAG_SHOW_HOSTNAME (1 << 19)
/* BGP Per AF flags */
u_int16_t af_flags[AFI_MAX][SAFI_MAX];
@@ -695,7 +694,6 @@ struct peer
u_int32_t v_connect;
u_int32_t v_holdtime;
u_int32_t v_keepalive;
- u_int32_t v_asorig;
u_int32_t v_routeadv;
u_int32_t v_pmax_restart;
u_int32_t v_gr_restart;
@@ -707,7 +705,6 @@ struct peer
struct thread *t_connect;
struct thread *t_holdtime;
struct thread *t_keepalive;
- struct thread *t_asorig;
struct thread *t_routeadv;
struct thread *t_pmax_restart;
struct thread *t_gr_restart;
@@ -996,13 +993,11 @@ struct bgp_nlri
/* BGP timers default value. */
#define BGP_INIT_START_TIMER 1
-#define BGP_ERROR_START_TIMER 30
-#define BGP_DEFAULT_HOLDTIME 180
-#define BGP_DEFAULT_KEEPALIVE 60
-#define BGP_DEFAULT_ASORIGINATE 15
-#define BGP_DEFAULT_EBGP_ROUTEADV 30
-#define BGP_DEFAULT_IBGP_ROUTEADV 5
-#define BGP_DEFAULT_CONNECT_RETRY 120
+#define BGP_DEFAULT_HOLDTIME 9
+#define BGP_DEFAULT_KEEPALIVE 3
+#define BGP_DEFAULT_EBGP_ROUTEADV 0
+#define BGP_DEFAULT_IBGP_ROUTEADV 0
+#define BGP_DEFAULT_CONNECT_RETRY 10
/* BGP default local preference. */
#define BGP_DEFAULT_LOCAL_PREF 100
diff --git a/lib/libospf.h b/lib/libospf.h
index a8fbaaf563..270031af63 100644
--- a/lib/libospf.h
+++ b/lib/libospf.h
@@ -88,9 +88,9 @@
#define OSPF_AREA_TYPE_MAX 3
/* SPF Throttling timer values. */
-#define OSPF_SPF_DELAY_DEFAULT 200
-#define OSPF_SPF_HOLDTIME_DEFAULT 1000
-#define OSPF_SPF_MAX_HOLDTIME_DEFAULT 10000
+#define OSPF_SPF_DELAY_DEFAULT 0
+#define OSPF_SPF_HOLDTIME_DEFAULT 50
+#define OSPF_SPF_MAX_HOLDTIME_DEFAULT 5000
#define OSPF_LSA_MAXAGE_CHECK_INTERVAL 30
#define OSPF_LSA_MAXAGE_REMOVE_DELAY_DEFAULT 60
diff --git a/tools/quagga-reload.py b/tools/quagga-reload.py
index 343d61ae78..11266a1a28 100755
--- a/tools/quagga-reload.py
+++ b/tools/quagga-reload.py
@@ -292,17 +292,18 @@ end
elif "address-family " in line:
main_ctx_key = []
- if line != "address-family ipv4 unicast":
- # Save old context first
- self.save_contexts(ctx_keys, current_context_lines)
- current_context_lines = []
- main_ctx_key = copy.deepcopy(ctx_keys)
- logger.debug('LINE %-50s: entering sub-context, append to ctx_keys', line)
+ # Save old context first
+ self.save_contexts(ctx_keys, current_context_lines)
+ current_context_lines = []
+ main_ctx_key = copy.deepcopy(ctx_keys)
+ logger.debug('LINE %-50s: entering sub-context, append to ctx_keys', line)
- if line == "address-family ipv6":
- ctx_keys.append("address-family ipv6 unicast")
- else:
- ctx_keys.append(line)
+ if line == "address-family ipv6":
+ ctx_keys.append("address-family ipv6 unicast")
+ elif line == "address-family ipv4":
+ ctx_keys.append("address-family ipv4 unicast")
+ else:
+ ctx_keys.append(line)
else:
# Continuing in an existing context, add non-commented lines to it
diff --git a/vtysh/vtysh_config.c b/vtysh/vtysh_config.c
index 47886ea463..fc0fa351a9 100644
--- a/vtysh/vtysh_config.c
+++ b/vtysh/vtysh_config.c
@@ -175,6 +175,8 @@ vtysh_config_parse_line (const char *line)
switch (c)
{
+ /* Suppress exclamation points ! and commented lines. The !s are generated
+ * dynamically in vtysh_config_dump() */
case '!':
case '#':
break;
@@ -188,8 +190,11 @@ vtysh_config_parse_line (const char *line)
else if (strncmp (line, " address-family ipv4 multicast",
strlen (" address-family ipv4 multicast")) == 0)
config = config_get (BGP_IPV4M_NODE, line);
- else if (strncmp (line, " address-family ipv6",
- strlen (" address-family ipv6")) == 0)
+ else if (strncmp (line, " address-family ipv4", strlen (" address-family ipv4")) == 0 ||
+ strncmp (line, " address-family ipv4 unicast", strlen (" address-family ipv4 unicast")) == 0)
+ config = config_get (BGP_IPV4_NODE, line);
+ else if (strncmp (line, " address-family ipv6", strlen (" address-family ipv6")) == 0 ||
+ strncmp (line, " address-family ipv6 unicast", strlen (" address-family ipv6 unicast")) == 0)
config = config_get (BGP_IPV6_NODE, line);
else if (config->index == RMAP_NODE ||
config->index == INTERFACE_NODE ||
diff --git a/zebra/rt_netlink.c b/zebra/rt_netlink.c
index dfff7869aa..4c16df61a1 100644
--- a/zebra/rt_netlink.c
+++ b/zebra/rt_netlink.c
@@ -1500,6 +1500,13 @@ _netlink_route_build_singlepath(
addattr_l (nlmsg, req_size, RTA_GATEWAY, &ipv4_ll, 4);
addattr32 (nlmsg, req_size, RTA_OIF, nexthop->ifindex);
+ if (nexthop->rmap_src.ipv4.s_addr && (cmd == RTM_NEWROUTE))
+ addattr_l (nlmsg, req_size, RTA_PREFSRC,
+ &nexthop->rmap_src.ipv4, bytelen);
+ else if (nexthop->src.ipv4.s_addr && (cmd == RTM_NEWROUTE))
+ addattr_l (nlmsg, req_size, RTA_PREFSRC,
+ &nexthop->src.ipv4, bytelen);
+
if (IS_ZEBRA_DEBUG_KERNEL)
zlog_debug(" 5549: _netlink_route_build_singlepath() (%s): "
"nexthop via %s if %u",
@@ -1648,6 +1655,11 @@ _netlink_route_build_multipath(
rtnh->rtnh_len += sizeof (struct rtattr) + bytelen;
rtnh->rtnh_ifindex = nexthop->ifindex;
+ if (nexthop->rmap_src.ipv4.s_addr)
+ *src = &nexthop->rmap_src;
+ else if (nexthop->src.ipv4.s_addr)
+ *src = &nexthop->src;
+
if (IS_ZEBRA_DEBUG_KERNEL)
zlog_debug(" 5549: netlink_route_build_multipath() (%s): "
"nexthop via %s if %u",
diff --git a/zebra/zebra_rib.c b/zebra/zebra_rib.c
index 261aed156f..8e873211a0 100644
--- a/zebra/zebra_rib.c
+++ b/zebra/zebra_rib.c
@@ -1268,7 +1268,9 @@ nexthop_active_check (struct route_node *rn, struct rib *rib,
UNSET_FLAG (nexthop->flags, NEXTHOP_FLAG_ACTIVE);
break;
case NEXTHOP_TYPE_IPV6_IFINDEX:
- family = AFI_IP6;
+ /* RFC 5549, v4 prefix with v6 NH */
+ if (rn->p.family != AF_INET)
+ family = AFI_IP6;
if (IN6_IS_ADDR_LINKLOCAL (&nexthop->gate.ipv6))
{
ifp = if_lookup_by_index (nexthop->ifindex);