Author: avg
Date: Wed Mar  6 11:02:44 2013
New Revision: 247886
URL: http://svnweb.freebsd.org/changeset/base/247886

Log:
  MFC r246245,246324: ng_ether: track interface renaming

Modified:
  stable/9/sys/netgraph/ng_ether.c
Directory Properties:
  stable/9/sys/   (props changed)

Modified: stable/9/sys/netgraph/ng_ether.c
==============================================================================
--- stable/9/sys/netgraph/ng_ether.c    Wed Mar  6 11:00:47 2013        
(r247885)
+++ stable/9/sys/netgraph/ng_ether.c    Wed Mar  6 11:02:44 2013        
(r247886)
@@ -117,6 +117,8 @@ static ng_rcvdata_t ng_ether_rcvdata;
 static ng_disconnect_t ng_ether_disconnect;
 static int             ng_ether_mod_event(module_t mod, int event, void *data);
 
+static eventhandler_tag        ng_ether_ifnet_arrival_cookie;
+
 /* List of commands and how to convert arguments to/from ASCII */
 static const struct ng_cmdlist ng_ether_cmdlist[] = {
        {
@@ -214,6 +216,24 @@ static struct ng_type ng_ether_typestruc
 NETGRAPH_INIT(ether, &ng_ether_typestruct);
 
 /******************************************************************
+                   UTILITY FUNCTIONS
+******************************************************************/
+static void
+ng_ether_sanitize_ifname(const char *ifname, char *name)
+{
+       int i;
+
+       for (i = 0; i < IFNAMSIZ; i++) {
+               if (ifname[i] == '.' || ifname[i] == ':')
+                       name[i] = '_';
+               else
+                       name[i] = ifname[i];
+               if (name[i] == '\0')
+                       break;
+       }
+}
+
+/******************************************************************
                    ETHERNET FUNCTION HOOKS
 ******************************************************************/
 
@@ -286,6 +306,7 @@ ng_ether_output(struct ifnet *ifp, struc
 static void
 ng_ether_attach(struct ifnet *ifp)
 {
+       char name[IFNAMSIZ];
        priv_p priv;
        node_p node;
 
@@ -323,10 +344,9 @@ ng_ether_attach(struct ifnet *ifp)
        priv->hwassist = ifp->if_hwassist;
 
        /* Try to give the node the same name as the interface */
-       if (ng_name_node(node, ifp->if_xname) != 0) {
-               log(LOG_WARNING, "%s: can't name node %s\n",
-                   __func__, ifp->if_xname);
-       }
+       ng_ether_sanitize_ifname(ifp->if_xname, name);
+       if (ng_name_node(node, name) != 0)
+               log(LOG_WARNING, "%s: can't name node %s\n", __func__, name);
 }
 
 /*
@@ -382,6 +402,38 @@ ng_ether_link_state(struct ifnet *ifp, i
        }
 }
 
+/*
+ * Interface arrival notification handler.
+ * The notification is produced in two cases:
+ *  o a new interface arrives
+ *  o an existing interface got renamed
+ * Currently the first case is handled by ng_ether_attach via special
+ * hook ng_ether_attach_p.
+ */
+static void
+ng_ether_ifnet_arrival_event(void *arg __unused, struct ifnet *ifp)
+{
+       char name[IFNAMSIZ];
+       node_p node;
+
+       /* Only ethernet interfaces are of interest. */
+       if (ifp->if_type != IFT_ETHER
+           && ifp->if_type != IFT_L2VLAN)
+               return;
+
+       /*
+        * Just return if it's a new interface without an ng_ether companion.
+        */
+       node = IFP2NG(ifp);
+       if (node == NULL)
+               return;
+
+       /* Try to give the node the same name as the new interface name */
+       ng_ether_sanitize_ifname(ifp->if_xname, name);
+       if (ng_name_node(node, name) != 0)
+               log(LOG_WARNING, "%s: can't re-name node %s\n", __func__, name);
+}
+
 /******************************************************************
                    NETGRAPH NODE METHODS
 ******************************************************************/
@@ -777,6 +829,9 @@ ng_ether_mod_event(module_t mod, int eve
                ng_ether_input_orphan_p = ng_ether_input_orphan;
                ng_ether_link_state_p = ng_ether_link_state;
 
+               ng_ether_ifnet_arrival_cookie =
+                   EVENTHANDLER_REGISTER(ifnet_arrival_event,
+                   ng_ether_ifnet_arrival_event, NULL, EVENTHANDLER_PRI_ANY);
                break;
 
        case MOD_UNLOAD:
@@ -789,6 +844,9 @@ ng_ether_mod_event(module_t mod, int eve
                 * is MOD_UNLOAD, so there's no need to detach any nodes.
                 */
 
+               EVENTHANDLER_DEREGISTER(ifnet_arrival_event,
+                   ng_ether_ifnet_arrival_cookie);
+
                /* Unregister function hooks */
                ng_ether_attach_p = NULL;
                ng_ether_detach_p = NULL;
_______________________________________________
[email protected] mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-stable-9
To unsubscribe, send any mail to "[email protected]"

Reply via email to