Date: Tue, 13 Jan 2015 08:26:57 +0000 (UTC) From: Gleb Smirnoff <glebius@FreeBSD.org> To: src-committers@freebsd.org, svn-src-projects@freebsd.org Subject: svn commit: r277119 - projects/ifnet/sys/dev/usb Message-ID: <201501130826.t0D8QvOk058703@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: glebius Date: Tue Jan 13 08:26:56 2015 New Revision: 277119 URL: https://svnweb.freebsd.org/changeset/base/277119 Log: Convert USB "interfaces" (hate!) to new ifnet(9) API. Sponsored by: Nginx, Inc. Modified: projects/ifnet/sys/dev/usb/usb_pf.c Modified: projects/ifnet/sys/dev/usb/usb_pf.c ============================================================================== --- projects/ifnet/sys/dev/usb/usb_pf.c Tue Jan 13 08:24:37 2015 (r277118) +++ projects/ifnet/sys/dev/usb/usb_pf.c Tue Jan 13 08:26:56 2015 (r277119) @@ -45,12 +45,9 @@ #include <sys/socket.h> #include <sys/sockio.h> #include <net/if.h> -#include <net/if_var.h> -#include <net/if_types.h> #include <net/if_clone.h> #include <net/bpf.h> #include <sys/sysctl.h> -#include <net/route.h> #include <dev/usb/usb.h> #include <dev/usb/usbdi.h> @@ -66,18 +63,30 @@ static void usbpf_init(void *); static void usbpf_uninit(void *); -static int usbpf_ioctl(struct ifnet *, u_long, caddr_t); static int usbpf_clone_match(struct if_clone *, const char *); static int usbpf_clone_create(struct if_clone *, char *, size_t, caddr_t); -static int usbpf_clone_destroy(struct if_clone *, struct ifnet *); +static int usbpf_clone_destroy(struct if_clone *, if_t); static struct usb_bus *usbpf_ifname2ubus(const char *); static uint32_t usbpf_aggregate_xferflags(struct usb_xfer_flags *); static uint32_t usbpf_aggregate_status(struct usb_xfer_flags_int *); static int usbpf_xfer_frame_is_read(struct usb_xfer *, uint32_t); static uint32_t usbpf_xfer_precompute_size(struct usb_xfer *, int); -static struct if_clone *usbpf_cloner; static const char usbusname[] = "usbus"; +static struct ifdriver usbpf_ifdrv = { + .ifdrv_ops = { + .ifop_origin = IFOP_ORIGIN_DRIVER, + }, + .ifdrv_name = usbusname, + .ifdrv_type = IFT_USB, + /* + * XXX According to the specification of DLT_USB, it indicates + * packets beginning with USB setup header. But not sure all + * packets would be. + */ + .ifdrv_dlt = DLT_USB, + .ifdrv_dlt_hdrlen = USBPF_HDR_LEN, +}; SYSINIT(usbpf_init, SI_SUB_PSEUDO, SI_ORDER_MIDDLE, usbpf_init, NULL); SYSUNINIT(usbpf_uninit, SI_SUB_PSEUDO, SI_ORDER_MIDDLE, usbpf_uninit, NULL); @@ -86,8 +95,8 @@ static void usbpf_init(void *arg) { - usbpf_cloner = if_clone_advanced(usbusname, 0, usbpf_clone_match, - usbpf_clone_create, usbpf_clone_destroy); + usbpf_ifdrv.ifdrv_clone = if_clone_advanced(usbusname, 0, + usbpf_clone_match, usbpf_clone_create, usbpf_clone_destroy); } static void @@ -100,7 +109,7 @@ usbpf_uninit(void *arg) int error; int i; - if_clone_detach(usbpf_cloner); + if_clone_detach(usbpf_ifdrv.ifdrv_clone); dc = devclass_find(usbusname); if (dc == NULL) @@ -111,19 +120,12 @@ usbpf_uninit(void *arg) for (i = 0; i < devlcnt; i++) { ubus = device_get_softc(devlp[i]); if (ubus != NULL && ubus->ifp != NULL) - usbpf_clone_destroy(usbpf_cloner, ubus->ifp); + usbpf_clone_destroy(usbpf_ifdrv.ifdrv_clone, + ubus->ifp); } free(devlp, M_TEMP); } -static int -usbpf_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data) -{ - - /* No configuration allowed. */ - return (EINVAL); -} - static struct usb_bus * usbpf_ifname2ubus(const char *ifname) { @@ -164,15 +166,18 @@ usbpf_clone_match(struct if_clone *ifc, static int usbpf_clone_create(struct if_clone *ifc, char *name, size_t len, caddr_t params) { - int error; - int unit; - struct ifnet *ifp; + struct if_attach_args ifat = { + .ifat_version = IF_ATTACH_VERSION, + .ifat_drv = &usbpf_ifdrv, + .ifat_flags = IFF_UP, + }; struct usb_bus *ubus; + int error; - error = ifc_name2unit(name, &unit); + error = ifc_name2unit(name, &ifat.ifat_dunit); if (error) return (error); - if (unit < 0) + if (ifat.ifat_dunit < 0) return (EINVAL); ubus = usbpf_ifname2ubus(name); @@ -181,52 +186,25 @@ usbpf_clone_create(struct if_clone *ifc, if (ubus->ifp != NULL) return (1); - error = ifc_alloc_unit(ifc, &unit); - if (error) { - device_printf(ubus->parent, "usbpf: Could not allocate " - "instance\n"); - return (error); - } - ifp = ubus->ifp = if_alloc(IFT_USB); - if (ifp == NULL) { - ifc_free_unit(ifc, unit); + ifat.ifat_softc = ubus; + ubus->ifp = if_attach(&ifat); + if (ubus->ifp == NULL) { device_printf(ubus->parent, "usbpf: Could not allocate " "instance\n"); - return (ENOSPC); + return (ifat.ifat_error); } - strlcpy(ifp->if_xname, name, sizeof(ifp->if_xname)); - ifp->if_softc = ubus; - ifp->if_dname = usbusname; - ifp->if_dunit = unit; - ifp->if_ioctl = usbpf_ioctl; - if_attach(ifp); - ifp->if_flags |= IFF_UP; - rt_ifmsg(ifp); - /* - * XXX According to the specification of DLT_USB, it indicates - * packets beginning with USB setup header. But not sure all - * packets would be. - */ - bpfattach(ifp, DLT_USB, USBPF_HDR_LEN); - return (0); } static int -usbpf_clone_destroy(struct if_clone *ifc, struct ifnet *ifp) +usbpf_clone_destroy(struct if_clone *ifc, if_t ifp) { struct usb_bus *ubus; - int unit; - - ubus = ifp->if_softc; - unit = ifp->if_dunit; + ubus = if_getsoftc(ifp, IF_DRIVER_SOFTC); ubus->ifp = NULL; - bpfdetach(ifp); if_detach(ifp); - if_free(ifp); - ifc_free_unit(ifc, unit); - + return (0); } @@ -243,7 +221,7 @@ usbpf_detach(struct usb_bus *ubus) { if (ubus->ifp != NULL) - usbpf_clone_destroy(usbpf_cloner, ubus->ifp); + usbpf_clone_destroy(usbpf_ifdrv.ifdrv_clone, ubus->ifp); if (bootverbose) device_printf(ubus->parent, "usbpf: Detached\n"); } @@ -383,6 +361,7 @@ usbpf_xfertap(struct usb_xfer *xfer, int struct usb_bus *bus; struct usbpf_pkthdr *up; struct usbpf_framehdr *uf; + struct bpf_if *bpf; usb_frlength_t offset; uint32_t totlen; uint32_t frame; @@ -395,9 +374,11 @@ usbpf_xfertap(struct usb_xfer *xfer, int bus = xfer->xroot->bus; /* sanity checks */ - if (bus->ifp == NULL || bus->ifp->if_bpf == NULL) + if (bus->ifp == NULL) return; - if (!bpf_peers_present(bus->ifp->if_bpf)) + + bpf = if_getsoftc(bus->ifp, IF_BPF); + if (!bpf_peers_present(bpf)) return; totlen = usbpf_xfer_precompute_size(xfer, type); @@ -520,7 +501,7 @@ usbpf_xfertap(struct usb_xfer *xfer, int } } - bpf_tap(bus->ifp->if_bpf, buf, totlen); + bpf_tap(bpf, buf, totlen); free(buf, M_TEMP); }
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201501130826.t0D8QvOk058703>