ospf6d: Support for 'clear ipv6 ospf6 interface [ifname]

Clear interface commands for ospfv3.  Allow the user
to clear all peers out the specified interface.

Signed-off-by: Vipin Kumar <vipin@cumulusnetworks.com>
diff --git a/ospf6d/ospf6_interface.c b/ospf6d/ospf6_interface.c
index 9aa6908..7d54dd5 100644
--- a/ospf6d/ospf6_interface.c
+++ b/ospf6d/ospf6_interface.c
@@ -1907,6 +1907,66 @@
   install_element (OSPF6_NODE, &no_auto_cost_reference_bandwidth_cmd);
 }
 
+/* Clear the specified interface structure */
+static void
+ospf6_interface_clear (struct vty *vty, struct interface *ifp)
+{
+  struct ospf6_interface *oi;
+
+  if (!if_is_operative (ifp))
+    return;
+
+  if (ifp->info == NULL)
+    return;
+
+  oi = (struct ospf6_interface *) ifp->info;
+
+  if (IS_OSPF6_DEBUG_INTERFACE)
+    zlog_debug ("Interface %s: clear by reset", ifp->name);
+
+  /* Reset the interface */
+  thread_add_event (master, interface_down, oi, 0);
+  thread_add_event (master, interface_up, oi, 0);
+}
+
+/* Clear interface */
+DEFUN (clear_ipv6_ospf6_interface,
+       clear_ipv6_ospf6_interface_cmd,
+       "clear ipv6 ospf6 interface [IFNAME]",
+       CLEAR_STR
+       IP6_STR
+       OSPF6_STR
+       INTERFACE_STR
+       IFNAME_STR
+       )
+{
+  struct interface *ifp;
+  struct listnode *node;
+
+  if (argc == 0) /* Clear all the ospfv3 interfaces. */
+    {
+      for (ALL_LIST_ELEMENTS_RO (iflist, node, ifp))
+        ospf6_interface_clear (vty, ifp);
+    }
+  else /* Interface name is specified. */
+    {
+      if ((ifp = if_lookup_by_name (argv[0])) == NULL)
+        {
+          vty_out (vty, "No such Interface: %s%s", argv[0], VNL);
+          return CMD_WARNING;
+        }
+      ospf6_interface_clear (vty, ifp);
+    }
+
+  return CMD_SUCCESS;
+}
+
+void
+install_element_ospf6_clear_interface (void)
+{
+  install_element (ENABLE_NODE, &clear_ipv6_ospf6_interface_cmd);
+}
+
 DEFUN (debug_ospf6_interface,
        debug_ospf6_interface_cmd,
        "debug ospf6 interface",
diff --git a/ospf6d/ospf6_interface.h b/ospf6d/ospf6_interface.h
index 95a377f..220a475 100644
--- a/ospf6d/ospf6_interface.h
+++ b/ospf6d/ospf6_interface.h
@@ -166,6 +166,8 @@
 
 extern void ospf6_interface_init (void);
 
+extern void install_element_ospf6_clear_interface (void);
+
 extern int config_write_ospf6_debug_interface (struct vty *vty);
 extern void install_element_ospf6_debug_interface (void);
 
diff --git a/ospf6d/ospf6d.c b/ospf6d/ospf6d.c
index fa84d0a..f9b0322 100644
--- a/ospf6d/ospf6d.c
+++ b/ospf6d/ospf6d.c
@@ -1790,6 +1790,8 @@
   install_element_ospf6_debug_abr ();
   install_element_ospf6_debug_flood ();
 
+  install_element_ospf6_clear_interface ();
+
   install_element (VIEW_NODE, &show_version_ospf6_cmd);
 
   install_element (VIEW_NODE, &show_ipv6_ospf6_border_routers_cmd);