From owner-svn-src-stable@FreeBSD.ORG Sun Dec 21 19:13:31 2008 Return-Path: Delivered-To: svn-src-stable@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 4DE251065674; Sun, 21 Dec 2008 19:13:31 +0000 (UTC) (envelope-from vanhu@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 3C1118FC1D; Sun, 21 Dec 2008 19:13:31 +0000 (UTC) (envelope-from vanhu@FreeBSD.org) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id mBLJDVPP040018; Sun, 21 Dec 2008 19:13:31 GMT (envelope-from vanhu@svn.freebsd.org) Received: (from vanhu@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id mBLJDVTB040016; Sun, 21 Dec 2008 19:13:31 GMT (envelope-from vanhu@svn.freebsd.org) Message-Id: <200812211913.mBLJDVTB040016@svn.freebsd.org> From: VANHULLEBUS Yvan Date: Sun, 21 Dec 2008 19:13:31 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-7@freebsd.org X-SVN-Group: stable-7 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r186375 - in stable/7/sys: . contrib/pf dev/cxgb net X-BeenThere: svn-src-stable@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: SVN commit messages for all the -stable branches of the src tree List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 21 Dec 2008 19:13:31 -0000 Author: vanhu Date: Sun Dec 21 19:13:30 2008 New Revision: 186375 URL: http://svn.freebsd.org/changeset/base/186375 Log: Fix to bug kern/126850. Only dispatch event hander if the interface had a parent... PR: kern/126850 Reviewed by: EvilSam Approved by: re Modified: stable/7/sys/ (props changed) stable/7/sys/contrib/pf/ (props changed) stable/7/sys/dev/cxgb/ (props changed) stable/7/sys/net/if.h stable/7/sys/net/if_vlan.c Modified: stable/7/sys/net/if.h ============================================================================== --- stable/7/sys/net/if.h Sun Dec 21 16:56:13 2008 (r186374) +++ stable/7/sys/net/if.h Sun Dec 21 19:13:30 2008 (r186375) @@ -199,22 +199,23 @@ struct if_data { * more detailed or differenciated than IFCAP_*. * Hwassist features are defined CSUM_* in sys/mbuf.h */ -#define IFCAP_RXCSUM 0x0001 /* can offload checksum on RX */ -#define IFCAP_TXCSUM 0x0002 /* can offload checksum on TX */ -#define IFCAP_NETCONS 0x0004 /* can be a network console */ -#define IFCAP_VLAN_MTU 0x0008 /* VLAN-compatible MTU */ -#define IFCAP_VLAN_HWTAGGING 0x0010 /* hardware VLAN tag support */ -#define IFCAP_JUMBO_MTU 0x0020 /* 9000 byte MTU supported */ -#define IFCAP_POLLING 0x0040 /* driver supports polling */ -#define IFCAP_VLAN_HWCSUM 0x0080 /* can do IFCAP_HWCSUM on VLANs */ -#define IFCAP_TSO4 0x0100 /* can do TCP Segmentation Offload */ -#define IFCAP_TSO6 0x0200 /* can do TCP6 Segmentation Offload */ -#define IFCAP_LRO 0x0400 /* can do Large Receive Offload */ -#define IFCAP_WOL_UCAST 0x0800 /* wake on any unicast frame */ -#define IFCAP_WOL_MCAST 0x1000 /* wake on any multicast frame */ -#define IFCAP_WOL_MAGIC 0x2000 /* wake on any Magic Packet */ -#define IFCAP_TOE4 0x4000 /* interface can offload TCP */ -#define IFCAP_TOE6 0x8000 /* interface can offload TCP6 */ +#define IFCAP_RXCSUM 0x00001 /* can offload checksum on RX */ +#define IFCAP_TXCSUM 0x00002 /* can offload checksum on TX */ +#define IFCAP_NETCONS 0x00004 /* can be a network console */ +#define IFCAP_VLAN_MTU 0x00008 /* VLAN-compatible MTU */ +#define IFCAP_VLAN_HWTAGGING 0x00010 /* hardware VLAN tag support */ +#define IFCAP_JUMBO_MTU 0x00020 /* 9000 byte MTU supported */ +#define IFCAP_POLLING 0x00040 /* driver supports polling */ +#define IFCAP_VLAN_HWCSUM 0x00080 /* can do IFCAP_HWCSUM on VLANs */ +#define IFCAP_TSO4 0x00100 /* can do TCP Segmentation Offload */ +#define IFCAP_TSO6 0x00200 /* can do TCP6 Segmentation Offload */ +#define IFCAP_LRO 0x00400 /* can do Large Receive Offload */ +#define IFCAP_WOL_UCAST 0x00800 /* wake on any unicast frame */ +#define IFCAP_WOL_MCAST 0x01000 /* wake on any multicast frame */ +#define IFCAP_WOL_MAGIC 0x02000 /* wake on any Magic Packet */ +#define IFCAP_TOE4 0x04000 /* interface can offload TCP */ +#define IFCAP_TOE6 0x08000 /* interface can offload TCP6 */ +#define IFCAP_VLAN_HWFILTER 0x10000 /* interface hw can filter vlan tag */ #define IFCAP_HWCSUM (IFCAP_RXCSUM | IFCAP_TXCSUM) #define IFCAP_TSO (IFCAP_TSO4 | IFCAP_TSO6) Modified: stable/7/sys/net/if_vlan.c ============================================================================== --- stable/7/sys/net/if_vlan.c Sun Dec 21 16:56:13 2008 (r186374) +++ stable/7/sys/net/if_vlan.c Sun Dec 21 19:13:30 2008 (r186375) @@ -1093,13 +1093,13 @@ vlan_unconfig_locked(struct ifnet *ifp) ifv = ifp->if_softc; trunk = ifv->ifv_trunk; - parent = PARENT(ifv); + parent = NULL; - if (trunk) { + if (trunk != NULL) { struct sockaddr_dl sdl; - struct ifnet *p = trunk->parent; TRUNK_LOCK(trunk); + parent = trunk->parent; /* * Since the interface is being unconfigured, we need to @@ -1109,14 +1109,14 @@ vlan_unconfig_locked(struct ifnet *ifp) bzero((char *)&sdl, sizeof(sdl)); sdl.sdl_len = sizeof(sdl); sdl.sdl_family = AF_LINK; - sdl.sdl_index = p->if_index; + sdl.sdl_index = parent->if_index; sdl.sdl_type = IFT_ETHER; sdl.sdl_alen = ETHER_ADDR_LEN; while ((mc = SLIST_FIRST(&ifv->vlan_mc_listhead)) != NULL) { bcopy((char *)&mc->mc_addr, LLADDR(&sdl), ETHER_ADDR_LEN); - error = if_delmulti(p, (struct sockaddr *)&sdl); + error = if_delmulti(parent, (struct sockaddr *)&sdl); if (error) return (error); SLIST_REMOVE_HEAD(&ifv->vlan_mc_listhead, mc_entries); @@ -1157,7 +1157,13 @@ vlan_unconfig_locked(struct ifnet *ifp) ifp->if_link_state = LINK_STATE_UNKNOWN; ifp->if_drv_flags &= ~IFF_DRV_RUNNING; - EVENTHANDLER_INVOKE(vlan_unconfig, parent, ifv->ifv_tag); + /* + * Only dispatch an event if vlan was + * attached, otherwise there is nothing + * to cleanup anyway. + */ + if (parent != NULL) + EVENTHANDLER_INVOKE(vlan_unconfig, parent, ifv->ifv_tag); return (0); }