mirror of
https://git.proxmox.com/git/mirror_frr
synced 2025-08-09 01:57:26 +00:00
Merge pull request #1092 from donaldsharp/unreachable
Grab bag of issues
This commit is contained in:
commit
51ce5c716c
@ -3187,6 +3187,7 @@ void bgp_free(struct bgp *bgp)
|
|||||||
safi_t safi;
|
safi_t safi;
|
||||||
struct bgp_table *table;
|
struct bgp_table *table;
|
||||||
struct bgp_node *rn;
|
struct bgp_node *rn;
|
||||||
|
struct bgp_rmap *rmap;
|
||||||
|
|
||||||
QOBJ_UNREG(bgp);
|
QOBJ_UNREG(bgp);
|
||||||
|
|
||||||
@ -3215,6 +3216,9 @@ void bgp_free(struct bgp *bgp)
|
|||||||
bgp_table_finish(&bgp->aggregate[afi][safi]);
|
bgp_table_finish(&bgp->aggregate[afi][safi]);
|
||||||
if (bgp->rib[afi][safi])
|
if (bgp->rib[afi][safi])
|
||||||
bgp_table_finish(&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);
|
bgp_scan_finish(bgp);
|
||||||
|
@ -272,6 +272,7 @@ int eigrp_make_sha256_digest(struct eigrp_interface *ei, struct stream *s,
|
|||||||
if (!key) {
|
if (!key) {
|
||||||
zlog_warn("Interface %s: Expected key value not found in config",
|
zlog_warn("Interface %s: Expected key value not found in config",
|
||||||
ei->ifp->name);
|
ei->ifp->name);
|
||||||
|
eigrp_authTLV_SHA256_free(auth_TLV);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -622,8 +623,8 @@ int eigrp_read(struct thread *thread)
|
|||||||
if (IS_DEBUG_EIGRP_TRANSMIT(0, RECV)) {
|
if (IS_DEBUG_EIGRP_TRANSMIT(0, RECV)) {
|
||||||
char src[PREFIX_STRLEN], dst[PREFIX_STRLEN];
|
char src[PREFIX_STRLEN], dst[PREFIX_STRLEN];
|
||||||
|
|
||||||
strncpy(src, inet_ntoa(iph->ip_src), PREFIX_STRLEN);
|
strlcpy(src, inet_ntoa(iph->ip_src), sizeof(src));
|
||||||
strncpy(dst, inet_ntoa(iph->ip_dst), PREFIX_STRLEN);
|
strlcpy(dst, inet_ntoa(iph->ip_dst), sizeof(dst));
|
||||||
zlog_debug("Received [%s][%d/%d] length [%u] via [%s] src [%s] dst [%s]",
|
zlog_debug("Received [%s][%d/%d] length [%u] via [%s] src [%s] dst [%s]",
|
||||||
lookup_msg(eigrp_packet_type_str, opcode, NULL),
|
lookup_msg(eigrp_packet_type_str, opcode, NULL),
|
||||||
ntohl(eigrph->sequence), ntohl(eigrph->ack), length,
|
ntohl(eigrph->sequence), ntohl(eigrph->ack), length,
|
||||||
|
@ -202,9 +202,9 @@ static int pim_vrf_config_write(struct vty *vty)
|
|||||||
if (vrf->vrf_id == VRF_DEFAULT)
|
if (vrf->vrf_id == VRF_DEFAULT)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
vty_out(vty, "vrf %s\n", vrf->name);
|
vty_frame(vty, "vrf %s\n", vrf->name);
|
||||||
pim_global_config_write_worker(pim, vty);
|
pim_global_config_write_worker(pim, vty);
|
||||||
vty_out(vty, "!\n");
|
vty_endframe(vty, "!\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -148,14 +148,15 @@ static inline int is_selfroute(int proto)
|
|||||||
|| (proto == RTPROT_STATIC) || (proto == RTPROT_ZEBRA)
|
|| (proto == RTPROT_STATIC) || (proto == RTPROT_ZEBRA)
|
||||||
|| (proto == RTPROT_ISIS) || (proto == RTPROT_RIPNG)
|
|| (proto == RTPROT_ISIS) || (proto == RTPROT_RIPNG)
|
||||||
|| (proto == RTPROT_NHRP) || (proto == RTPROT_EIGRP)
|
|| (proto == RTPROT_NHRP) || (proto == RTPROT_EIGRP)
|
||||||
|| (proto == RTPROT_LDP) || (proto == RTPROT_BABEL)) {
|
|| (proto == RTPROT_LDP) || (proto == RTPROT_BABEL)
|
||||||
|
|| (proto == RTPROT_RIP)) {
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline int get_rt_proto(int proto)
|
static inline int zebra2proto(int proto)
|
||||||
{
|
{
|
||||||
switch (proto) {
|
switch (proto) {
|
||||||
case ZEBRA_ROUTE_BABEL:
|
case ZEBRA_ROUTE_BABEL:
|
||||||
@ -197,6 +198,47 @@ static inline int get_rt_proto(int proto)
|
|||||||
return 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)
|
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};
|
char anyaddr[16] = {0};
|
||||||
|
|
||||||
|
int proto = ZEBRA_ROUTE_KERNEL;
|
||||||
int index = 0;
|
int index = 0;
|
||||||
int table;
|
int table;
|
||||||
int metric = 0;
|
int metric = 0;
|
||||||
@ -300,9 +343,10 @@ static int netlink_route_change_read_unicast(struct sockaddr_nl *snl,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Route which inserted by Zebra. */
|
/* Route which inserted by Zebra. */
|
||||||
if (is_selfroute(rtm->rtm_protocol))
|
if (is_selfroute(rtm->rtm_protocol)) {
|
||||||
flags |= ZEBRA_FLAG_SELFROUTE;
|
flags |= ZEBRA_FLAG_SELFROUTE;
|
||||||
|
proto = proto2zebra(rtm->rtm_protocol, rtm->rtm_family);
|
||||||
|
}
|
||||||
if (tb[RTA_OIF])
|
if (tb[RTA_OIF])
|
||||||
index = *(int *)RTA_DATA(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);
|
memcpy(&nh.src, prefsrc, sz);
|
||||||
if (gate)
|
if (gate)
|
||||||
memcpy(&nh.gate, gate, sz);
|
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);
|
0, flags, &p, NULL, &nh, table, metric, mtu, 0);
|
||||||
} else {
|
} else {
|
||||||
/* This is a multipath route */
|
/* 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]);
|
len = RTA_PAYLOAD(tb[RTA_MULTIPATH]);
|
||||||
|
|
||||||
re = XCALLOC(MTYPE_RE, sizeof(struct route_entry));
|
re = XCALLOC(MTYPE_RE, sizeof(struct route_entry));
|
||||||
re->type = ZEBRA_ROUTE_KERNEL;
|
re->type = proto;
|
||||||
re->distance = 0;
|
re->distance = 0;
|
||||||
re->flags = flags;
|
re->flags = flags;
|
||||||
re->metric = metric;
|
re->metric = metric;
|
||||||
@ -515,13 +560,13 @@ static int netlink_route_change_read_unicast(struct sockaddr_nl *snl,
|
|||||||
if (gate)
|
if (gate)
|
||||||
memcpy(&nh.gate, gate, sz);
|
memcpy(&nh.gate, gate, sz);
|
||||||
rib_delete(afi, SAFI_UNICAST, vrf_id,
|
rib_delete(afi, SAFI_UNICAST, vrf_id,
|
||||||
ZEBRA_ROUTE_KERNEL, 0, flags, &p, NULL, &nh,
|
proto, 0, flags, &p, NULL, &nh,
|
||||||
table, metric);
|
table, metric);
|
||||||
} else {
|
} else {
|
||||||
/* XXX: need to compare the entire list of nexthops
|
/* XXX: need to compare the entire list of nexthops
|
||||||
* here for NLM_F_APPEND stupidity */
|
* here for NLM_F_APPEND stupidity */
|
||||||
rib_delete(afi, SAFI_UNICAST, vrf_id,
|
rib_delete(afi, SAFI_UNICAST, vrf_id,
|
||||||
ZEBRA_ROUTE_KERNEL, 0, flags, &p, NULL, NULL,
|
proto, 0, flags, &p, NULL, NULL,
|
||||||
table, metric);
|
table, metric);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1272,7 +1317,7 @@ static int netlink_route_multipath(int cmd, struct prefix *p,
|
|||||||
req.r.rtm_family = family;
|
req.r.rtm_family = family;
|
||||||
req.r.rtm_dst_len = p->prefixlen;
|
req.r.rtm_dst_len = p->prefixlen;
|
||||||
req.r.rtm_src_len = src_p ? src_p->prefixlen : 0;
|
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_scope = RT_SCOPE_UNIVERSE;
|
||||||
req.r.rtm_type = RTN_UNICAST;
|
req.r.rtm_type = RTN_UNICAST;
|
||||||
|
|
||||||
|
@ -2072,8 +2072,9 @@ void _route_entry_dump(const char *func, union prefixconstptr pp,
|
|||||||
|
|
||||||
for (ALL_NEXTHOPS(re->nexthop, nexthop)) {
|
for (ALL_NEXTHOPS(re->nexthop, nexthop)) {
|
||||||
inet_ntop(p->family, &nexthop->gate, straddr, INET6_ADDRSTRLEN);
|
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->rparent ? " NH" : "NH"), straddr,
|
||||||
|
nexthop->ifindex,
|
||||||
(CHECK_FLAG(nexthop->flags, NEXTHOP_FLAG_ACTIVE)
|
(CHECK_FLAG(nexthop->flags, NEXTHOP_FLAG_ACTIVE)
|
||||||
? "ACTIVE "
|
? "ACTIVE "
|
||||||
: ""),
|
: ""),
|
||||||
@ -2644,23 +2645,50 @@ static void rib_sweep_table(struct route_table *table)
|
|||||||
struct route_node *rn;
|
struct route_node *rn;
|
||||||
struct route_entry *re;
|
struct route_entry *re;
|
||||||
struct route_entry *next;
|
struct route_entry *next;
|
||||||
|
struct nexthop *nexthop;
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
|
|
||||||
if (table)
|
if (!table)
|
||||||
for (rn = route_top(table); rn; rn = srcdest_route_next(rn))
|
return;
|
||||||
RNODE_FOREACH_RE_SAFE(rn, re, next)
|
|
||||||
{
|
|
||||||
if (CHECK_FLAG(re->status, ROUTE_ENTRY_REMOVED))
|
|
||||||
continue;
|
|
||||||
|
|
||||||
if (re->type == ZEBRA_ROUTE_KERNEL
|
for (rn = route_top(table); rn; rn = srcdest_route_next(rn)) {
|
||||||
&& CHECK_FLAG(re->flags,
|
RNODE_FOREACH_RE_SAFE(rn, re, next)
|
||||||
ZEBRA_FLAG_SELFROUTE)) {
|
{
|
||||||
ret = rib_uninstall_kernel(rn, re);
|
if (IS_ZEBRA_DEBUG_RIB)
|
||||||
if (!ret)
|
route_entry_dump(&rn->p, NULL, re);
|
||||||
rib_delnode(rn, 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. */
|
/* Sweep all RIB tables. */
|
||||||
@ -2669,8 +2697,10 @@ void rib_sweep_route(void)
|
|||||||
struct vrf *vrf;
|
struct vrf *vrf;
|
||||||
struct zebra_vrf *zvrf;
|
struct zebra_vrf *zvrf;
|
||||||
|
|
||||||
RB_FOREACH(vrf, vrf_id_head, &vrfs_by_id)
|
RB_FOREACH(vrf, vrf_id_head, &vrfs_by_id) {
|
||||||
if ((zvrf = vrf->info) != NULL) {
|
if ((zvrf = vrf->info) == NULL)
|
||||||
|
continue;
|
||||||
|
|
||||||
rib_sweep_table(zvrf->table[AFI_IP][SAFI_UNICAST]);
|
rib_sweep_table(zvrf->table[AFI_IP][SAFI_UNICAST]);
|
||||||
rib_sweep_table(zvrf->table[AFI_IP6][SAFI_UNICAST]);
|
rib_sweep_table(zvrf->table[AFI_IP6][SAFI_UNICAST]);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user