socsvn commit: r305360 - soc2016/yuanxunzhang/head/sys/net
yuanxunzhang at FreeBSD.org
yuanxunzhang at FreeBSD.org
Mon Jun 20 07:54:47 UTC 2016
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_ */
More information about the svn-soc-all
mailing list