Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 20 Jun 2016 07:54:46 GMT
From:      yuanxunzhang@FreeBSD.org
To:        svn-soc-all@FreeBSD.org
Subject:   socsvn commit: r305360 - soc2016/yuanxunzhang/head/sys/net
Message-ID:  <201606200754.u5K7sk9d093227@socsvn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: yuanxunzhang
Date: Mon Jun 20 07:54:46 2016
New Revision: 305360
URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=305360

Log:
  EAPS: add functions for eaps interface initialization

Modified:
  soc2016/yuanxunzhang/head/sys/net/eaps.c
  soc2016/yuanxunzhang/head/sys/net/eaps.h

Modified: soc2016/yuanxunzhang/head/sys/net/eaps.c
==============================================================================
--- soc2016/yuanxunzhang/head/sys/net/eaps.c	Mon Jun 20 06:45:42 2016	(r305359)
+++ soc2016/yuanxunzhang/head/sys/net/eaps.c	Mon Jun 20 07:54:46 2016	(r305360)
@@ -66,6 +66,10 @@
  */
 static int	eaps_clone_create(struct if_clone *, int, caddr_t);
 static void	eaps_clone_destroy(struct ifnet *);
+static int	eaps_ioctl(struct ifnet *, u_long, caddr_t);
+static int	eaps_transmit(struct ifnet *, struct mbuf *);
+static void	eaps_qflush(struct ifnet *);
+static void	bridge_init(void *);
 
 static VNET_DEFINE(struct if_clone *, eaps_cloner);
 #define	V_eaps_cloner	VNET(eaps_cloner)
@@ -142,7 +146,33 @@
 static int
 eaps_clone_create(struct if_clone *ifc, int unit, caddr_t params)
 {
-	printf("%s: Kernel debug test-1.\n", __func__);
+	struct eaps_softc *sc;
+	struct ifnet *ifp;
+
+	sc = malloc(sizeof(*sc), M_DEVBUF, M_WAITOK|M_ZERO);
+	ifp = sc->sc_ifp = if_alloc(IFT_ETHER);
+	if (ifp == NULL) {
+		free(sc, M_DEVBUF);
+		return (ENOSPC);
+	}
+
+	EAPS_LOCK_INIT(sc);
+
+	ifp->if_softc = sc;
+	if_initname(ifp, eaps_name, unit);
+	ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST;
+	ifp->if_ioctl = eaps_ioctl;
+	ifp->if_transmit = eaps_transmit;
+	ifp->if_qflush = eaps_qflush;
+	ifp->if_init = eaps_init;
+	ifp->if_type = IFT_EAPS;
+
+	ether_ifattach(ifp, sc->sc_defaddr);
+
+	EAPS_LIST_LOCK();
+	LIST_INSERT_HEAD(&V_eaps_list, sc, sc_entries);
+	EAPS_LIST_UNLOCK();
+
 	return (0);
 }
 
@@ -157,3 +187,74 @@
 
 }
 
+/*
+ * eaps_ioctl:
+ *
+ *	Handle a control request from the operator.
+ */
+static int
+eaps_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data)
+{
+	struct bridge_softc *sc = ifp->if_softc;
+	struct ifreq *ifr = (struct ifreq *)data;
+	struct ifdrv *ifd = (struct ifdrv *) data;
+
+	switch (cmd) {
+
+		break;
+	default:
+		error = ether_ioctl(ifp, cmd, data);
+		break;
+	}
+
+	return (error);
+}
+
+/*
+ * eaps_transmit:
+ *
+ *	Do output on a bridge.
+ *
+ */
+static int
+eaps_transmit(struct ifnet *ifp, struct mbuf *m)
+{
+	struct eaps_softc *sc;
+	struct ether_header *eh;
+	struct ifnet *dst_if;
+	int error = 0;
+
+	sc = ifp->if_softc;
+	ETHER_BPF_MTAP(ifp, m);
+
+	return (error);
+}
+
+/*
+ * The ifp->if_qflush entry point for eaps(4) is no-op.
+ */
+static void
+bridge_qflush(struct ifnet *ifp __unused)
+{
+}
+
+/*
+ * eaps_init:
+ *
+ *	Initialize a eaps interface.
+ */
+static void
+eaps_init(void *xsc)
+{
+	struct eaps_softc *sc = (struct eaps_softc *)xsc;
+	struct ifnet *ifp = sc->sc_ifp;
+
+	if (ifp->if_drv_flags & IFF_DRV_RUNNING)
+		return;
+
+	BRIDGE_LOCK(sc);
+	ifp->if_drv_flags |= IFF_DRV_RUNNING;
+	BRIDGE_UNLOCK(sc);
+}
+
+

Modified: soc2016/yuanxunzhang/head/sys/net/eaps.h
==============================================================================
--- soc2016/yuanxunzhang/head/sys/net/eaps.h	Mon Jun 20 06:45:42 2016	(r305359)
+++ soc2016/yuanxunzhang/head/sys/net/eaps.h	Mon Jun 20 07:54:46 2016	(r305360)
@@ -137,6 +137,17 @@
 #define	EAPS_S_PREFORWARD	0x05	/* Transit in PREFORWARDING State */
 #define	EAPS_S_INIT		0x06	/* Master node in INIT state */
 
+
+#define	EAPS_LOCK_INIT(_sc)	rm_init(&(_sc)->sc_mtx, "eaps rmlock")
+#define	EAPS_LOCK_DESTROY(_sc)	rm_destroy(&(_sc)->sc_mtx)
+#define	EAPS_RLOCK(_sc, _p)	rm_rlock(&(_sc)->sc_mtx, (_p))
+#define	EAPS_WLOCK(_sc)		rm_wlock(&(_sc)->sc_mtx)
+#define	EAPS_RUNLOCK(_sc, _p)	rm_runlock(&(_sc)->sc_mtx, (_p))
+#define	EAPS_WUNLOCK(_sc)	rm_wunlock(&(_sc)->sc_mtx)
+#define	EAPS_RLOCK_ASSERT(_sc)	rm_assert(&(_sc)->sc_mtx, RA_RLOCKED)
+#define	EAPS_WLOCK_ASSERT(_sc)	rm_assert(&(_sc)->sc_mtx, RA_WLOCKED)
+#define	EAPS_UNLOCK_ASSERT(_sc)	rm_assert(&(_sc)->sc_mtx, RA_UNLOCKED)
+
 #endif /* _KERNEL */
  
 #endif /* _NET_EAPS_H_ */



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