mirror of
https://git.proxmox.com/git/mirror_frr
synced 2025-08-10 05:05:26 +00:00
commit
67395d4222
@ -301,14 +301,14 @@ void show_ip_eigrp_prefix_entry(struct vty *vty, struct eigrp_prefix_entry *tn)
|
|||||||
}
|
}
|
||||||
|
|
||||||
void show_ip_eigrp_nexthop_entry(struct vty *vty, struct eigrp *eigrp,
|
void show_ip_eigrp_nexthop_entry(struct vty *vty, struct eigrp *eigrp,
|
||||||
struct eigrp_nexthop_entry *te, int *first)
|
struct eigrp_nexthop_entry *te, bool *first)
|
||||||
{
|
{
|
||||||
if (te->reported_distance == EIGRP_MAX_METRIC)
|
if (te->reported_distance == EIGRP_MAX_METRIC)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (*first) {
|
if (*first) {
|
||||||
show_ip_eigrp_prefix_entry(vty, te->prefix);
|
show_ip_eigrp_prefix_entry(vty, te->prefix);
|
||||||
*first = 0;
|
*first = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (te->adv_router == eigrp->neighbor_self)
|
if (te->adv_router == eigrp->neighbor_self)
|
||||||
|
@ -156,8 +156,9 @@ extern void show_ip_eigrp_neighbor_sub(struct vty *, struct eigrp_neighbor *,
|
|||||||
int);
|
int);
|
||||||
extern void show_ip_eigrp_prefix_entry(struct vty *,
|
extern void show_ip_eigrp_prefix_entry(struct vty *,
|
||||||
struct eigrp_prefix_entry *);
|
struct eigrp_prefix_entry *);
|
||||||
extern void show_ip_eigrp_nexthop_entry(struct vty *, struct eigrp *,
|
extern void show_ip_eigrp_nexthop_entry(struct vty *vty, struct eigrp *eigrp,
|
||||||
struct eigrp_nexthop_entry *, int *);
|
struct eigrp_nexthop_entry *ne,
|
||||||
|
bool *first);
|
||||||
|
|
||||||
extern void eigrp_debug_init(void);
|
extern void eigrp_debug_init(void);
|
||||||
|
|
||||||
|
@ -114,6 +114,8 @@ int eigrp_if_delete_hook(struct interface *ifp)
|
|||||||
eigrp = ei->eigrp;
|
eigrp = ei->eigrp;
|
||||||
listnode_delete(eigrp->eiflist, ei);
|
listnode_delete(eigrp->eiflist, ei);
|
||||||
|
|
||||||
|
eigrp_fifo_free(ei->obuf);
|
||||||
|
|
||||||
XFREE(MTYPE_EIGRP_IF_INFO, ifp->info);
|
XFREE(MTYPE_EIGRP_IF_INFO, ifp->info);
|
||||||
ifp->info = NULL;
|
ifp->info = NULL;
|
||||||
|
|
||||||
@ -265,16 +267,11 @@ void eigrp_if_stream_unset(struct eigrp_interface *ei)
|
|||||||
{
|
{
|
||||||
struct eigrp *eigrp = ei->eigrp;
|
struct eigrp *eigrp = ei->eigrp;
|
||||||
|
|
||||||
if (ei->obuf) {
|
if (ei->on_write_q) {
|
||||||
eigrp_fifo_free(ei->obuf);
|
listnode_delete(eigrp->oi_write_q, ei);
|
||||||
ei->obuf = NULL;
|
if (list_isempty(eigrp->oi_write_q))
|
||||||
|
thread_cancel(eigrp->t_write);
|
||||||
if (ei->on_write_q) {
|
ei->on_write_q = 0;
|
||||||
listnode_delete(eigrp->oi_write_q, ei);
|
|
||||||
if (list_isempty(eigrp->oi_write_q))
|
|
||||||
thread_cancel(eigrp->t_write);
|
|
||||||
ei->on_write_q = 0;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -351,7 +348,6 @@ void eigrp_if_free(struct eigrp_interface *ei, int source)
|
|||||||
|
|
||||||
eigrp_if_down(ei);
|
eigrp_if_down(ei);
|
||||||
|
|
||||||
list_delete(&ei->nbrs);
|
|
||||||
listnode_delete(ei->eigrp->eiflist, ei);
|
listnode_delete(ei->eigrp->eiflist, ei);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -161,7 +161,7 @@ void eigrp_nexthop_entry_add(struct eigrp_prefix_entry *node,
|
|||||||
listnode_add_sort(node->entries, entry);
|
listnode_add_sort(node->entries, entry);
|
||||||
entry->prefix = node;
|
entry->prefix = node;
|
||||||
|
|
||||||
eigrp_zebra_route_add(node->destination, l);
|
eigrp_zebra_route_add(node->destination, l, node->fdistance);
|
||||||
}
|
}
|
||||||
|
|
||||||
list_delete(&l);
|
list_delete(&l);
|
||||||
@ -477,7 +477,8 @@ void eigrp_update_routing_table(struct eigrp_prefix_entry *prefix)
|
|||||||
successors = eigrp_topology_get_successor_max(prefix, eigrp->max_paths);
|
successors = eigrp_topology_get_successor_max(prefix, eigrp->max_paths);
|
||||||
|
|
||||||
if (successors) {
|
if (successors) {
|
||||||
eigrp_zebra_route_add(prefix->destination, successors);
|
eigrp_zebra_route_add(prefix->destination, successors,
|
||||||
|
prefix->fdistance);
|
||||||
for (ALL_LIST_ELEMENTS_RO(successors, node, entry))
|
for (ALL_LIST_ELEMENTS_RO(successors, node, entry))
|
||||||
entry->flags |= EIGRP_NEXTHOP_ENTRY_INTABLE_FLAG;
|
entry->flags |= EIGRP_NEXTHOP_ENTRY_INTABLE_FLAG;
|
||||||
|
|
||||||
|
@ -455,9 +455,33 @@ DEFUN (no_eigrp_neighbor,
|
|||||||
return CMD_SUCCESS;
|
return CMD_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
DEFUN (show_ip_eigrp_topology,
|
static void eigrp_vty_display_prefix_entry(struct vty *vty,
|
||||||
show_ip_eigrp_topology_cmd,
|
struct eigrp *eigrp,
|
||||||
"show ip eigrp topology [all-links]",
|
struct eigrp_prefix_entry *pe,
|
||||||
|
bool all)
|
||||||
|
{
|
||||||
|
bool first = true;
|
||||||
|
struct eigrp_nexthop_entry *te;
|
||||||
|
struct listnode *node;
|
||||||
|
|
||||||
|
for (ALL_LIST_ELEMENTS_RO(pe->entries, node, te)) {
|
||||||
|
if (all
|
||||||
|
|| (((te->flags
|
||||||
|
& EIGRP_NEXTHOP_ENTRY_SUCCESSOR_FLAG)
|
||||||
|
== EIGRP_NEXTHOP_ENTRY_SUCCESSOR_FLAG)
|
||||||
|
|| ((te->flags
|
||||||
|
& EIGRP_NEXTHOP_ENTRY_FSUCCESSOR_FLAG)
|
||||||
|
== EIGRP_NEXTHOP_ENTRY_FSUCCESSOR_FLAG))) {
|
||||||
|
show_ip_eigrp_nexthop_entry(vty, eigrp, te,
|
||||||
|
&first);
|
||||||
|
first = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
DEFPY (show_ip_eigrp_topology_all,
|
||||||
|
show_ip_eigrp_topology_all_cmd,
|
||||||
|
"show ip eigrp topology [all-links$all]",
|
||||||
SHOW_STR
|
SHOW_STR
|
||||||
IP_STR
|
IP_STR
|
||||||
"IP-EIGRP show commands\n"
|
"IP-EIGRP show commands\n"
|
||||||
@ -465,11 +489,8 @@ DEFUN (show_ip_eigrp_topology,
|
|||||||
"Show all links in topology table\n")
|
"Show all links in topology table\n")
|
||||||
{
|
{
|
||||||
struct eigrp *eigrp;
|
struct eigrp *eigrp;
|
||||||
struct listnode *node;
|
|
||||||
struct eigrp_prefix_entry *tn;
|
struct eigrp_prefix_entry *tn;
|
||||||
struct eigrp_nexthop_entry *te;
|
|
||||||
struct route_node *rn;
|
struct route_node *rn;
|
||||||
int first;
|
|
||||||
|
|
||||||
eigrp = eigrp_lookup();
|
eigrp = eigrp_lookup();
|
||||||
if (eigrp == NULL) {
|
if (eigrp == NULL) {
|
||||||
@ -484,34 +505,62 @@ DEFUN (show_ip_eigrp_topology,
|
|||||||
continue;
|
continue;
|
||||||
|
|
||||||
tn = rn->info;
|
tn = rn->info;
|
||||||
first = 1;
|
eigrp_vty_display_prefix_entry(vty, eigrp, tn,
|
||||||
for (ALL_LIST_ELEMENTS_RO(tn->entries, node, te)) {
|
all ? true : false);
|
||||||
if (argc == 5
|
|
||||||
|| (((te->flags
|
|
||||||
& EIGRP_NEXTHOP_ENTRY_SUCCESSOR_FLAG)
|
|
||||||
== EIGRP_NEXTHOP_ENTRY_SUCCESSOR_FLAG)
|
|
||||||
|| ((te->flags
|
|
||||||
& EIGRP_NEXTHOP_ENTRY_FSUCCESSOR_FLAG)
|
|
||||||
== EIGRP_NEXTHOP_ENTRY_FSUCCESSOR_FLAG))) {
|
|
||||||
show_ip_eigrp_nexthop_entry(vty, eigrp, te,
|
|
||||||
&first);
|
|
||||||
first = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return CMD_SUCCESS;
|
return CMD_SUCCESS;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ALIAS(show_ip_eigrp_topology, show_ip_eigrp_topology_detail_cmd,
|
DEFPY (show_ip_eigrp_topology,
|
||||||
"show ip eigrp topology <A.B.C.D|A.B.C.D/M|detail|summary>",
|
show_ip_eigrp_topology_cmd,
|
||||||
SHOW_STR IP_STR
|
"show ip eigrp topology <A.B.C.D$address|A.B.C.D/M$prefix>",
|
||||||
"IP-EIGRP show commands\n"
|
SHOW_STR
|
||||||
"IP-EIGRP topology\n"
|
IP_STR
|
||||||
"Netwok to display information about\n"
|
"IP-EIGRP show commands\n"
|
||||||
"IP prefix <network>/<length>, e.g., 192.168.0.0/16\n"
|
"IP-EIGRP topology\n"
|
||||||
"Show all links in topology table\n"
|
"For a specific address\n"
|
||||||
"Show a summary of the topology table\n")
|
"For a specific prefix\n")
|
||||||
|
{
|
||||||
|
struct eigrp *eigrp;
|
||||||
|
struct eigrp_prefix_entry *tn;
|
||||||
|
struct route_node *rn;
|
||||||
|
struct prefix cmp;
|
||||||
|
|
||||||
|
eigrp = eigrp_lookup();
|
||||||
|
if (eigrp == NULL) {
|
||||||
|
vty_out(vty, " EIGRP Routing Process not enabled\n");
|
||||||
|
return CMD_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
show_ip_eigrp_topology_header(vty, eigrp);
|
||||||
|
|
||||||
|
if (address_str)
|
||||||
|
prefix_str = address_str;
|
||||||
|
|
||||||
|
if (str2prefix(prefix_str, &cmp) < 0) {
|
||||||
|
vty_out(vty, "%% Malformed address\n");
|
||||||
|
return CMD_WARNING;
|
||||||
|
}
|
||||||
|
|
||||||
|
rn = route_node_match(eigrp->topology_table, &cmp);
|
||||||
|
if (!rn) {
|
||||||
|
vty_out(vty, "%% Network not in table\n");
|
||||||
|
return CMD_WARNING;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!rn->info) {
|
||||||
|
vty_out(vty, "%% Network not in table\n");
|
||||||
|
route_unlock_node(rn);
|
||||||
|
return CMD_WARNING;
|
||||||
|
}
|
||||||
|
|
||||||
|
tn = rn->info;
|
||||||
|
eigrp_vty_display_prefix_entry(vty, eigrp, tn, argc == 5);
|
||||||
|
|
||||||
|
return CMD_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
DEFUN (show_ip_eigrp_interfaces,
|
DEFUN (show_ip_eigrp_interfaces,
|
||||||
show_ip_eigrp_interfaces_cmd,
|
show_ip_eigrp_interfaces_cmd,
|
||||||
@ -1485,8 +1534,7 @@ void eigrp_vty_show_init(void)
|
|||||||
install_element(VIEW_NODE, &show_ip_eigrp_neighbors_cmd);
|
install_element(VIEW_NODE, &show_ip_eigrp_neighbors_cmd);
|
||||||
|
|
||||||
install_element(VIEW_NODE, &show_ip_eigrp_topology_cmd);
|
install_element(VIEW_NODE, &show_ip_eigrp_topology_cmd);
|
||||||
|
install_element(VIEW_NODE, &show_ip_eigrp_topology_all_cmd);
|
||||||
install_element(VIEW_NODE, &show_ip_eigrp_topology_detail_cmd);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* eigrpd's interface node. */
|
/* eigrpd's interface node. */
|
||||||
|
@ -353,7 +353,8 @@ static struct interface *zebra_interface_if_lookup(struct stream *s)
|
|||||||
return if_lookup_by_name(ifname_tmp, VRF_DEFAULT);
|
return if_lookup_by_name(ifname_tmp, VRF_DEFAULT);
|
||||||
}
|
}
|
||||||
|
|
||||||
void eigrp_zebra_route_add(struct prefix *p, struct list *successors)
|
void eigrp_zebra_route_add(struct prefix *p, struct list *successors,
|
||||||
|
uint32_t distance)
|
||||||
{
|
{
|
||||||
struct zapi_route api;
|
struct zapi_route api;
|
||||||
struct zapi_nexthop *api_nh;
|
struct zapi_nexthop *api_nh;
|
||||||
@ -368,9 +369,11 @@ void eigrp_zebra_route_add(struct prefix *p, struct list *successors)
|
|||||||
api.vrf_id = VRF_DEFAULT;
|
api.vrf_id = VRF_DEFAULT;
|
||||||
api.type = ZEBRA_ROUTE_EIGRP;
|
api.type = ZEBRA_ROUTE_EIGRP;
|
||||||
api.safi = SAFI_UNICAST;
|
api.safi = SAFI_UNICAST;
|
||||||
|
api.metric = distance;
|
||||||
memcpy(&api.prefix, p, sizeof(*p));
|
memcpy(&api.prefix, p, sizeof(*p));
|
||||||
|
|
||||||
SET_FLAG(api.message, ZAPI_MESSAGE_NEXTHOP);
|
SET_FLAG(api.message, ZAPI_MESSAGE_NEXTHOP);
|
||||||
|
SET_FLAG(api.message, ZAPI_MESSAGE_METRIC);
|
||||||
|
|
||||||
/* Nexthop, ifindex, distance and metric information. */
|
/* Nexthop, ifindex, distance and metric information. */
|
||||||
for (ALL_LIST_ELEMENTS_RO(successors, node, te)) {
|
for (ALL_LIST_ELEMENTS_RO(successors, node, te)) {
|
||||||
|
@ -33,7 +33,8 @@
|
|||||||
|
|
||||||
extern void eigrp_zebra_init(void);
|
extern void eigrp_zebra_init(void);
|
||||||
|
|
||||||
extern void eigrp_zebra_route_add(struct prefix *, struct list *);
|
extern void eigrp_zebra_route_add(struct prefix *, struct list *,
|
||||||
|
uint32_t distance);
|
||||||
extern void eigrp_zebra_route_delete(struct prefix *);
|
extern void eigrp_zebra_route_delete(struct prefix *);
|
||||||
extern int eigrp_redistribute_set(struct eigrp *, int, struct eigrp_metrics);
|
extern int eigrp_redistribute_set(struct eigrp *, int, struct eigrp_metrics);
|
||||||
extern int eigrp_redistribute_unset(struct eigrp *, int);
|
extern int eigrp_redistribute_unset(struct eigrp *, int);
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
{
|
{
|
||||||
"prefix":"192.168.1.0/24",
|
"prefix":"192.168.1.0/24",
|
||||||
"protocol":"eigrp",
|
"protocol":"eigrp",
|
||||||
"metric":0,
|
"metric":28160,
|
||||||
"nexthops":[
|
"nexthops":[
|
||||||
{
|
{
|
||||||
"directlyConnected":true,
|
"directlyConnected":true,
|
||||||
@ -31,7 +31,7 @@
|
|||||||
"prefix":"192.168.3.0/24",
|
"prefix":"192.168.3.0/24",
|
||||||
"protocol":"eigrp",
|
"protocol":"eigrp",
|
||||||
"selected":true,
|
"selected":true,
|
||||||
"metric":0,
|
"metric":33280,
|
||||||
"nexthops":[
|
"nexthops":[
|
||||||
{
|
{
|
||||||
"fib":true,
|
"fib":true,
|
||||||
@ -47,7 +47,7 @@
|
|||||||
{
|
{
|
||||||
"prefix":"193.1.1.0/26",
|
"prefix":"193.1.1.0/26",
|
||||||
"protocol":"eigrp",
|
"protocol":"eigrp",
|
||||||
"metric":0,
|
"metric":28160,
|
||||||
"nexthops":[
|
"nexthops":[
|
||||||
{
|
{
|
||||||
"directlyConnected":true,
|
"directlyConnected":true,
|
||||||
@ -75,7 +75,7 @@
|
|||||||
"prefix":"193.1.2.0/24",
|
"prefix":"193.1.2.0/24",
|
||||||
"protocol":"eigrp",
|
"protocol":"eigrp",
|
||||||
"selected":true,
|
"selected":true,
|
||||||
"metric":0,
|
"metric":30720,
|
||||||
"nexthops":[
|
"nexthops":[
|
||||||
{
|
{
|
||||||
"fib":true,
|
"fib":true,
|
||||||
|
@ -4,7 +4,7 @@
|
|||||||
"prefix":"192.168.1.0/24",
|
"prefix":"192.168.1.0/24",
|
||||||
"protocol":"eigrp",
|
"protocol":"eigrp",
|
||||||
"selected":true,
|
"selected":true,
|
||||||
"metric":0,
|
"metric":30720,
|
||||||
"nexthops":[
|
"nexthops":[
|
||||||
{
|
{
|
||||||
"fib":true,
|
"fib":true,
|
||||||
@ -21,7 +21,7 @@
|
|||||||
"prefix":"192.168.3.0/24",
|
"prefix":"192.168.3.0/24",
|
||||||
"protocol":"eigrp",
|
"protocol":"eigrp",
|
||||||
"selected":true,
|
"selected":true,
|
||||||
"metric":0,
|
"metric":30720,
|
||||||
"nexthops":[
|
"nexthops":[
|
||||||
{
|
{
|
||||||
"fib":true,
|
"fib":true,
|
||||||
@ -37,7 +37,7 @@
|
|||||||
{
|
{
|
||||||
"prefix":"193.1.1.0/26",
|
"prefix":"193.1.1.0/26",
|
||||||
"protocol":"eigrp",
|
"protocol":"eigrp",
|
||||||
"metric":0,
|
"metric":28160,
|
||||||
"nexthops":[
|
"nexthops":[
|
||||||
{
|
{
|
||||||
"directlyConnected":true,
|
"directlyConnected":true,
|
||||||
@ -64,7 +64,7 @@
|
|||||||
{
|
{
|
||||||
"prefix":"193.1.2.0/24",
|
"prefix":"193.1.2.0/24",
|
||||||
"protocol":"eigrp",
|
"protocol":"eigrp",
|
||||||
"metric":0,
|
"metric":28160,
|
||||||
"nexthops":[
|
"nexthops":[
|
||||||
{
|
{
|
||||||
"directlyConnected":true,
|
"directlyConnected":true,
|
||||||
|
@ -4,7 +4,7 @@
|
|||||||
"prefix":"192.168.1.0/24",
|
"prefix":"192.168.1.0/24",
|
||||||
"protocol":"eigrp",
|
"protocol":"eigrp",
|
||||||
"selected":true,
|
"selected":true,
|
||||||
"metric":0,
|
"metric":33280,
|
||||||
"nexthops":[
|
"nexthops":[
|
||||||
{
|
{
|
||||||
"fib":true,
|
"fib":true,
|
||||||
@ -38,7 +38,7 @@
|
|||||||
{
|
{
|
||||||
"prefix":"192.168.3.0/24",
|
"prefix":"192.168.3.0/24",
|
||||||
"protocol":"eigrp",
|
"protocol":"eigrp",
|
||||||
"metric":0,
|
"metric":28160,
|
||||||
"nexthops":[
|
"nexthops":[
|
||||||
{
|
{
|
||||||
"directlyConnected":true,
|
"directlyConnected":true,
|
||||||
@ -66,7 +66,7 @@
|
|||||||
"prefix":"193.1.1.0/26",
|
"prefix":"193.1.1.0/26",
|
||||||
"protocol":"eigrp",
|
"protocol":"eigrp",
|
||||||
"selected":true,
|
"selected":true,
|
||||||
"metric":0,
|
"metric":30720,
|
||||||
"nexthops":[
|
"nexthops":[
|
||||||
{
|
{
|
||||||
"fib":true,
|
"fib":true,
|
||||||
@ -82,7 +82,7 @@
|
|||||||
{
|
{
|
||||||
"prefix":"193.1.2.0/24",
|
"prefix":"193.1.2.0/24",
|
||||||
"protocol":"eigrp",
|
"protocol":"eigrp",
|
||||||
"metric":0,
|
"metric":28160,
|
||||||
"nexthops":[
|
"nexthops":[
|
||||||
{
|
{
|
||||||
"directlyConnected":true,
|
"directlyConnected":true,
|
||||||
|
@ -153,7 +153,6 @@ def test_eigrp_routes():
|
|||||||
assertmsg = '"show ip eigrp topo" mismatches on {}'.format(router.name)
|
assertmsg = '"show ip eigrp topo" mismatches on {}'.format(router.name)
|
||||||
assert topotest.json_cmp(actual, expected) is None, assertmsg
|
assert topotest.json_cmp(actual, expected) is None, assertmsg
|
||||||
|
|
||||||
|
|
||||||
def test_zebra_ipv4_routingTable():
|
def test_zebra_ipv4_routingTable():
|
||||||
"Test 'show ip route'"
|
"Test 'show ip route'"
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user