Module Name: src Committed By: maxv Date: Mon Jan 15 16:36:51 UTC 2018
Modified Files: src/sys/net: if_ether.h if_vlan.c if_vlanvar.h Log Message: Mostly style, and add a bunch of KASSERTs. To generate a diff of this commit: cvs rdiff -u -r1.70 -r1.71 src/sys/net/if_ether.h cvs rdiff -u -r1.123 -r1.124 src/sys/net/if_vlan.c cvs rdiff -u -r1.12 -r1.13 src/sys/net/if_vlanvar.h Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/net/if_ether.h diff -u src/sys/net/if_ether.h:1.70 src/sys/net/if_ether.h:1.71 --- src/sys/net/if_ether.h:1.70 Wed Nov 22 03:45:15 2017 +++ src/sys/net/if_ether.h Mon Jan 15 16:36:51 2018 @@ -1,4 +1,4 @@ -/* $NetBSD: if_ether.h,v 1.70 2017/11/22 03:45:15 msaitoh Exp $ */ +/* $NetBSD: if_ether.h,v 1.71 2018/01/15 16:36:51 maxv Exp $ */ /* * Copyright (c) 1982, 1986, 1993 @@ -301,9 +301,8 @@ struct ether_multistep { static inline void vlan_set_tag(struct mbuf *m, uint16_t vlantag) { - /* VLAN tag contains priority, CFI and VLAN ID */ - + KASSERT((m->m_flags & M_PKTHDR) != 0); m->m_pkthdr.ether_vtag = vlantag; m->m_flags |= M_VLANTAG; return; @@ -319,6 +318,7 @@ vlan_has_tag(struct mbuf *m) static inline uint16_t vlan_get_tag(struct mbuf *m) { + KASSERT((m->m_flags & M_PKTHDR) != 0); KASSERT(m->m_flags & M_VLANTAG); return m->m_pkthdr.ether_vtag; } Index: src/sys/net/if_vlan.c diff -u src/sys/net/if_vlan.c:1.123 src/sys/net/if_vlan.c:1.124 --- src/sys/net/if_vlan.c:1.123 Mon Jan 15 08:45:19 2018 +++ src/sys/net/if_vlan.c Mon Jan 15 16:36:51 2018 @@ -1,6 +1,6 @@ -/* $NetBSD: if_vlan.c,v 1.123 2018/01/15 08:45:19 maxv Exp $ */ +/* $NetBSD: if_vlan.c,v 1.124 2018/01/15 16:36:51 maxv Exp $ */ -/*- +/* * Copyright (c) 2000, 2001 The NetBSD Foundation, Inc. * All rights reserved. * @@ -78,7 +78,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_vlan.c,v 1.123 2018/01/15 08:45:19 maxv Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_vlan.c,v 1.124 2018/01/15 16:36:51 maxv Exp $"); #ifdef _KERNEL_OPT #include "opt_inet.h" @@ -250,9 +250,11 @@ static inline int vlan_safe_ifpromisc(struct ifnet *ifp, int pswitch) { int e; + KERNEL_LOCK_UNLESS_NET_MPSAFE(); e = ifpromisc(ifp, pswitch); KERNEL_UNLOCK_UNLESS_NET_MPSAFE(); + return e; } @@ -260,9 +262,11 @@ static inline int vlan_safe_ifpromisc_locked(struct ifnet *ifp, int pswitch) { int e; + KERNEL_LOCK_UNLESS_NET_MPSAFE(); e = ifpromisc_locked(ifp, pswitch); KERNEL_UNLOCK_UNLESS_NET_MPSAFE(); + return e; } @@ -272,7 +276,7 @@ vlanattach(int n) /* * Nothing to do here, initialization is handled by the - * module initialization code in vlaninit() below). + * module initialization code in vlaninit() below. */ } @@ -293,15 +297,16 @@ vlaninit(void) static int vlandetach(void) { - int error = 0; + bool is_empty; + int error; mutex_enter(&ifv_list.lock); - if (!LIST_EMPTY(&ifv_list.list)) { - mutex_exit(&ifv_list.lock); - return EBUSY; - } + is_empty = LIST_EMPTY(&ifv_list.list); mutex_exit(&ifv_list.lock); + if (!is_empty) + return EBUSY; + error = vlan_hash_fini(); if (error != 0) return error; @@ -411,7 +416,7 @@ vlan_clone_destroy(struct ifnet *ifp) mutex_destroy(&ifv->ifv_lock); free(ifv, M_DEVBUF); - return (0); + return 0; } /* @@ -423,9 +428,9 @@ vlan_config(struct ifvlan *ifv, struct i struct ifnet *ifp = &ifv->ifv_if; struct ifvlan_linkmib *nmib = NULL; struct ifvlan_linkmib *omib = NULL; - struct ifvlan_linkmib *checkmib = NULL; + struct ifvlan_linkmib *checkmib; struct psref_target *nmib_psref = NULL; - uint16_t vid = EVL_VLANOFTAG(tag); + const uint16_t vid = EVL_VLANOFTAG(tag); int error = 0; int idx; bool omib_cleanup = false; @@ -436,7 +441,6 @@ vlan_config(struct ifvlan *ifv, struct i return EINVAL; nmib = kmem_alloc(sizeof(*nmib), KM_SLEEP); - mutex_enter(&ifv->ifv_lock); omib = ifv->ifv_mib; @@ -461,7 +465,7 @@ vlan_config(struct ifvlan *ifv, struct i switch (p->if_type) { case IFT_ETHER: { - struct ethercom *ec = (void *) p; + struct ethercom *ec = (void *)p; nmib->ifvm_msw = &vlan_ether_multisw; nmib->ifvm_encaplen = ETHER_VLAN_ENCAP_LEN; nmib->ifvm_mintu = ETHERMIN; @@ -496,7 +500,7 @@ vlan_config(struct ifvlan *ifv, struct i * offload. */ if (ec->ec_capabilities & ETHERCAP_VLAN_HWTAGGING) { - ec->ec_capenable |= ETHERCAP_VLAN_HWTAGGING; + ec->ec_capenable |= ETHERCAP_VLAN_HWTAGGING; ifp->if_capabilities = p->if_capabilities & (IFCAP_TSOv4 | IFCAP_TSOv6 | IFCAP_CSUM_IPv4_Tx|IFCAP_CSUM_IPv4_Rx| @@ -504,7 +508,8 @@ vlan_config(struct ifvlan *ifv, struct i IFCAP_CSUM_UDPv4_Tx|IFCAP_CSUM_UDPv4_Rx| IFCAP_CSUM_TCPv6_Tx|IFCAP_CSUM_TCPv6_Rx| IFCAP_CSUM_UDPv6_Tx|IFCAP_CSUM_UDPv6_Rx); - } + } + /* * We inherit the parent's Ethernet address. */ @@ -547,10 +552,8 @@ done: if (nmib_psref) psref_target_destroy(nmib_psref, ifvm_psref_class); - if (nmib) kmem_free(nmib, sizeof(*nmib)); - if (omib_cleanup) kmem_free(omib, sizeof(*omib)); @@ -629,10 +632,8 @@ vlan_unconfig_locked(struct ifvlan *ifv, break; } -#ifdef DIAGNOSTIC default: - panic("vlan_unconfig: impossible"); -#endif + panic("%s: impossible", __func__); } nmib->ifvm_p = NULL; @@ -839,9 +840,11 @@ vlan_ifdetach(struct ifnet *p) LIST_FOREACH(ifv, &ifv_list.list, ifv_list) { struct ifnet *ifp = &ifv->ifv_if; - /* Need IFNET_LOCK that must be held before ifv_lock. */ + /* IFNET_LOCK must be held before ifv_lock. */ IFNET_LOCK(ifp); mutex_enter(&ifv->ifv_lock); + + /* XXX ifv_mib = NULL? */ if (ifv->ifv_mib->ifvm_p == p) { KASSERTMSG(i < cnt, "no memory for unconfig, parent=%s", p->if_xname); @@ -852,6 +855,7 @@ vlan_ifdetach(struct ifnet *p) } } + mutex_exit(&ifv->ifv_lock); IFNET_UNLOCK(ifp); } @@ -902,13 +906,13 @@ vlan_set_promisc(struct ifnet *ifp) vlan_putref_linkmib(mib, &psref); curlwp_bindx(bound); - return (error); + return error; } static int vlan_ioctl(struct ifnet *ifp, u_long cmd, void *data) { - struct lwp *l = curlwp; /* XXX */ + struct lwp *l = curlwp; struct ifvlan *ifv = ifp->if_softc; struct ifaddr *ifa = (struct ifaddr *) data; struct ifreq *ifr = (struct ifreq *) data; @@ -946,7 +950,7 @@ vlan_ioctl(struct ifnet *ifp, u_long cmd error = ifioctl_common(ifp, cmd, data); if (error == ENETRESET) - error = 0; + error = 0; } break; @@ -1127,7 +1131,7 @@ vlan_ioctl(struct ifnet *ifp, u_long cmd error = ether_ioctl(ifp, cmd, data); } - return (error); + return error; } static int @@ -1142,16 +1146,16 @@ vlan_ether_addmulti(struct ifvlan *ifv, KASSERT(mutex_owned(&ifv->ifv_lock)); if (sa->sa_len > sizeof(struct sockaddr_storage)) - return (EINVAL); + return EINVAL; error = ether_addmulti(sa, &ifv->ifv_ec); if (error != ENETRESET) - return (error); + return error; /* - * This is new multicast address. We have to tell parent + * This is a new multicast address. We have to tell parent * about it. Also, remember this multicast address so that - * we can delete them on unconfigure. + * we can delete it on unconfigure. */ mc = malloc(sizeof(struct vlan_mc_entry), M_DEVBUF, M_NOWAIT); if (mc == NULL) { @@ -1160,7 +1164,7 @@ vlan_ether_addmulti(struct ifvlan *ifv, } /* - * Since ether_addmulti() returns ENETRESET, the following two + * Since ether_addmulti() returned ENETRESET, the following two * statements shouldn't fail. Here ifv_ec is implicitly protected * by the ifv_lock lock. */ @@ -1182,14 +1186,15 @@ vlan_ether_addmulti(struct ifvlan *ifv, if (error != 0) goto ioctl_failed; - return (error); + return error; - ioctl_failed: +ioctl_failed: LIST_REMOVE(mc, mc_entries); free(mc, M_DEVBUF); - alloc_failed: + +alloc_failed: (void)ether_delmulti(sa, &ifv->ifv_ec); - return (error); + return error; } static int @@ -1206,15 +1211,15 @@ vlan_ether_delmulti(struct ifvlan *ifv, /* * Find a key to lookup vlan_mc_entry. We have to do this - * before calling ether_delmulti for obvious reason. + * before calling ether_delmulti for obvious reasons. */ if ((error = ether_multiaddr(sa, addrlo, addrhi)) != 0) - return (error); + return error; ETHER_LOOKUP_MULTI(addrlo, addrhi, &ifv->ifv_ec, enm); error = ether_delmulti(sa, &ifv->ifv_ec); if (error != ENETRESET) - return (error); + return error; /* We no longer use this multicast address. Tell parent so. */ mib = ifv->ifv_mib; @@ -1235,7 +1240,8 @@ vlan_ether_delmulti(struct ifvlan *ifv, KASSERT(mc != NULL); } else (void)ether_addmulti(sa, &ifv->ifv_ec); - return (error); + + return error; } /* @@ -1290,7 +1296,8 @@ vlan_start(struct ifnet *ifp) #ifdef ALTQ /* - * KERNEL_LOCK is required for ALTQ even if NET_MPSAFE is defined. + * KERNEL_LOCK is required for ALTQ even if NET_MPSAFE is + * defined. */ KERNEL_LOCK(1, NULL); /* @@ -1304,10 +1311,8 @@ vlan_start(struct ifnet *ifp) case IFT_ETHER: altq_etherclassify(&p->if_snd, m); break; -#ifdef DIAGNOSTIC default: - panic("vlan_start: impossible (altq)"); -#endif + panic("%s: impossible (altq)", __func__); } } KERNEL_UNLOCK_ONE(NULL); @@ -1369,22 +1374,18 @@ vlan_start(struct ifnet *ifp) * some switches will not pad by themselves * after deleting a tag. */ - if (m->m_pkthdr.len < - (ETHER_MIN_LEN - ETHER_CRC_LEN + - ETHER_VLAN_ENCAP_LEN)) { + const size_t min_data_len = ETHER_MIN_LEN - + ETHER_CRC_LEN + ETHER_VLAN_ENCAP_LEN; + if (m->m_pkthdr.len < min_data_len) { m_copyback(m, m->m_pkthdr.len, - (ETHER_MIN_LEN - ETHER_CRC_LEN + - ETHER_VLAN_ENCAP_LEN) - - m->m_pkthdr.len, + min_data_len - m->m_pkthdr.len, vlan_zero_pad_buff); } break; } -#ifdef DIAGNOSTIC default: - panic("vlan_start: impossible"); -#endif + panic("%s: impossible", __func__); } } @@ -1405,9 +1406,6 @@ vlan_start(struct ifnet *ifp) ifp->if_flags &= ~IFF_OACTIVE; /* Remove reference to mib before release */ - p = NULL; - ec = NULL; - vlan_putref_linkmib(mib, &psref); } @@ -1498,22 +1496,18 @@ vlan_transmit(struct ifnet *ifp, struct * some switches will not pad by themselves * after deleting a tag. */ - if (m->m_pkthdr.len < - (ETHER_MIN_LEN - ETHER_CRC_LEN + - ETHER_VLAN_ENCAP_LEN)) { + const size_t min_data_len = ETHER_MIN_LEN - + ETHER_CRC_LEN + ETHER_VLAN_ENCAP_LEN; + if (m->m_pkthdr.len < min_data_len) { m_copyback(m, m->m_pkthdr.len, - (ETHER_MIN_LEN - ETHER_CRC_LEN + - ETHER_VLAN_ENCAP_LEN) - - m->m_pkthdr.len, + min_data_len - m->m_pkthdr.len, vlan_zero_pad_buff); } break; } -#ifdef DIAGNOSTIC default: - panic("vlan_transmit: impossible"); -#endif + panic("%s: impossible", __func__); } } @@ -1537,9 +1531,6 @@ vlan_transmit(struct ifnet *ifp, struct out: /* Remove reference to mib before release */ - p = NULL; - ec = NULL; - vlan_putref_linkmib(mib, &psref); return error; } @@ -1563,38 +1554,30 @@ vlan_input(struct ifnet *ifp, struct mbu vid = EVL_VLANOFTAG(vlan_get_tag(m)); m->m_flags &= ~M_VLANTAG; } else { - switch (ifp->if_type) { - case IFT_ETHER: - { - struct ether_vlan_header *evl; + struct ether_vlan_header *evl; - if (m->m_len < sizeof(struct ether_vlan_header) && - (m = m_pullup(m, - sizeof(struct ether_vlan_header))) == NULL) { - printf("%s: no memory for VLAN header, " - "dropping packet.\n", ifp->if_xname); - return; - } - evl = mtod(m, struct ether_vlan_header *); - KASSERT(ntohs(evl->evl_encap_proto) == ETHERTYPE_VLAN); + if (ifp->if_type != IFT_ETHER) { + panic("%s: impossible", __func__); + } - vid = EVL_VLANOFTAG(ntohs(evl->evl_tag)); + if (m->m_len < sizeof(struct ether_vlan_header) && + (m = m_pullup(m, + sizeof(struct ether_vlan_header))) == NULL) { + printf("%s: no memory for VLAN header, " + "dropping packet.\n", ifp->if_xname); + return; + } + evl = mtod(m, struct ether_vlan_header *); + KASSERT(ntohs(evl->evl_encap_proto) == ETHERTYPE_VLAN); - /* - * Restore the original ethertype. We'll remove - * the encapsulation after we've found the vlan - * interface corresponding to the tag. - */ - evl->evl_encap_proto = evl->evl_proto; - break; - } + vid = EVL_VLANOFTAG(ntohs(evl->evl_tag)); - default: - vid = (uint16_t) -1; /* XXX GCC */ -#ifdef DIAGNOSTIC - panic("vlan_input: impossible"); -#endif - } + /* + * Restore the original ethertype. We'll remove + * the encapsulation after we've found the vlan + * interface corresponding to the tag. + */ + evl->evl_encap_proto = evl->evl_proto; } mib = vlan_lookup_tag_psref(ifp, vid, &psref); @@ -1603,6 +1586,7 @@ vlan_input(struct ifnet *ifp, struct mbu ifp->if_noproto++; return; } + KASSERT(mib->ifvm_encaplen == ETHER_VLAN_ENCAP_LEN); ifv = mib->ifvm_ifvlan; if ((ifv->ifv_if.if_flags & (IFF_UP|IFF_RUNNING)) != Index: src/sys/net/if_vlanvar.h diff -u src/sys/net/if_vlanvar.h:1.12 src/sys/net/if_vlanvar.h:1.13 --- src/sys/net/if_vlanvar.h:1.12 Wed Nov 22 03:45:15 2017 +++ src/sys/net/if_vlanvar.h Mon Jan 15 16:36:51 2018 @@ -1,6 +1,6 @@ -/* $NetBSD: if_vlanvar.h,v 1.12 2017/11/22 03:45:15 msaitoh Exp $ */ +/* $NetBSD: if_vlanvar.h,v 1.13 2018/01/15 16:36:51 maxv Exp $ */ -/*- +/* * Copyright (c) 2000 The NetBSD Foundation, Inc. * All rights reserved. *