Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files. =================================================================== RCS file: /ftp/cvs/cvsroot/src/sys/net/if_ethersubr.c,v rcsdiff: /ftp/cvs/cvsroot/src/sys/net/if_ethersubr.c,v: warning: Unknown phrases like `commitid ...;' are present. retrieving revision 1.270.2.2 retrieving revision 1.271 diff -u -p -r1.270.2.2 -r1.271 --- src/sys/net/if_ethersubr.c 2020/04/13 08:05:15 1.270.2.2 +++ src/sys/net/if_ethersubr.c 2018/11/15 10:23:56 1.271 @@ -1,4 +1,4 @@ -/* $NetBSD: if_ethersubr.c,v 1.270.2.2 2020/04/13 08:05:15 martin Exp $ */ +/* $NetBSD: if_ethersubr.c,v 1.271 2018/11/15 10:23:56 maxv Exp $ */ /* * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project. @@ -61,7 +61,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: if_ethersubr.c,v 1.270.2.2 2020/04/13 08:05:15 martin Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_ethersubr.c,v 1.271 2018/11/15 10:23:56 maxv Exp $"); #ifdef _KERNEL_OPT #include "opt_inet.h" @@ -164,12 +164,10 @@ extern u_char aarp_org_code[3]; #include #endif -#ifdef DIAGNOSTIC static struct timeval bigpktppslim_last; static int bigpktppslim = 2; /* XXX */ static int bigpktpps_count; static kmutex_t bigpktpps_lock __cacheline_aligned; -#endif const uint8_t etherbroadcastaddr[ETHER_ADDR_LEN] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff }; @@ -243,7 +241,7 @@ ether_output(struct ifnet * const ifp0, } else if (m->m_flags & M_MCAST) { ETHER_MAP_IP_MULTICAST(&satocsin(dst)->sin_addr, edst); } else { - error = arpresolve(ifp0, rt, m, dst, edst, sizeof(edst)); + error = arpresolve(ifp, rt, m, dst, edst, sizeof(edst)); if (error) return (error == EWOULDBLOCK) ? 0 : error; } @@ -292,7 +290,7 @@ ether_output(struct ifnet * const ifp0, ETHER_MAP_IPV6_MULTICAST(&satocsin6(dst)->sin6_addr, edst); } else { - error = nd6_resolve(ifp0, rt, m, dst, edst, + error = nd6_resolve(ifp, rt, m, dst, edst, sizeof(edst)); if (error) return (error == EWOULDBLOCK) ? 0 : error; @@ -438,7 +436,7 @@ ether_output(struct ifnet * const ifp0, #if NCARP > 0 if (ifp != ifp0) - if_statadd(ifp0, if_obytes, m->m_pkthdr.len + ETHER_HDR_LEN); + ifp0->if_obytes += m->m_pkthdr.len + ETHER_HDR_LEN; #endif #ifdef ALTQ @@ -614,7 +612,6 @@ ether_input(struct ifnet *ifp, struct mb */ if (etype != ETHERTYPE_MPLS && m->m_pkthdr.len > ETHER_MAX_FRAME(ifp, etype, m->m_flags & M_HASFCS)) { -#ifdef DIAGNOSTIC mutex_enter(&bigpktpps_lock); if (ppsratecheck(&bigpktppslim_last, &bigpktpps_count, bigpktppslim)) { @@ -622,8 +619,6 @@ ether_input(struct ifnet *ifp, struct mb ifp->if_xname, m->m_pkthdr.len); } mutex_exit(&bigpktpps_lock); -#endif - if_statinc(ifp, if_iqdrops); m_freem(m); return; } @@ -645,7 +640,7 @@ ether_input(struct ifnet *ifp, struct mb m->m_flags |= M_BCAST; else m->m_flags |= M_MCAST; - if_statinc(ifp, if_imcasts); + ifp->if_imcasts++; } /* If the CRC is still on the packet, trim it off. */ @@ -654,7 +649,7 @@ ether_input(struct ifnet *ifp, struct mb m->m_flags &= ~M_HASFCS; } - if_statadd(ifp, if_ibytes, m->m_pkthdr.len); + ifp->if_ibytes += m->m_pkthdr.len; #if NCARP > 0 if (__predict_false(ifp->if_carp && ifp->if_type != IFT_CARP)) { @@ -795,8 +790,9 @@ ether_input(struct ifnet *ifp, struct mb /* unknown subtype */ break; } + /* FALLTHROUGH */ } - /* FALLTHROUGH */ + default: if (m->m_flags & M_PROMISC) { m_freem(m); @@ -1001,14 +997,18 @@ ether_ifattach(struct ifnet *ifp, const if_set_sadl(ifp, lla, ETHER_ADDR_LEN, !ETHER_IS_LOCAL(lla)); LIST_INIT(&ec->ec_multiaddrs); - SIMPLEQ_INIT(&ec->ec_vids); ec->ec_lock = mutex_obj_alloc(MUTEX_DEFAULT, IPL_NET); - ec->ec_flags = 0; ifp->if_broadcastaddr = etherbroadcastaddr; bpf_attach(ifp, DLT_EN10MB, sizeof(struct ether_header)); #ifdef MBUFTRACE - mowner_init_owner(&ec->ec_tx_mowner, ifp->if_xname, "tx"); - mowner_init_owner(&ec->ec_rx_mowner, ifp->if_xname, "rx"); + strlcpy(ec->ec_tx_mowner.mo_name, ifp->if_xname, + sizeof(ec->ec_tx_mowner.mo_name)); + strlcpy(ec->ec_tx_mowner.mo_descr, "tx", + sizeof(ec->ec_tx_mowner.mo_descr)); + strlcpy(ec->ec_rx_mowner.mo_name, ifp->if_xname, + sizeof(ec->ec_rx_mowner.mo_name)); + strlcpy(ec->ec_rx_mowner.mo_descr, "rx", + sizeof(ec->ec_rx_mowner.mo_descr)); MOWNER_ATTACH(&ec->ec_tx_mowner); MOWNER_ATTACH(&ec->ec_rx_mowner); ifp->if_mowner = &ec->ec_tx_mowner; @@ -1029,8 +1029,7 @@ ether_ifdetach(struct ifnet *ifp) * is in the process of being detached. Return device not configured * instead. */ - ifp->if_ioctl = __FPTRCAST(int (*)(struct ifnet *, u_long, void *), - enxio); + ifp->if_ioctl = (int (*)(struct ifnet *, u_long, void *))enxio; #if NBRIDGE > 0 if (ifp->if_bridge) @@ -1043,7 +1042,6 @@ ether_ifdetach(struct ifnet *ifp) #endif ETHER_LOCK(ec); - KASSERT(ec->ec_nvlans == 0); while ((enm = LIST_FIRST(&ec->ec_multiaddrs)) != NULL) { LIST_REMOVE(enm, enm_list); kmem_free(enm, sizeof(*enm)); @@ -1374,55 +1372,6 @@ ether_set_ifflags_cb(struct ethercom *ec ec->ec_ifflags_cb = cb; } -void -ether_set_vlan_cb(struct ethercom *ec, ether_vlancb_t cb) -{ - - ec->ec_vlan_cb = cb; -} - -static int -ether_ioctl_reinit(struct ethercom *ec) -{ - struct ifnet *ifp = &ec->ec_if; - int error; - - switch (ifp->if_flags & (IFF_UP | IFF_RUNNING)) { - case IFF_RUNNING: - /* - * If interface is marked down and it is running, - * then stop and disable it. - */ - (*ifp->if_stop)(ifp, 1); - break; - case IFF_UP: - /* - * If interface is marked up and it is stopped, then - * start it. - */ - return (*ifp->if_init)(ifp); - case IFF_UP | IFF_RUNNING: - error = 0; - if (ec->ec_ifflags_cb != NULL) { - error = (*ec->ec_ifflags_cb)(ec); - if (error == ENETRESET) { - /* - * Reset the interface to pick up - * changes in any other flags that - * affect the hardware state. - */ - return (*ifp->if_init)(ifp); - } - } else - error = (*ifp->if_init)(ifp); - return error; - case 0: - break; - } - - return 0; -} - /* * Common ioctls for Ethernet interfaces. Note, we must be * called at splnet(). @@ -1430,7 +1379,7 @@ ether_ioctl_reinit(struct ethercom *ec) int ether_ioctl(struct ifnet *ifp, u_long cmd, void *data) { - struct ethercom *ec = (void *)ifp; + struct ethercom *ec = (void *) ifp; struct eccapreq *eccr; struct ifreq *ifr = (struct ifreq *)data; struct if_laddrreq *iflr = data; @@ -1479,47 +1428,53 @@ ether_ioctl(struct ifnet *ifp, u_long cm case SIOCSIFFLAGS: if ((error = ifioctl_common(ifp, cmd, data)) != 0) return error; - return ether_ioctl_reinit(ec); - case SIOCGIFFLAGS: - error = ifioctl_common(ifp, cmd, data); - if (error == 0) { - /* Set IFF_ALLMULTI for backcompat */ - ifr->ifr_flags |= (ec->ec_flags & ETHER_F_ALLMULTI) ? - IFF_ALLMULTI : 0; + switch (ifp->if_flags & (IFF_UP | IFF_RUNNING)) { + case IFF_RUNNING: + /* + * If interface is marked down and it is running, + * then stop and disable it. + */ + (*ifp->if_stop)(ifp, 1); + break; + case IFF_UP: + /* + * If interface is marked up and it is stopped, then + * start it. + */ + return (*ifp->if_init)(ifp); + case IFF_UP | IFF_RUNNING: + error = 0; + if (ec->ec_ifflags_cb != NULL) { + error = (*ec->ec_ifflags_cb)(ec); + if (error == ENETRESET) { + /* + * Reset the interface to pick up + * changes in any other flags that + * affect the hardware state. + */ + return (*ifp->if_init)(ifp); + } + } else + error = (*ifp->if_init)(ifp); + return error; + case 0: + break; } - return error; + return 0; case SIOCGETHERCAP: eccr = (struct eccapreq *)data; eccr->eccr_capabilities = ec->ec_capabilities; eccr->eccr_capenable = ec->ec_capenable; return 0; - case SIOCSETHERCAP: - eccr = (struct eccapreq *)data; - if ((eccr->eccr_capenable & ~ec->ec_capabilities) != 0) - return EINVAL; - if (eccr->eccr_capenable == ec->ec_capenable) - return 0; -#if 0 /* notyet */ - ec->ec_capenable = (ec->ec_capenable & ETHERCAP_CANTCHANGE) - | (eccr->eccr_capenable & ~ETHERCAP_CANTCHANGE); -#else - ec->ec_capenable = eccr->eccr_capenable; -#endif - return ether_ioctl_reinit(ec); case SIOCADDMULTI: return ether_addmulti(ifreq_getaddr(cmd, ifr), ec); case SIOCDELMULTI: return ether_delmulti(ifreq_getaddr(cmd, ifr), ec); case SIOCSIFMEDIA: case SIOCGIFMEDIA: - if (ec->ec_mii != NULL) - return ifmedia_ioctl(ifp, ifr, &ec->ec_mii->mii_media, - cmd); - else if (ec->ec_ifmedia != NULL) - return ifmedia_ioctl(ifp, ifr, ec->ec_ifmedia, cmd); - else + if (ec->ec_mii == NULL) return ENOTTY; - break; + return ifmedia_ioctl(ifp, ifr, &ec->ec_mii->mii_media, cmd); case SIOCALIFADDR: sdl = satocsdl(sstocsa(&iflr->addr)); if (sdl->sdl_family != AF_LINK) @@ -1717,8 +1672,6 @@ void etherinit(void) { -#ifdef DIAGNOSTIC mutex_init(&bigpktpps_lock, MUTEX_DEFAULT, IPL_NET); -#endif ether_sysctl_setup(NULL); }