Merge pull request #1092 from donaldsharp/unreachable

Grab bag of issues
This commit is contained in:
Renato Westphal 2017-09-05 21:57:44 -03:00 committed by GitHub
commit 51ce5c716c
5 changed files with 110 additions and 30 deletions

View File

@ -3187,6 +3187,7 @@ void bgp_free(struct bgp *bgp)
safi_t safi;
struct bgp_table *table;
struct bgp_node *rn;
struct bgp_rmap *rmap;
QOBJ_UNREG(bgp);
@ -3215,6 +3216,9 @@ void bgp_free(struct bgp *bgp)
bgp_table_finish(&bgp->aggregate[afi][safi]);
if (bgp->rib[afi][safi])
bgp_table_finish(&bgp->rib[afi][safi]);
rmap = &bgp->table_map[afi][safi];
if (rmap->name)
XFREE(MTYPE_ROUTE_MAP_NAME, rmap->name);
}
bgp_scan_finish(bgp);

View File

@ -272,6 +272,7 @@ int eigrp_make_sha256_digest(struct eigrp_interface *ei, struct stream *s,
if (!key) {
zlog_warn("Interface %s: Expected key value not found in config",
ei->ifp->name);
eigrp_authTLV_SHA256_free(auth_TLV);
return 0;
}
@ -622,8 +623,8 @@ int eigrp_read(struct thread *thread)
if (IS_DEBUG_EIGRP_TRANSMIT(0, RECV)) {
char src[PREFIX_STRLEN], dst[PREFIX_STRLEN];
strncpy(src, inet_ntoa(iph->ip_src), PREFIX_STRLEN);
strncpy(dst, inet_ntoa(iph->ip_dst), PREFIX_STRLEN);
strlcpy(src, inet_ntoa(iph->ip_src), sizeof(src));
strlcpy(dst, inet_ntoa(iph->ip_dst), sizeof(dst));
zlog_debug("Received [%s][%d/%d] length [%u] via [%s] src [%s] dst [%s]",
lookup_msg(eigrp_packet_type_str, opcode, NULL),
ntohl(eigrph->sequence), ntohl(eigrph->ack), length,

View File

@ -202,9 +202,9 @@ static int pim_vrf_config_write(struct vty *vty)
if (vrf->vrf_id == VRF_DEFAULT)
continue;
vty_out(vty, "vrf %s\n", vrf->name);
vty_frame(vty, "vrf %s\n", vrf->name);
pim_global_config_write_worker(pim, vty);
vty_out(vty, "!\n");
vty_endframe(vty, "!\n");
}
return 0;

View File

@ -148,14 +148,15 @@ static inline int is_selfroute(int proto)
|| (proto == RTPROT_STATIC) || (proto == RTPROT_ZEBRA)
|| (proto == RTPROT_ISIS) || (proto == RTPROT_RIPNG)
|| (proto == RTPROT_NHRP) || (proto == RTPROT_EIGRP)
|| (proto == RTPROT_LDP) || (proto == RTPROT_BABEL)) {
|| (proto == RTPROT_LDP) || (proto == RTPROT_BABEL)
|| (proto == RTPROT_RIP)) {
return 1;
}
return 0;
}
static inline int get_rt_proto(int proto)
static inline int zebra2proto(int proto)
{
switch (proto) {
case ZEBRA_ROUTE_BABEL:
@ -197,6 +198,47 @@ static inline int get_rt_proto(int proto)
return proto;
}
static inline int proto2zebra(int proto, int family)
{
switch (proto) {
case RTPROT_BABEL:
proto = ZEBRA_ROUTE_BABEL;
break;
case RTPROT_BGP:
proto = ZEBRA_ROUTE_BGP;
break;
case RTPROT_OSPF:
proto = (family == AFI_IP) ?
ZEBRA_ROUTE_OSPF : ZEBRA_ROUTE_OSPF6;
break;
case RTPROT_ISIS:
proto = ZEBRA_ROUTE_ISIS;
break;
case RTPROT_RIP:
proto = ZEBRA_ROUTE_RIP;
break;
case RTPROT_RIPNG:
proto = ZEBRA_ROUTE_RIPNG;
break;
case RTPROT_NHRP:
proto = ZEBRA_ROUTE_NHRP;
break;
case RTPROT_EIGRP:
proto = ZEBRA_ROUTE_EIGRP;
break;
case RTPROT_LDP:
proto = ZEBRA_ROUTE_LDP;
break;
case RTPROT_STATIC:
proto = ZEBRA_ROUTE_STATIC;
break;
default:
proto = ZEBRA_ROUTE_KERNEL;
break;
}
return proto;
}
/*
Pending: create an efficient table_id (in a tree/hash) based lookup)
*/
@ -231,6 +273,7 @@ static int netlink_route_change_read_unicast(struct sockaddr_nl *snl,
char anyaddr[16] = {0};
int proto = ZEBRA_ROUTE_KERNEL;
int index = 0;
int table;
int metric = 0;
@ -300,9 +343,10 @@ static int netlink_route_change_read_unicast(struct sockaddr_nl *snl,
}
/* Route which inserted by Zebra. */
if (is_selfroute(rtm->rtm_protocol))
if (is_selfroute(rtm->rtm_protocol)) {
flags |= ZEBRA_FLAG_SELFROUTE;
proto = proto2zebra(rtm->rtm_protocol, rtm->rtm_family);
}
if (tb[RTA_OIF])
index = *(int *)RTA_DATA(tb[RTA_OIF]);
@ -409,7 +453,8 @@ static int netlink_route_change_read_unicast(struct sockaddr_nl *snl,
memcpy(&nh.src, prefsrc, sz);
if (gate)
memcpy(&nh.gate, gate, sz);
rib_add(afi, SAFI_UNICAST, vrf_id, ZEBRA_ROUTE_KERNEL,
rib_add(afi, SAFI_UNICAST, vrf_id, proto,
0, flags, &p, NULL, &nh, table, metric, mtu, 0);
} else {
/* This is a multipath route */
@ -421,7 +466,7 @@ static int netlink_route_change_read_unicast(struct sockaddr_nl *snl,
len = RTA_PAYLOAD(tb[RTA_MULTIPATH]);
re = XCALLOC(MTYPE_RE, sizeof(struct route_entry));
re->type = ZEBRA_ROUTE_KERNEL;
re->type = proto;
re->distance = 0;
re->flags = flags;
re->metric = metric;
@ -515,13 +560,13 @@ static int netlink_route_change_read_unicast(struct sockaddr_nl *snl,
if (gate)
memcpy(&nh.gate, gate, sz);
rib_delete(afi, SAFI_UNICAST, vrf_id,
ZEBRA_ROUTE_KERNEL, 0, flags, &p, NULL, &nh,
proto, 0, flags, &p, NULL, &nh,
table, metric);
} else {
/* XXX: need to compare the entire list of nexthops
* here for NLM_F_APPEND stupidity */
rib_delete(afi, SAFI_UNICAST, vrf_id,
ZEBRA_ROUTE_KERNEL, 0, flags, &p, NULL, NULL,
proto, 0, flags, &p, NULL, NULL,
table, metric);
}
}
@ -1272,7 +1317,7 @@ static int netlink_route_multipath(int cmd, struct prefix *p,
req.r.rtm_family = family;
req.r.rtm_dst_len = p->prefixlen;
req.r.rtm_src_len = src_p ? src_p->prefixlen : 0;
req.r.rtm_protocol = get_rt_proto(re->type);
req.r.rtm_protocol = zebra2proto(re->type);
req.r.rtm_scope = RT_SCOPE_UNIVERSE;
req.r.rtm_type = RTN_UNICAST;

View File

@ -2072,8 +2072,9 @@ void _route_entry_dump(const char *func, union prefixconstptr pp,
for (ALL_NEXTHOPS(re->nexthop, nexthop)) {
inet_ntop(p->family, &nexthop->gate, straddr, INET6_ADDRSTRLEN);
zlog_debug("%s: %s %s with flags %s%s%s", func,
zlog_debug("%s: %s %s[%u] with flags %s%s%s", func,
(nexthop->rparent ? " NH" : "NH"), straddr,
nexthop->ifindex,
(CHECK_FLAG(nexthop->flags, NEXTHOP_FLAG_ACTIVE)
? "ACTIVE "
: ""),
@ -2644,23 +2645,50 @@ static void rib_sweep_table(struct route_table *table)
struct route_node *rn;
struct route_entry *re;
struct route_entry *next;
struct nexthop *nexthop;
int ret = 0;
if (table)
for (rn = route_top(table); rn; rn = srcdest_route_next(rn))
RNODE_FOREACH_RE_SAFE(rn, re, next)
{
if (CHECK_FLAG(re->status, ROUTE_ENTRY_REMOVED))
continue;
if (!table)
return;
if (re->type == ZEBRA_ROUTE_KERNEL
&& CHECK_FLAG(re->flags,
ZEBRA_FLAG_SELFROUTE)) {
ret = rib_uninstall_kernel(rn, re);
if (!ret)
rib_delnode(rn, re);
}
}
for (rn = route_top(table); rn; rn = srcdest_route_next(rn)) {
RNODE_FOREACH_RE_SAFE(rn, re, next)
{
if (IS_ZEBRA_DEBUG_RIB)
route_entry_dump(&rn->p, NULL, re);
if (CHECK_FLAG(re->status, ROUTE_ENTRY_REMOVED))
continue;
if (!CHECK_FLAG(re->flags, ZEBRA_FLAG_SELFROUTE))
continue;
/*
* So we are starting up and have received
* routes from the kernel that we have installed
* from a previous run of zebra but not cleaned
* up ( say a kill -9 )
* But since we haven't actually installed
* them yet( we received them from the kernel )
* we don't think they are active.
* So let's pretend they are active to actually
* remove them.
* In all honesty I'm not sure if we should
* mark them as active when we receive them
* This is startup only so probably ok.
*
* If we ever decide to move rib_sweep_table
* to a different spot (ie startup )
* this decision needs to be revisited
*/
for (ALL_NEXTHOPS(re->nexthop, nexthop))
SET_FLAG(nexthop->flags, NEXTHOP_FLAG_FIB);
ret = rib_uninstall_kernel(rn, re);
if (!ret)
rib_delnode(rn, re);
}
}
}
/* Sweep all RIB tables. */
@ -2669,8 +2697,10 @@ void rib_sweep_route(void)
struct vrf *vrf;
struct zebra_vrf *zvrf;
RB_FOREACH(vrf, vrf_id_head, &vrfs_by_id)
if ((zvrf = vrf->info) != NULL) {
RB_FOREACH(vrf, vrf_id_head, &vrfs_by_id) {
if ((zvrf = vrf->info) == NULL)
continue;
rib_sweep_table(zvrf->table[AFI_IP][SAFI_UNICAST]);
rib_sweep_table(zvrf->table[AFI_IP6][SAFI_UNICAST]);
}