summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--bgpd/bgp_fsm.c19
-rw-r--r--bgpd/bgp_packet.c5
-rw-r--r--bgpd/bgp_vty.c30
-rw-r--r--bgpd/bgp_zebra.c3
-rw-r--r--bgpd/bgpd.c6
-rw-r--r--ospf6d/ospf6_lsa.c47
-rw-r--r--ospfd/ospf_vty.c7
-rw-r--r--zebra/interface.c4
-rw-r--r--zebra/redistribute.c60
-rw-r--r--zebra/zebra_mpls_vty.c4
-rw-r--r--zebra/zebra_rib.c2
-rw-r--r--zebra/zebra_rnh.c2
12 files changed, 126 insertions, 63 deletions
diff --git a/bgpd/bgp_fsm.c b/bgpd/bgp_fsm.c
index e669b4f9b7..18a171ab80 100644
--- a/bgpd/bgp_fsm.c
+++ b/bgpd/bgp_fsm.c
@@ -1021,8 +1021,14 @@ bgp_stop (struct peer *peer)
/* bgp log-neighbor-changes of neighbor Down */
if (bgp_flag_check (peer->bgp, BGP_FLAG_LOG_NEIGHBOR_CHANGES))
- zlog_info ("%%ADJCHANGE: neighbor %s Down %s", peer->host,
- peer_down_str [(int) peer->last_reset]);
+ {
+ struct vrf *vrf = vrf_lookup_by_id (peer->bgp->vrf_id);
+ zlog_info ("%%ADJCHANGE: neighbor %s(%s) in vrf %s Down %s",
+ peer->host,
+ (peer->hostname) ? peer->hostname : "Unknown",
+ vrf ? ((vrf->vrf_id != VRF_DEFAULT) ? vrf->name : "Default") : "",
+ peer_down_str [(int) peer->last_reset]);
+ }
/* graceful restart */
if (peer->t_gr_stale)
@@ -1459,8 +1465,13 @@ bgp_establish (struct peer *peer)
/* bgp log-neighbor-changes of neighbor Up */
if (bgp_flag_check (peer->bgp, BGP_FLAG_LOG_NEIGHBOR_CHANGES))
- zlog_info ("%%ADJCHANGE: neighbor %s Up", peer->host);
-
+ {
+ struct vrf *vrf = vrf_lookup_by_id (peer->bgp->vrf_id);
+ zlog_info ("%%ADJCHANGE: neighbor %s(%s) in vrf %s Up",
+ peer->host,
+ (peer->hostname) ? peer->hostname : "Unknown",
+ vrf ? ((vrf->vrf_id != VRF_DEFAULT ) ? vrf->name : "Default") : "");
+ }
/* assign update-group/subgroup */
update_group_adjust_peer_afs(peer);
diff --git a/bgpd/bgp_packet.c b/bgpd/bgp_packet.c
index 796a57f054..5ac982d565 100644
--- a/bgpd/bgp_packet.c
+++ b/bgpd/bgp_packet.c
@@ -1118,7 +1118,10 @@ bgp_open_receive (struct peer *peer, bgp_size_t size)
else
peer->v_holdtime = send_holdtime;
- peer->v_keepalive = peer->v_holdtime / 3;
+ if (CHECK_FLAG (peer->config, PEER_CONFIG_TIMER))
+ peer->v_keepalive = peer->keepalive;
+ else
+ peer->v_keepalive = peer->v_holdtime / 3;
/* Open option part parse. */
if (optlen != 0)
diff --git a/bgpd/bgp_vty.c b/bgpd/bgp_vty.c
index 347d026aff..9d5a4bd1cf 100644
--- a/bgpd/bgp_vty.c
+++ b/bgpd/bgp_vty.c
@@ -2872,7 +2872,12 @@ peer_conf_interface_get (struct vty *vty, const char *conf_if, afi_t afi,
}
peer = peer_lookup_by_conf_if (bgp, conf_if);
- if (!peer)
+ if (peer)
+ {
+ if (as_str)
+ ret = peer_remote_as (bgp, &su, conf_if, &as, as_type, afi, safi);
+ }
+ else
{
if (bgp_flag_check (bgp, BGP_FLAG_NO_DEFAULT_IPV4)
&& afi == AFI_IP && safi == SAFI_UNICAST)
@@ -2882,7 +2887,10 @@ peer_conf_interface_get (struct vty *vty, const char *conf_if, afi_t afi,
peer = peer_create (NULL, conf_if, bgp, bgp->as, as, as_type, afi, safi,
NULL);
- if (peer && v6only)
+ if (!peer)
+ return CMD_WARNING;
+
+ if (v6only)
SET_FLAG(peer->flags, PEER_FLAG_IFPEER_V6ONLY);
/* Request zebra to initiate IPv6 RAs on this interface. We do this
@@ -2891,13 +2899,11 @@ peer_conf_interface_get (struct vty *vty, const char *conf_if, afi_t afi,
* gets deleted later etc.)
*/
if (peer->ifp)
- {
- bgp_zebra_initiate_radv (bgp, peer);
- }
- peer_flag_set (peer, PEER_FLAG_CAPABILITY_ENHE);
+ bgp_zebra_initiate_radv (bgp, peer);
}
- else if ((v6only && !CHECK_FLAG(peer->flags, PEER_FLAG_IFPEER_V6ONLY)) ||
- (!v6only && CHECK_FLAG(peer->flags, PEER_FLAG_IFPEER_V6ONLY)))
+
+ if ((v6only && !CHECK_FLAG(peer->flags, PEER_FLAG_IFPEER_V6ONLY)) ||
+ (!v6only && CHECK_FLAG(peer->flags, PEER_FLAG_IFPEER_V6ONLY)))
{
if (v6only)
SET_FLAG(peer->flags, PEER_FLAG_IFPEER_V6ONLY);
@@ -2915,8 +2921,8 @@ peer_conf_interface_get (struct vty *vty, const char *conf_if, afi_t afi,
bgp_session_reset(peer);
}
- if (!peer)
- return CMD_WARNING;
+ if (!CHECK_FLAG (peer->flags, PEER_FLAG_CAPABILITY_ENHE))
+ peer_flag_set (peer, PEER_FLAG_CAPABILITY_ENHE);
if (peer_group_name)
{
@@ -11081,6 +11087,7 @@ bgp_show_peer (struct vty *vty, struct peer *p, u_char use_json, json_object *js
u_int16_t i;
u_char *msg;
json_object *json_neigh = NULL;
+ time_t epoch_tbuf;
bgp = p->bgp;
@@ -11271,8 +11278,11 @@ bgp_show_peer (struct vty *vty, struct peer *p, u_char use_json, json_object *js
uptime = bgp_clock();
uptime -= p->uptime;
tm = gmtime(&uptime);
+ epoch_tbuf = time(NULL) - uptime;
json_object_int_add(json_neigh, "bgpTimerUp", (tm->tm_sec * 1000) + (tm->tm_min * 60000) + (tm->tm_hour * 3600000));
+ json_object_string_add(json_neigh, "bgpTimerUpString", peer_uptime (p->uptime, timebuf, BGP_UPTIME_LEN, 0, NULL));
+ json_object_int_add(json_neigh, "bgpTimerUpEstablishedEpoch", epoch_tbuf);
}
else if (p->status == Active)
diff --git a/bgpd/bgp_zebra.c b/bgpd/bgp_zebra.c
index 3d3bd90f5b..d07fc65bdf 100644
--- a/bgpd/bgp_zebra.c
+++ b/bgpd/bgp_zebra.c
@@ -1469,7 +1469,8 @@ bgp_zebra_announce (struct prefix *p, struct bgp_info *info, struct bgp *bgp,
if (!ifindex)
{
if (info->peer->conf_if || info->peer->ifname)
- ifindex = if_nametoindex (info->peer->conf_if ? info->peer->conf_if : info->peer->ifname);
+ ifindex = ifname2ifindex_vrf (info->peer->conf_if ? info->peer->conf_if :
+ info->peer->ifname, bgp->vrf_id);
else if (info->peer->nexthop.ifp)
ifindex = info->peer->nexthop.ifp->ifindex;
}
diff --git a/bgpd/bgpd.c b/bgpd/bgpd.c
index 86133cd763..c1635bdb41 100644
--- a/bgpd/bgpd.c
+++ b/bgpd/bgpd.c
@@ -2652,7 +2652,7 @@ peer_group_bind (struct bgp *bgp, union sockunion *su, struct peer *peer,
* Capability extended-nexthop is enabled for an interface neighbor by
* default. So, fix that up here.
*/
- if (peer->ifp && cap_enhe_preset)
+ if (peer->conf_if && cap_enhe_preset)
peer_flag_set (peer, PEER_FLAG_CAPABILITY_ENHE);
for (afi = AFI_IP; afi < AFI_MAX; afi++)
@@ -6250,7 +6250,7 @@ peer_clear_soft (struct peer *peer, afi_t afi, safi_t safi,
char *
peer_uptime (time_t uptime2, char *buf, size_t len, u_char use_json, json_object *json)
{
- time_t uptime1;
+ time_t uptime1, epoch_tbuf;
struct tm *tm;
/* Check buffer length. */
@@ -6304,8 +6304,10 @@ peer_uptime (time_t uptime2, char *buf, size_t len, u_char use_json, json_object
if (use_json)
{
+ epoch_tbuf = time(NULL) - uptime1;
json_object_string_add(json, "peerUptime", buf);
json_object_long_add(json, "peerUptimeMsec", uptime1 * 1000);
+ json_object_int_add(json, "peerUptimeEstablishedEpoch", epoch_tbuf);
}
return buf;
diff --git a/ospf6d/ospf6_lsa.c b/ospf6d/ospf6_lsa.c
index 35e5a91544..867dc3d9d8 100644
--- a/ospf6d/ospf6_lsa.c
+++ b/ospf6d/ospf6_lsa.c
@@ -77,8 +77,7 @@ struct ospf6_lsa_handler unknown_handler =
"Unknown",
"Unk",
ospf6_unknown_lsa_show,
- NULL,
- OSPF6_LSA_DEBUG,
+ NULL
};
void
@@ -822,7 +821,14 @@ DEFUN (debug_ospf6_lsa_type,
DEBUG_STR
OSPF6_STR
"Debug Link State Advertisements (LSAs)\n"
- "Specify LS type as Hexadecimal\n"
+ "Router LSA's\n"
+ "Network LSA's\n"
+ "Inter-Prefix LSA's\n"
+ "Inter-Router LSA's\n"
+ "AS-External LSA's\n"
+ "Link LSA's\n"
+ "Intra-Prefix LSA's\n"
+ "Unknown LSA's\n"
)
{
unsigned int i;
@@ -866,7 +872,17 @@ ALIAS (debug_ospf6_lsa_type,
DEBUG_STR
OSPF6_STR
"Debug Link State Advertisements (LSAs)\n"
- "Specify LS type as Hexadecimal\n"
+ "Router LSA's\n"
+ "Network LSA's\n"
+ "Inter-Prefix LSA's\n"
+ "Inter-Router LSA's\n"
+ "AS-External LSA's\n"
+ "Link LSA's\n"
+ "Intra-Prefix LSA's\n"
+ "Unknown LSA's\n"
+ "Originate\n"
+ "Examine\n"
+ "Flooding\n"
)
DEFUN (no_debug_ospf6_lsa_type,
@@ -876,7 +892,14 @@ DEFUN (no_debug_ospf6_lsa_type,
DEBUG_STR
OSPF6_STR
"Debug Link State Advertisements (LSAs)\n"
- "Specify LS type as Hexadecimal\n"
+ "Router LSA's\n"
+ "Network LSA's\n"
+ "Inter-Prefix LSA's\n"
+ "Inter-Router LSA's\n"
+ "AS-External LSA's\n"
+ "Link LSA's\n"
+ "Intra-Prefix LSA's\n"
+ "Unknown LSA's\n"
)
{
u_int i;
@@ -915,12 +938,22 @@ DEFUN (no_debug_ospf6_lsa_type,
ALIAS (no_debug_ospf6_lsa_type,
no_debug_ospf6_lsa_hex_detail_cmd,
- "no debug ospf6 lsa (router|network|inter-prefix|inter-router|as-external|link|intra-prefix) (originate|examine|flooding)",
+ "no debug ospf6 lsa (router|network|inter-prefix|inter-router|as-external|link|intra-prefix|unknown) (originate|examine|flooding)",
NO_STR
DEBUG_STR
OSPF6_STR
"Debug Link State Advertisements (LSAs)\n"
- "Specify LS type as Hexadecimal\n"
+ "Router LSA's\n"
+ "Network LSA's\n"
+ "Inter-Prefix LSA's\n"
+ "Inter-Router LSA's\n"
+ "AS-External LSA's\n"
+ "Link LSA's\n"
+ "Intra-Prefix LSA's\n"
+ "Unknown LSA's\n"
+ "Originate\n"
+ "Examine\n"
+ "Flooding\n"
)
void
diff --git a/ospfd/ospf_vty.c b/ospfd/ospf_vty.c
index 2724df98a0..b13c28d0c9 100644
--- a/ospfd/ospf_vty.c
+++ b/ospfd/ospf_vty.c
@@ -3967,9 +3967,14 @@ show_ip_ospf_interface_common (struct vty *vty, struct ospf *ospf, int argc,
{
show_ip_ospf_interface_sub (vty, ospf, ifp, json_interface_sub, use_json);
if (use_json)
- json_object_object_add(json, ifp->name, json_interface_sub);
+ {
+ json_object_object_add(json, ifp->name, json_interface_sub);
+ json_interface_sub = json_object_new_object ();
+ }
}
}
+ if (use_json)
+ json_object_free (json_interface_sub);
}
else
{
diff --git a/zebra/interface.c b/zebra/interface.c
index 39c20e6289..524183a434 100644
--- a/zebra/interface.c
+++ b/zebra/interface.c
@@ -693,6 +693,10 @@ if_delete_update (struct interface *ifp)
for setting ifindex to IFINDEX_INTERNAL after processing the
interface deletion message. */
ifp->ifindex = IFINDEX_INTERNAL;
+
+ /* if the ifp is in a vrf, move it to default so vrf can be deleted if desired */
+ if (ifp->vrf_id)
+ if_handle_vrf_change (ifp, VRF_DEFAULT);
}
/* VRF change for an interface */
diff --git a/zebra/redistribute.c b/zebra/redistribute.c
index 9c7ef5f12c..5d7dbd5b00 100644
--- a/zebra/redistribute.c
+++ b/zebra/redistribute.c
@@ -108,42 +108,38 @@ zebra_redistribute_default (struct zserv *client, vrf_id_t vrf_id)
/* Redistribute routes. */
static void
-zebra_redistribute (struct zserv *client, int type, u_short instance, vrf_id_t vrf_id)
+zebra_redistribute (struct zserv *client, int type, u_short instance, vrf_id_t vrf_id, int afi)
{
struct rib *newrib;
struct route_table *table;
struct route_node *rn;
- int afi;
- for (afi = AFI_IP; afi <= AFI_IP6; afi++)
- {
- table = zebra_vrf_table (afi, SAFI_UNICAST, vrf_id);
- if (! table)
- continue;
+ table = zebra_vrf_table (afi, SAFI_UNICAST, vrf_id);
+ if (! table)
+ return;
- for (rn = route_top (table); rn; rn = route_next (rn))
- RNODE_FOREACH_RIB (rn, newrib)
- {
- if (IS_ZEBRA_DEBUG_EVENT)
- zlog_debug("%s: checking: selected=%d, type=%d, distance=%d, "
- "zebra_check_addr=%d", __func__,
- CHECK_FLAG (newrib->flags, ZEBRA_FLAG_SELECTED),
- newrib->type, newrib->distance,
- zebra_check_addr (&rn->p));
-
- if (! CHECK_FLAG (newrib->flags, ZEBRA_FLAG_SELECTED))
- continue;
- if ((type != ZEBRA_ROUTE_ALL &&
- (newrib->type != type || newrib->instance != instance)))
- continue;
- if (newrib->distance == DISTANCE_INFINITY)
- continue;
- if (! zebra_check_addr (&rn->p))
- continue;
-
- zsend_redistribute_route (1, client, &rn->p, newrib);
- }
- }
+ for (rn = route_top (table); rn; rn = route_next (rn))
+ RNODE_FOREACH_RIB (rn, newrib)
+ {
+ if (IS_ZEBRA_DEBUG_EVENT)
+ zlog_debug("%s: checking: selected=%d, type=%d, distance=%d, "
+ "zebra_check_addr=%d", __func__,
+ CHECK_FLAG (newrib->flags, ZEBRA_FLAG_SELECTED),
+ newrib->type, newrib->distance,
+ zebra_check_addr (&rn->p));
+
+ if (! CHECK_FLAG (newrib->flags, ZEBRA_FLAG_SELECTED))
+ continue;
+ if ((type != ZEBRA_ROUTE_ALL &&
+ (newrib->type != type || newrib->instance != instance)))
+ continue;
+ if (newrib->distance == DISTANCE_INFINITY)
+ continue;
+ if (! zebra_check_addr (&rn->p))
+ continue;
+
+ zsend_redistribute_route (1, client, &rn->p, newrib);
+ }
}
/* Either advertise a route for redistribution to registered clients or */
@@ -262,13 +258,13 @@ zebra_redistribute_add (int command, struct zserv *client, int length,
if (! redist_check_instance (&client->mi_redist[afi][type], instance))
{
redist_add_instance (&client->mi_redist[afi][type], instance);
- zebra_redistribute (client, type, instance, zvrf_id (zvrf));
+ zebra_redistribute (client, type, instance, zvrf_id (zvrf), afi);
}
} else {
if (! vrf_bitmap_check (client->redist[afi][type], zvrf_id (zvrf)))
{
vrf_bitmap_set (client->redist[afi][type], zvrf_id (zvrf));
- zebra_redistribute (client, type, 0, zvrf_id (zvrf));
+ zebra_redistribute (client, type, 0, zvrf_id (zvrf), afi);
}
}
}
diff --git a/zebra/zebra_mpls_vty.c b/zebra/zebra_mpls_vty.c
index 8b967c3af8..343f2975e8 100644
--- a/zebra/zebra_mpls_vty.c
+++ b/zebra/zebra_mpls_vty.c
@@ -472,7 +472,7 @@ DEFUN (no_ip_route_tag_distance_label,
DEFUN (no_ip_route_mask_distance_label,
no_ip_route_mask_distance_label_cmd,
- "no ip route A.B.C.D A.B.C.D (A.B.C.D|INTERFACE|null0) <1-255>",
+ "no ip route A.B.C.D A.B.C.D (A.B.C.D|INTERFACE|null0) <1-255> label WORD",
NO_STR
IP_STR
"Establish static routes\n"
@@ -486,7 +486,7 @@ DEFUN (no_ip_route_mask_distance_label,
"One or more labels separated by '/'\n")
{
return zebra_static_ipv4 (vty, SAFI_UNICAST, 0, argv[0], argv[1], argv[2], NULL, NULL,
- argv[3], NULL, argv[5]);
+ argv[3], NULL, argv[4]);
}
DEFUN (no_ip_route_mask_tag_distance_label,
diff --git a/zebra/zebra_rib.c b/zebra/zebra_rib.c
index e48da0479b..23c4c9ebea 100644
--- a/zebra/zebra_rib.c
+++ b/zebra/zebra_rib.c
@@ -366,7 +366,6 @@ nexthop_active_ipv4 (struct rib *rib, struct nexthop *nexthop, int set,
if (set)
{
UNSET_FLAG (nexthop->flags, NEXTHOP_FLAG_RECURSIVE);
- zebra_deregister_rnh_static_nexthops(rib->vrf_id, nexthop->resolved, top);
nexthops_free(nexthop->resolved);
nexthop->resolved = NULL;
rib->nexthop_mtu = 0;
@@ -597,7 +596,6 @@ nexthop_active_ipv6 (struct rib *rib, struct nexthop *nexthop, int set,
if (set)
{
UNSET_FLAG (nexthop->flags, NEXTHOP_FLAG_RECURSIVE);
- zebra_deregister_rnh_static_nexthops (rib->vrf_id, nexthop->resolved, top);
nexthops_free(nexthop->resolved);
nexthop->resolved = NULL;
}
diff --git a/zebra/zebra_rnh.c b/zebra/zebra_rnh.c
index b679803b06..1032d5405f 100644
--- a/zebra/zebra_rnh.c
+++ b/zebra/zebra_rnh.c
@@ -546,7 +546,7 @@ zebra_rnh_process_static_routes (vrf_id_t vrfid, int family,
{
RNODE_FOREACH_RIB(static_rn, srib)
{
- if (srib->type == ZEBRA_ROUTE_STATIC)
+ if (srib->type != ZEBRA_ROUTE_STATIC)
continue;
/* Set the filter flag for the correct nexthop - static route may