diff options
author | Renato Westphal <renato@openbsd.org> | 2018-12-17 11:33:34 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-12-17 11:33:34 +0100 |
commit | a8dfbac67bee2b55c34a2b57a4b223042e80afbd (patch) | |
tree | 8f9f26cccf6c7c1e89065b2506972ed109021246 /ospfd | |
parent | Merge pull request #3494 from donaldsharp/topotests_fixup (diff) | |
parent | ospfd: remove call to if_lookup_all_vrf (diff) | |
download | frr-a8dfbac67bee2b55c34a2b57a4b223042e80afbd.tar.xz frr-a8dfbac67bee2b55c34a2b57a4b223042e80afbd.zip |
Merge pull request #3335 from pguibert6WIND/ospf_remove_if_lookup_all_vrf
ospfd: remove call to if_lookup_all_vrf
Diffstat (limited to 'ospfd')
-rw-r--r-- | ospfd/ospf_te.c | 45 | ||||
-rw-r--r-- | ospfd/ospf_vty.c | 73 |
2 files changed, 75 insertions, 43 deletions
diff --git a/ospfd/ospf_te.c b/ospfd/ospf_te.c index 16347f1c5..3efc219fc 100644 --- a/ospfd/ospf_te.c +++ b/ospfd/ospf_te.c @@ -2530,8 +2530,8 @@ DEFUN (show_ip_ospf_mpls_te_link, "Interface name\n") { struct vrf *vrf; - int idx_interface = 5; - struct interface *ifp; + int idx_interface = 0; + struct interface *ifp = NULL; struct listnode *node; char *vrf_name = NULL; bool all_vrf; @@ -2543,7 +2543,7 @@ DEFUN (show_ip_ospf_mpls_te_link, vrf_name = argv[idx_vrf + 1]->arg; all_vrf = strmatch(vrf_name, "all"); } - + argv_find(argv, argc, "INTERFACE", &idx_interface); /* vrf input is provided could be all or specific vrf*/ if (vrf_name) { if (all_vrf) { @@ -2557,32 +2557,31 @@ DEFUN (show_ip_ospf_mpls_te_link, return CMD_SUCCESS; } ospf = ospf_lookup_by_inst_name(inst, vrf_name); - if (ospf == NULL || !ospf->oi_running) - return CMD_SUCCESS; - vrf = vrf_lookup_by_id(ospf->vrf_id); - FOR_ALL_INTERFACES (vrf, ifp) - show_mpls_te_link_sub(vty, ifp); + } else + ospf = ospf_lookup_by_vrf_id(VRF_DEFAULT); + if (ospf == NULL || !ospf->oi_running) return CMD_SUCCESS; - } - /* Show All Interfaces. */ - if (argc == 5) { - for (ALL_LIST_ELEMENTS_RO(om->ospf, node, ospf)) { - if (!ospf->oi_running) - continue; - vrf = vrf_lookup_by_id(ospf->vrf_id); - FOR_ALL_INTERFACES (vrf, ifp) - show_mpls_te_link_sub(vty, ifp); + + vrf = vrf_lookup_by_id(ospf->vrf_id); + if (!vrf) + return CMD_SUCCESS; + if (idx_interface) { + ifp = if_lookup_by_name( + argv[idx_interface]->arg, + ospf->vrf_id); + if (ifp == NULL) { + vty_out(vty, "No such interface name in vrf %s\n", + vrf->name); + return CMD_SUCCESS; } } - /* Interface name is specified. */ - else { - ifp = if_lookup_by_name_all_vrf(argv[idx_interface]->arg); - if (ifp == NULL) - vty_out(vty, "No such interface name\n"); - else + if (!ifp) { + FOR_ALL_INTERFACES (vrf, ifp) show_mpls_te_link_sub(vty, ifp); + return CMD_SUCCESS; } + show_mpls_te_link_sub(vty, ifp); return CMD_SUCCESS; } diff --git a/ospfd/ospf_vty.c b/ospfd/ospf_vty.c index 67f5c7e89..fb08833b6 100644 --- a/ospfd/ospf_vty.c +++ b/ospfd/ospf_vty.c @@ -4687,7 +4687,7 @@ static int show_ip_ospf_neighbor_int_common(struct vty *vty, struct ospf *ospf, ospf_show_vrf_name(ospf, vty, json, use_vrf); - ifp = if_lookup_by_name_all_vrf(argv[arg_base]->arg); + ifp = if_lookup_by_name(argv[arg_base]->arg, ospf->vrf_id); if (!ifp) { if (use_json) json_object_boolean_true_add(json, "noSuchIface"); @@ -4717,34 +4717,50 @@ static int show_ip_ospf_neighbor_int_common(struct vty *vty, struct ospf *ospf, DEFUN (show_ip_ospf_neighbor_int, show_ip_ospf_neighbor_int_cmd, - "show ip ospf neighbor IFNAME [json]", + "show ip ospf [vrf <NAME>] neighbor IFNAME [json]", SHOW_STR IP_STR "OSPF information\n" + VRF_CMD_HELP_STR "Neighbor list\n" "Interface name\n" JSON_STR) { struct ospf *ospf; - int idx_ifname = 4; + int idx_ifname = 0; + int idx_vrf = 0; bool uj = use_json(argc, argv); - struct listnode *node = NULL; int ret = CMD_SUCCESS; struct interface *ifp = NULL; + char *vrf_name = NULL; + vrf_id_t vrf_id = VRF_DEFAULT; + struct vrf *vrf = NULL; + + if (argv_find(argv, argc, "vrf", &idx_vrf)) + vrf_name = argv[idx_vrf + 1]->arg; + if (vrf_name && strmatch(vrf_name, VRF_DEFAULT_NAME)) + vrf_name = NULL; + if (vrf_name) { + vrf = vrf_lookup_by_name(vrf_name); + if (vrf) + vrf_id = vrf->vrf_id; + } + ospf = ospf_lookup_by_vrf_id(vrf_id); + + if (!ospf || !ospf->oi_running) + return ret; if (!uj) show_ip_ospf_neighbour_header(vty); - ifp = if_lookup_by_name_all_vrf(argv[idx_ifname]->arg); - for (ALL_LIST_ELEMENTS_RO(om->ospf, node, ospf)) { - if (!ospf->oi_running) - continue; - if (!ifp || ifp->vrf_id != ospf->vrf_id) - continue; - ret = show_ip_ospf_neighbor_int_common(vty, ospf, idx_ifname, - argv, uj, 0); - } + argv_find(argv, argc, "IFNAME", &idx_ifname); + ifp = if_lookup_by_name(argv[idx_ifname]->arg, vrf_id); + if (!ifp) + return ret; + + ret = show_ip_ospf_neighbor_int_common(vty, ospf, idx_ifname, + argv, uj, 0); return ret; } @@ -5576,7 +5592,7 @@ static int show_ip_ospf_neighbor_int_detail_common(struct vty *vty, vty_out(vty, "\nOSPF Instance: %d\n\n", ospf->instance); } - ifp = if_lookup_by_name_all_vrf(argv[arg_base]->arg); + ifp = if_lookup_by_name(argv[arg_base]->arg, ospf->vrf_id); if (!ifp) { if (!use_json) vty_out(vty, "No such interface.\n"); @@ -10648,28 +10664,45 @@ static void ospf_interface_clear(struct interface *ifp) DEFUN (clear_ip_ospf_interface, clear_ip_ospf_interface_cmd, - "clear ip ospf interface [IFNAME]", + "clear ip ospf [vrf <NAME>] interface [IFNAME]", CLEAR_STR IP_STR "OSPF information\n" + VRF_CMD_HELP_STR "Interface information\n" "Interface name\n") { - int idx_ifname = 4; + int idx_ifname = 0; + int idx_vrf = 0; struct interface *ifp; struct listnode *node; struct ospf *ospf = NULL; + char *vrf_name = NULL; + vrf_id_t vrf_id = VRF_DEFAULT; + struct vrf *vrf = NULL; - if (argc == 4) /* Clear all the ospfv2 interfaces. */ - { + if (argv_find(argv, argc, "vrf", &idx_vrf)) + vrf_name = argv[idx_vrf + 1]->arg; + if (vrf_name && strmatch(vrf_name, VRF_DEFAULT_NAME)) + vrf_name = NULL; + if (vrf_name) { + vrf = vrf_lookup_by_name(vrf_name); + if (vrf) + vrf_id = vrf->vrf_id; + } + if (!argv_find(argv, argc, "IFNAME", &idx_ifname)) { + /* Clear all the ospfv2 interfaces. */ for (ALL_LIST_ELEMENTS_RO(om->ospf, node, ospf)) { - struct vrf *vrf = vrf_lookup_by_id(ospf->vrf_id); + if (vrf_id != ospf->vrf_id) + continue; + if (!vrf) + vrf = vrf_lookup_by_id(ospf->vrf_id); FOR_ALL_INTERFACES (vrf, ifp) ospf_interface_clear(ifp); } } else { /* Interface name is specified. */ - ifp = if_lookup_by_name_all_vrf(argv[idx_ifname]->arg); + ifp = if_lookup_by_name(argv[idx_ifname]->arg, vrf_id); if (ifp == NULL) vty_out(vty, "No such interface name\n"); else |