Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 17 Apr 2015 12:27:35 +0000 (UTC)
From:      Gleb Smirnoff <glebius@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-projects@freebsd.org
Subject:   svn commit: r281652 - projects/ifnet/sys/net
Message-ID:  <201504171227.t3HCRZmN041706@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: glebius
Date: Fri Apr 17 12:27:34 2015
New Revision: 281652
URL: https://svnweb.freebsd.org/changeset/base/281652

Log:
  - Instead of eventhandler for vlan child events, provide new ifop method.
  - Instead of macros to obtain ID of vlan, vlan of ID or trunk of vlan
    provide shim functions in if.c, and make the function pointers private
    between if.c and if_vlan.c.

Modified:
  projects/ifnet/sys/net/if.c
  projects/ifnet/sys/net/if.h
  projects/ifnet/sys/net/if_var.h
  projects/ifnet/sys/net/if_vlan.c
  projects/ifnet/sys/net/if_vlan_var.h

Modified: projects/ifnet/sys/net/if.c
==============================================================================
--- projects/ifnet/sys/net/if.c	Fri Apr 17 12:22:44 2015	(r281651)
+++ projects/ifnet/sys/net/if.c	Fri Apr 17 12:27:34 2015	(r281652)
@@ -2232,11 +2232,15 @@ link_init_sdl(struct ifnet *ifp, struct 
 	return (sdl);
 }
 
-void	(*vlan_link_state_p)(struct ifnet *);	/* XXX: private from if_vlan */
-void	(*vlan_trunk_cap_p)(struct ifnet *);		/* XXX: private from if_vlan */
+/*
+ * Function pointers to vlan(4) module.
+ * XXXGL: shouldn't we just make vlan(4) always in kernel?
+ */
+void	(*vlan_link_state_p)(struct ifnet *);
+void	(*vlan_trunk_cap_p)(struct ifnet *);
 struct ifnet *(*vlan_trunkdev_p)(struct ifnet *);
-struct	ifnet *(*vlan_devat_p)(struct ifnet *, uint16_t);
-int	(*vlan_tag_p)(struct ifnet *, uint16_t *);
+struct ifnet *(*vlan_dev_p)(struct ifnet *, uint16_t);
+uint16_t (*vlan_vid_p)(struct ifnet *);
 
 /*
  * Handle a change in the interface link state. To avoid LORs
@@ -3775,6 +3779,34 @@ if_snd_prepend(if_t ifp, struct mbuf *m)
 	mtx_unlock(&ifq->ifq_mtx);
 }
 
+int
+if_vlanid(if_t vifp, uint16_t *vid)
+{
+
+	if (if_type(vifp) != IFT_L2VLAN)
+		return (EINVAL);
+	*vid = (*vlan_vid_p)(vifp);
+	return (0);
+}
+
+if_t
+if_vlandev(if_t parent, uint16_t vid)
+{
+
+	if (parent->if_vlantrunk == NULL)
+                return (NULL);
+	return ((*vlan_dev_p)(parent, vid));
+}
+
+if_t
+if_vlantrunk(if_t vifp)
+{
+
+	if (if_type(vifp) != IFT_L2VLAN)
+		return (NULL);
+	return ((*vlan_trunkdev_p)(vifp));
+}
+
 /*
  * Implementation of if ops, that can be called from drivers.
  */

Modified: projects/ifnet/sys/net/if.h
==============================================================================
--- projects/ifnet/sys/net/if.h	Fri Apr 17 12:22:44 2015	(r281651)
+++ projects/ifnet/sys/net/if.h	Fri Apr 17 12:27:34 2015	(r281652)
@@ -599,6 +599,7 @@ typedef void	(*if_qflush_t)(if_t);
 typedef int	(*if_resolvemulti_t)(if_t, struct sockaddr **,
     struct sockaddr *);
 typedef void	(*if_reassign_t)(if_t, struct vnet *);
+typedef void	(*if_vlan_event_t)(if_t, uint16_t, if_t);
 enum poll_cmd { POLL_ONLY, POLL_AND_CHECK_STATUS };
 typedef int	(*if_poll_t)(if_t, enum poll_cmd, int);
 
@@ -617,6 +618,7 @@ struct ifops {
 	if_qflush_t	ifop_qflush;	/* flush any queue */	
 	if_resolvemulti_t ifop_resolvemulti; /* validate/resolve multicast */
 	if_reassign_t	ifop_reassign;	/* reassign to vnet routine */
+	if_vlan_event_t	ifop_vlan_event;/* VLAN config/unconfig */
 	struct ifops	*ifop_next;
 	uint8_t		ifop_origin;
 };
