summaryrefslogtreecommitdiff
path: root/ospfd/ospf_vty.c
diff options
context:
space:
mode:
authorPaul Jakma <paul.jakma@sun.com>2006-10-22 20:07:53 +0000
committerPaul Jakma <paul.jakma@sun.com>2006-10-22 20:07:53 +0000
commit7ffa8fa2322fb759cf1f93730cde2cee3d4ad8ee (patch)
tree2e27d51d171609415026cbc8ce7f2ef7ea4df5e5 /ospfd/ospf_vty.c
parent6f58544db526b4dfb09d45f8507926b0ae5fe12b (diff)
[ospfd] Add passive-interface default support
2006-10-22 Yar Tikhiy <yar@comp.chem.msu.su> * (general) Add support for passive-interface default (with minor edits by Paul Jakma). * ospf_interface.h: Add OSPF_IF_PASSIVE_STATUS macro, looking at configured value, or the global 'default' value, as required. * ospf_interface.c: (ospf_if_new_hook) Leave passive unconfigured per default, allowing global 'default' to take effect for unconfigured interfaces. * ospf_packet.c: (various) use OSPF_IF_PASSIVE_STATUS * ospf_vty.c: (ospf_passive_interface_default) new function, unset passive from all interfaces if default is enabled, as the per-iface settings become redundant. (ospf_passive_interface_update) new func, update passive setting taking global default into account. ({no,}ospf_passive_interface_addr_cmd) Add support for 'default' variant of command. (show_ip_ospf_interface_sub) Update to take global default into account when printing passive status. (ospf_config_write) ditto. * ospfd.c: (ospf_new) set global passive-interface default. * ospfd.h: (struct ospf) Add field for global passive-interface.
Diffstat (limited to 'ospfd/ospf_vty.c')
-rw-r--r--ospfd/ospf_vty.c191
1 files changed, 143 insertions, 48 deletions
diff --git a/ospfd/ospf_vty.c b/ospfd/ospf_vty.c
index 04e1df46..0e3a77d8 100644
--- a/ospfd/ospf_vty.c
+++ b/ospfd/ospf_vty.c
@@ -249,39 +249,98 @@ ALIAS (no_ospf_router_id,
NO_STR
"router-id for the OSPF process\n")
+static void
+ospf_passive_interface_default (struct ospf *ospf)
+{
+ struct listnode *ln;
+ struct interface *ifp;
+ struct ospf_interface *oi;
+
+ for (ALL_LIST_ELEMENTS_RO (om->iflist, ln, ifp))
+ {
+ if (ifp &&
+ OSPF_IF_PARAM_CONFIGURED (IF_DEF_PARAMS (ifp), passive_interface))
+ UNSET_IF_PARAM (IF_DEF_PARAMS (ifp), passive_interface);
+ }
+ for (ALL_LIST_ELEMENTS_RO (ospf->oiflist, ln, oi))
+ {
+ if (OSPF_IF_PARAM_CONFIGURED (oi->params, passive_interface))
+ UNSET_IF_PARAM (oi->params, passive_interface);
+ }
+}
+
+static void
+ospf_passive_interface_update (struct ospf *ospf, struct interface *ifp,
+ struct in_addr addr,
+ struct ospf_if_params *params, u_char value)
+{
+ u_char dflt;
+
+ params->passive_interface = value;
+ if (params != IF_DEF_PARAMS (ifp))
+ {
+ if (OSPF_IF_PARAM_CONFIGURED (IF_DEF_PARAMS (ifp), passive_interface))
+ dflt = IF_DEF_PARAMS (ifp)->passive_interface;
+ else
+ dflt = ospf->passive_interface_default;
+
+ if (value != dflt)
+ SET_IF_PARAM (params, passive_interface);
+ else
+ UNSET_IF_PARAM (params, passive_interface);
+
+ ospf_free_if_params (ifp, addr);
+ ospf_if_update_params (ifp, addr);
+ }
+ else
+ {
+ if (value != ospf->passive_interface_default)
+ SET_IF_PARAM (params, passive_interface);
+ else
+ UNSET_IF_PARAM (params, passive_interface);
+ }
+}
+
DEFUN (ospf_passive_interface,
ospf_passive_interface_addr_cmd,
"passive-interface IFNAME A.B.C.D",
"Suppress routing updates on an interface\n"
"Interface's name\n")
{
- struct interface *ifp;
- struct in_addr addr;
- int ret;
- struct ospf_if_params *params;
- struct route_node *rn;
+ struct interface *ifp;
+ struct in_addr addr;
+ int ret;
+ struct ospf_if_params *params;
+ struct route_node *rn;
+ struct ospf *ospf = vty->index;
- ifp = if_get_by_name (argv[0]);
+ ifp = if_get_by_name (argv[0]);
params = IF_DEF_PARAMS (ifp);
- if (argc == 2)
+ if (argc == 0)
{
- ret = inet_aton(argv[1], &addr);
- if (!ret)
- {
- vty_out (vty, "Please specify interface address by A.B.C.D%s",
- VTY_NEWLINE);
- return CMD_WARNING;
- }
-
- params = ospf_get_if_params (ifp, addr);
- ospf_if_update_params (ifp, addr);
+ ospf->passive_interface_default = OSPF_IF_PASSIVE;
+ ospf_passive_interface_default (ospf);
}
+ else
+ {
+ if (argc == 2)
+ {
+ ret = inet_aton(argv[1], &addr);
+ if (!ret)
+ {
+ vty_out (vty, "Please specify interface address by A.B.C.D%s",
+ VTY_NEWLINE);
+ return CMD_WARNING;
+ }
- SET_IF_PARAM (params, passive_interface);
- params->passive_interface = OSPF_IF_PASSIVE;
-
+ params = ospf_get_if_params (ifp, addr);
+ ospf_if_update_params (ifp, addr);
+ }
+ ospf_passive_interface_update (ospf, ifp, addr, params, OSPF_IF_PASSIVE);
+ }
+
/* XXX We should call ospf_if_set_multicast on exactly those
* interfaces for which the passive property changed. It is too much
* work to determine this set, so we do this for every interface.
@@ -289,6 +348,7 @@ DEFUN (ospf_passive_interface,
* record of joined groups to avoid systems calls if the desired
* memberships match the current memership.
*/
+
for (rn = route_top(IF_OIFS(ifp)); rn; rn = route_next (rn))
{
struct ospf_interface *oi = rn->info;
@@ -312,6 +372,12 @@ ALIAS (ospf_passive_interface,
"Suppress routing updates on an interface\n"
"Interface's name\n")
+ALIAS (ospf_passive_interface,
+ ospf_passive_interface_default_cmd,
+ "passive-interface default",
+ "Suppress routing updates on an interface\n"
+ "Suppress routing updates on interfaces by default\n")
+
DEFUN (no_ospf_passive_interface,
no_ospf_passive_interface_addr_cmd,
"no passive-interface IFNAME A.B.C.D",
@@ -324,33 +390,34 @@ DEFUN (no_ospf_passive_interface,
struct ospf_if_params *params;
int ret;
struct route_node *rn;
+ struct ospf *ospf = vty->index;
ifp = if_get_by_name (argv[0]);
params = IF_DEF_PARAMS (ifp);
- if (argc == 2)
+ if (argc == 0)
{
- ret = inet_aton(argv[1], &addr);
- if (!ret)
- {
- vty_out (vty, "Please specify interface address by A.B.C.D%s",
- VTY_NEWLINE);
- return CMD_WARNING;
- }
-
- params = ospf_lookup_if_params (ifp, addr);
- if (params == NULL)
- return CMD_SUCCESS;
+ ospf->passive_interface_default = OSPF_IF_ACTIVE;
+ ospf_passive_interface_default (ospf);
}
-
- UNSET_IF_PARAM (params, passive_interface);
- params->passive_interface = OSPF_IF_ACTIVE;
-
- if (params != IF_DEF_PARAMS (ifp))
+ else
{
- ospf_free_if_params (ifp, addr);
- ospf_if_update_params (ifp, addr);
+ if (argc == 2)
+ {
+ ret = inet_aton(argv[1], &addr);
+ if (!ret)
+ {
+ vty_out (vty, "Please specify interface address by A.B.C.D%s",
+ VTY_NEWLINE);
+ return CMD_WARNING;
+ }
+
+ params = ospf_lookup_if_params (ifp, addr);
+ if (params == NULL)
+ return CMD_SUCCESS;
+ }
+ ospf_passive_interface_update (ospf, ifp, addr, params, OSPF_IF_ACTIVE);
}
/* XXX We should call ospf_if_set_multicast on exactly those
@@ -378,6 +445,13 @@ ALIAS (no_ospf_passive_interface,
"Allow routing updates on an interface\n"
"Interface's name\n")
+ALIAS (no_ospf_passive_interface,
+ no_ospf_passive_interface_default_cmd,
+ "no passive-interface default",
+ NO_STR
+ "Allow routing updates on an interface\n"
+ "Allow routing updates on interfaces by default\n")
+
DEFUN (ospf_network_area,
ospf_network_area_cmd,
"network A.B.C.D/M area (A.B.C.D|<0-4294967295>)",
@@ -2883,14 +2957,14 @@ show_ip_ospf_interface_sub (struct vty *vty, struct ospf *ospf,
OSPF_IF_PARAM (oi, retransmit_interval),
VTY_NEWLINE);
- if (OSPF_IF_PARAM (oi, passive_interface) == OSPF_IF_ACTIVE)
+ if (OSPF_IF_PASSIVE_STATUS (oi) == OSPF_IF_ACTIVE)
{
char timebuf[OSPF_TIME_DUMP_SIZE];
vty_out (vty, " Hello due in %s%s",
ospf_timer_dump (oi->t_hello, timebuf, sizeof(timebuf)),
VTY_NEWLINE);
}
- else /* OSPF_IF_PASSIVE is set */
+ else /* passive-interface is set */
vty_out (vty, " No Hellos (Passive interface)%s", VTY_NEWLINE);
vty_out (vty, " Neighbor Count is %d, Adjacent neighbor count is %d%s",
@@ -7868,17 +7942,36 @@ ospf_config_write (struct vty *vty)
config_write_ospf_redistribute (vty, ospf);
/* passive-interface print. */
+ if (ospf->passive_interface_default == OSPF_IF_PASSIVE)
+ vty_out (vty, " passive-interface default%s", VTY_NEWLINE);
+
for (ALL_LIST_ELEMENTS_RO (om->iflist, node, ifp))
- if (IF_DEF_PARAMS (ifp)->passive_interface == OSPF_IF_PASSIVE)
- vty_out (vty, " passive-interface %s%s",
- ifp->name, VTY_NEWLINE);
-
+ if (OSPF_IF_PARAM_CONFIGURED (IF_DEF_PARAMS (ifp), passive_interface)
+ && IF_DEF_PARAMS (ifp)->passive_interface !=
+ ospf->passive_interface_default)
+ {
+ vty_out (vty, " %spassive-interface %s%s",
+ IF_DEF_PARAMS (ifp)->passive_interface ? "" : "no ",
+ ifp->name, VTY_NEWLINE);
+ }
for (ALL_LIST_ELEMENTS_RO (ospf->oiflist, node, oi))
- if (OSPF_IF_PARAM_CONFIGURED (oi->params, passive_interface) &&
- oi->params->passive_interface == OSPF_IF_PASSIVE)
- vty_out (vty, " passive-interface %s %s%s",
+ {
+ if (!OSPF_IF_PARAM_CONFIGURED (oi->params, passive_interface))
+ continue;
+ if (OSPF_IF_PARAM_CONFIGURED (IF_DEF_PARAMS (oi->ifp),
+ passive_interface))
+ {
+ if (oi->params->passive_interface == IF_DEF_PARAMS (oi->ifp)->passive_interface)
+ continue;
+ }
+ else if (oi->params->passive_interface == ospf->passive_interface_default)
+ continue;
+
+ vty_out (vty, " %spassive-interface %s %s%s",
+ oi->params->passive_interface ? "" : "no ",
oi->ifp->name,
inet_ntoa (oi->address->u.prefix4), VTY_NEWLINE);
+ }
/* Network area print. */
config_write_network_area (vty, ospf);
@@ -8199,8 +8292,10 @@ ospf_vty_init (void)
/* "passive-interface" commands. */
install_element (OSPF_NODE, &ospf_passive_interface_addr_cmd);
install_element (OSPF_NODE, &ospf_passive_interface_cmd);
+ install_element (OSPF_NODE, &ospf_passive_interface_default_cmd);
install_element (OSPF_NODE, &no_ospf_passive_interface_addr_cmd);
install_element (OSPF_NODE, &no_ospf_passive_interface_cmd);
+ install_element (OSPF_NODE, &no_ospf_passive_interface_default_cmd);
/* "ospf abr-type" commands. */
install_element (OSPF_NODE, &ospf_abr_type_cmd);