Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 3 Feb 2002 11:10:02 -0800 (PST)
From:      Archie Cobbs <archie@dellroad.org>
To:        freebsd-bugs@FreeBSD.org
Subject:   Re: kern/31586: netgraph bridges cause connectivity probs from bridge
Message-ID:  <200202031910.g13JA2j13507@freefall.freebsd.org>

next in thread | raw e-mail | index | archive | help
The following reply was made to PR kern/31586; it has been noted by GNATS.

From: Archie Cobbs <archie@dellroad.org>
To: freebsd-gnats-submit@FreeBSD.org, michaelb@thus.net
Cc:  
Subject: Re: kern/31586: netgraph bridges cause connectivity probs from bridge
Date: Sun, 3 Feb 2002 10:46:56 -0800 (PST)

 Here is a candidate patch. There seem to be two strategies:
 
 #1 Check the flags for mbufs going out the 'lower' hook and
    compute the checksums for packets that need it.
 
 #2 Temporarily turn off the interface flags advertising hardware
    checksums whenever 'lower' is connected.
 
 The patch below implements #2. While #1 might make more sense,
 the problem is that it fails in the case of CSUM_FRAGMENT.
 To handle CSUM_FRAGMENT in case #1, we would have to implement
 IP fragmentation code in ng_ether, yuck... seems much better
 to let ip_output() do it.
 
 The only unknown is whether the drivers will freak out when
 ifp->if_hwassist is changed to zero and back... it doesn't appear
 so; it seems the worst thing that would happen is the chip
 recomputing a checksum, but I'm not positive about that.
 
 -Archie
 
 __________________________________________________________________________
 Archie Cobbs     *     Packet Design     *     http://www.packetdesign.com
 
 Index: sys/netgraph/ng_ether.c
 ===================================================================
 RCS file: /home/ncvs/src/sys/netgraph/ng_ether.c,v
 retrieving revision 1.2.2.10
 diff -u -r1.2.2.10 ng_ether.c
 --- sys/netgraph/ng_ether.c	1 Sep 2001 08:22:29 -0000	1.2.2.10
 +++ sys/netgraph/ng_ether.c	2 Feb 2002 21:46:39 -0000
 @@ -75,6 +75,7 @@
  	u_char		lowerOrphan;	/* whether lower is lower or orphan */
  	u_char		autoSrcAddr;	/* always overwrite source address */
  	u_char		promisc;	/* promiscuous mode enabled */
 +	u_long		hwassist;	/* hardware checksum capabilities */
  };
  typedef struct private *priv_p;
  
 @@ -319,6 +320,7 @@
  	priv->ifp = ifp;
  	IFP2NG(ifp) = node;
  	priv->autoSrcAddr = 1;
 +	priv->hwassist = ifp->if_hwassist;
  
  	/* Try to give the node the same name as the interface */
  	if (ng_name_node(node, name) != 0) {
 @@ -470,6 +472,10 @@
  	if (*hookptr != NULL)
  		return (EISCONN);
  
 +	/* If lower hook connected, disable hardware checksum */
 +	if (hookptr == &priv->lower)
 +		ifp->if_hwassist = 0;
 +
  	/* OK */
  	*hookptr = hook;
  	priv->lowerOrphan = orphan;
 @@ -685,6 +691,7 @@
  {
  	const priv_p priv = hook->node->private;
  
 +	/* Mark hook not connected */
  	if (hook == priv->upper)
  		priv->upper = NULL;
  	else if (hook == priv->lower) {
 @@ -692,8 +699,14 @@
  		priv->lowerOrphan = 0;
  	} else
  		panic("%s: weird hook", __FUNCTION__);
 +
 +	/* If lower hook disconnected, restore hardware checksum */
 +	if (hookptr == &priv->lower)
 +		ifp->if_hwassist = priv->hwassist;
 +
 +	/* Reset node after last disconnect */
  	if (hook->node->numhooks == 0)
 -		ng_rmnode(hook->node);	/* reset node */
 +		ng_rmnode(hook->node);
  	return (0);
  }
  

To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-bugs" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200202031910.g13JA2j13507>