@@ -748,6 +750,13 @@ struct mbuf * if_snd_dequeue(if_t);
 void	if_snd_prepend(if_t, struct mbuf *);
 
 /*
+ * vlan(4) interfaces extra API.
+ */
+int	if_vlanid(if_t, uint16_t *);
+if_t	if_vlandev(if_t, uint16_t);
+if_t	if_vlantrunk(if_t);
+
+/*
  * Type-enforcing inliners over if_getsoftc().
  */
 static inline char *

Modified: projects/ifnet/sys/net/if_var.h
==============================================================================
--- projects/ifnet/sys/net/if_var.h	Fri Apr 17 12:22:44 2015	(r281651)
+++ projects/ifnet/sys/net/if_var.h	Fri Apr 17 12:27:34 2015	(r281652)
@@ -523,6 +523,14 @@ if_reassign(if_t ifp, struct vnet *new)
 	return (ifp->if_ops->ifop_reassign(ifp, new));
 }
 
+static inline void
+if_vlan_event(if_t ifp, uint16_t vid, if_t vifp)
+{
+
+	if (ifp->if_ops->ifop_vlan_event != NULL)
+		ifp->if_ops->ifop_vlan_event(ifp, vid, vifp);
+}
+
 #ifdef DEVICE_POLLING
 static inline int
 if_poll(if_t ifp, enum poll_cmd cmd, int count)

Modified: projects/ifnet/sys/net/if_vlan.c
==============================================================================
--- projects/ifnet/sys/net/if_vlan.c	Fri Apr 17 12:22:44 2015	(r281651)
+++ projects/ifnet/sys/net/if_vlan.c	Fri Apr 17 12:27:34 2015	(r281652)
@@ -73,6 +73,11 @@ __FBSDID("$FreeBSD$");
 #include <netinet/if_ether.h>
 #endif
 
+extern	struct ifnet *(*vlan_dev_p)(struct ifnet *, uint16_t);
+extern	uint16_t (*vlan_vid_p)(struct ifnet *);
+extern	void (*vlan_trunk_cap_p)(struct ifnet *);
+extern	struct ifnet *(*vlan_trunkdev_p)(struct ifnet *);
+
 #define	VLAN_DEF_HWIDTH	4
 #define	VLAN_IFFLAGS	(IFF_BROADCAST | IFF_MULTICAST)
 
@@ -662,18 +667,17 @@ vlan_ifdetach(void *arg __unused, struct
 /*
  * Return the trunk device for a virtual interface.
  */
-static struct ifnet  *
+static struct ifnet *
 vlan_trunkdev(struct ifnet *ifp)
 {
 	struct ifvlan *ifv;
 
-	if (if_type(ifp) != IFT_L2VLAN)
-		return (NULL);
 	ifv = ifp->if_softc;
-	ifp = NULL;
 	VLAN_LOCK();
 	if (ifv->ifv_trunk)
 		ifp = PARENT(ifv);
+	else
+		ifp = NULL;
 	VLAN_UNLOCK();
 	return (ifp);
 }
@@ -681,40 +685,35 @@ vlan_trunkdev(struct ifnet *ifp)
 /*
  * Return the 12-bit VLAN VID for this interface, for use by external
  * components such as Infiniband.
- *
- * XXXRW: Note that the function name here is historical; it should be named
- * vlan_vid().
  */
-static int
-vlan_tag(struct ifnet *ifp, uint16_t *vidp)
+static uint16_t
+vlan_vid(struct ifnet *ifp)
 {
 	struct ifvlan *ifv;
 
-	if (if_type(ifp) != IFT_L2VLAN)
-		return (EINVAL);
+	KASSERT(if_type(ifp) == IFT_L2VLAN, ("%s: %p is not a VLAN",
+	    __func__, ifp));
 	ifv = ifp->if_softc;
-	*vidp = ifv->ifv_vid;
-	return (0);
+	return (ifv->ifv_vid);
 }
 
 /*
  * Return the vlan device present at the specific VID.
  */
 static struct ifnet *
-vlan_devat(struct ifnet *ifp, uint16_t vid)
+vlan_dev(struct ifnet *ifp, uint16_t vid)
 {
 	struct ifvlantrunk *trunk;
 	struct ifvlan *ifv;
 	TRUNK_LOCK_READER;
 
 	trunk = ifp->if_vlantrunk;
-	if (trunk == NULL)
-		return (NULL);
-	ifp = NULL;
 	TRUNK_RLOCK(trunk);
 	ifv = vlan_gethash(trunk, vid);
 	if (ifv)
 		ifp = ifv->ifv_ifp;
+	else
+		ifp = NULL;
 	TRUNK_RUNLOCK(trunk);
 	return (ifp);
 }
@@ -750,8 +749,8 @@ vlan_modevent(module_t mod, int type, vo
 		vlan_link_state_p = vlan_link_state;
 		vlan_trunk_cap_p = vlan_trunk_capabilities;
 		vlan_trunkdev_p = vlan_trunkdev;
-		vlan_tag_p = vlan_tag;
-		vlan_devat_p = vlan_devat;
+		vlan_vid_p = vlan_vid;
+		vlan_dev_p = vlan_dev;
 #ifndef VIMAGE
 		vlan_cloner = if_clone_advanced(vlanname, 0, vlan_clone_match,
 		    vlan_clone_create, vlan_clone_destroy);
@@ -776,8 +775,8 @@ vlan_modevent(module_t mod, int type, vo
 		vlan_link_state_p = NULL;
 		vlan_trunk_cap_p = NULL;
 		vlan_trunkdev_p = NULL;
-		vlan_tag_p = NULL;
-		vlan_devat_p = NULL;
+		vlan_vid_p = NULL;
+		vlan_dev_p = NULL;
 		VLAN_LOCK_DESTROY();
 		if (bootverbose)
 			printf("vlan: unloaded\n");
@@ -1257,7 +1256,7 @@ vlan_config(struct ifvlan *ifv, struct i
 	(void)vlan_setmulti(ifp); /* XXX: VLAN lock held */
 
 	TRUNK_UNLOCK(trunk);
-	EVENTHANDLER_INVOKE(vlan_config, p, ifv->ifv_vid);
+	if_vlan_event(p, vid, ifp);
 
 	return (error);
 }
@@ -1342,7 +1341,7 @@ vlan_unconfig(struct ifnet *ifp, int dep
 	 * to cleanup anyway.
 	 */
 	if (parent != NULL)
-		EVENTHANDLER_INVOKE(vlan_unconfig, parent, ifv->ifv_vid);
+		if_vlan_event(parent, ifv->ifv_vid, NULL);
 }
 
 /* Handle a reference counted flag that should be set on the parent as well */

Modified: projects/ifnet/sys/net/if_vlan_var.h
==============================================================================
--- projects/ifnet/sys/net/if_vlan_var.h	Fri Apr 17 12:22:44 2015	(r281651)
+++ projects/ifnet/sys/net/if_vlan_var.h	Fri Apr 17 12:27:34 2015	(r281652)
@@ -73,7 +73,6 @@ struct	vlanreq {
 #define	SIOCSETVLAN	SIOCSIFGENERIC
 #define	SIOCGETVLAN	SIOCGIFGENERIC
 
-#ifdef _KERNEL
 /*
  * Drivers that are capable of adding and removing the VLAN header
  * in hardware indicate they support this by marking IFCAP_VLAN_HWTAGGING
@@ -109,27 +108,4 @@ struct	vlanreq {
  * stripping/insertion by marking IFCAP_VLAN_HWTAGGING in
  * if_capabilities.
  */
-
-#define	VLAN_TRUNKDEV(_ifp)					\
-	(_ifp)->if_type == IFT_L2VLAN ? (*vlan_trunkdev_p)((_ifp)) : NULL
-#define	VLAN_TAG(_ifp, _vid)					\
-	(_ifp)->if_type == IFT_L2VLAN ? (*vlan_tag_p)((_ifp), (_vid)) : EINVAL
-#define	VLAN_DEVAT(_ifp, _vid)					\
-	(_ifp)->if_vlantrunk != NULL ? (*vlan_devat_p)((_ifp), (_vid)) : NULL
-
-extern	void (*vlan_trunk_cap_p)(struct ifnet *);
-extern	struct ifnet *(*vlan_trunkdev_p)(struct ifnet *);
-extern	struct ifnet *(*vlan_devat_p)(struct ifnet *, uint16_t);
-extern	int (*vlan_tag_p)(struct ifnet *, uint16_t *);
-
-#ifdef _SYS_EVENTHANDLER_H_
-/* VLAN state change events */
-typedef void (*vlan_config_fn)(void *, struct ifnet *, uint16_t);
-typedef void (*vlan_unconfig_fn)(void *, struct ifnet *, uint16_t);
-EVENTHANDLER_DECLARE(vlan_config, vlan_config_fn);
-EVENTHANDLER_DECLARE(vlan_unconfig, vlan_unconfig_fn);
-#endif /* _SYS_EVENTHANDLER_H_ */
-
-#endif /* _KERNEL */
-
 #endif /* _NET_IF_VLAN_VAR_H_ */



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201504171227.t3HCRZmN041706>