From: "Catalin(ux aka Dino) BOIE" <util@deuroconsult.ro>
To: Stephen Hemminger <shemminger@osdl.org>
Cc: netdev@oss.sgi.com, davem@davemloft.net
Subject: Re: [PATCH] [BRIDGE]
Date: Thu, 26 May 2005 09:36:59 +0300 (EEST) [thread overview]
Message-ID: <Pine.LNX.4.62.0505260934310.7768@webhosting.rdsbv.ro> (raw)
In-Reply-To: <20050525144633.3a6f253e@dxpl.pdx.osdl.net>
On Wed, 25 May 2005, Stephen Hemminger wrote:
> Here is the revised version, it deals with checksum mixtures better and
> ignores stuff until bridge is up.
This patch missing the case when we have HW_CSUM (for example) on the
bridge device, and a new device that has no HW_CSUM is added.
The fix is to call br_features_recompute(br) also in br_add_if().
Thanks.
> Index: bridge/net/bridge/br_private.h
> ===================================================================
> --- bridge.orig/net/bridge/br_private.h
> +++ bridge/net/bridge/br_private.h
> @@ -174,6 +174,7 @@ extern int br_add_if(struct net_bridge *
> extern int br_del_if(struct net_bridge *br,
> struct net_device *dev);
> extern int br_min_mtu(const struct net_bridge *br);
> +extern void br_features_recompute(struct net_bridge *br);
>
> /* br_input.c */
> extern int br_handle_frame_finish(struct sk_buff *skb);
> Index: bridge/net/bridge/br_notify.c
> ===================================================================
> --- bridge.orig/net/bridge/br_notify.c
> +++ bridge/net/bridge/br_notify.c
> @@ -65,6 +65,15 @@ static int br_device_event(struct notifi
> }
> break;
>
> + case NETDEV_FEAT_CHANGE:
> + if (br->dev->flags & IFF_UP)
> + br_features_recompute(br);
> +
> + /* could do recursive feature change notification
> + * but who would care??
> + */
> + break;
> +
> case NETDEV_DOWN:
> if (br->dev->flags & IFF_UP)
> br_stp_disable_port(p);
> Index: bridge/net/bridge/br_device.c
> ===================================================================
> --- bridge.orig/net/bridge/br_device.c
> +++ bridge/net/bridge/br_device.c
> @@ -21,10 +21,7 @@
>
> static struct net_device_stats *br_dev_get_stats(struct net_device *dev)
> {
> - struct net_bridge *br;
> -
> - br = dev->priv;
> -
> + struct net_bridge *br = netdev_priv(dev);
> return &br->statistics;
> }
>
> @@ -54,9 +51,11 @@ int br_dev_xmit(struct sk_buff *skb, str
>
> static int br_dev_open(struct net_device *dev)
> {
> - netif_start_queue(dev);
> + struct net_bridge *br = netdev_priv(dev);
>
> - br_stp_enable_bridge(dev->priv);
> + br_features_recompute(br);
> + netif_start_queue(dev);
> + br_stp_enable_bridge(br);
>
> return 0;
> }
> @@ -67,7 +66,7 @@ static void br_dev_set_multicast_list(st
>
> static int br_dev_stop(struct net_device *dev)
> {
> - br_stp_disable_bridge(dev->priv);
> + br_stp_disable_bridge(netdev_priv(dev));
>
> netif_stop_queue(dev);
>
> @@ -76,7 +75,7 @@ static int br_dev_stop(struct net_device
>
> static int br_change_mtu(struct net_device *dev, int new_mtu)
> {
> - if ((new_mtu < 68) || new_mtu > br_min_mtu(dev->priv))
> + if (new_mtu < 68 || new_mtu > br_min_mtu(netdev_priv(dev)))
> return -EINVAL;
>
> dev->mtu = new_mtu;
> Index: bridge/net/bridge/br_if.c
> ===================================================================
> --- bridge.orig/net/bridge/br_if.c
> +++ bridge/net/bridge/br_if.c
> @@ -314,6 +314,28 @@ int br_min_mtu(const struct net_bridge *
> return mtu;
> }
>
> +/*
> + * Recomputes features using slave's features
> + */
> +void br_features_recompute(struct net_bridge *br)
> +{
> + struct net_bridge_port *p;
> + unsigned long features, checksum;
> +
> + features = NETIF_F_SG | NETIF_F_FRAGLIST
> + | NETIF_F_HIGHDMA | NETIF_F_TSO;
> + checksum = NETIF_F_IP_CSUM; /* least commmon subset */
> +
> + list_for_each_entry(p, &br->port_list, list) {
> + if (!(p->dev->features
> + & (NETIF_F_IP_CSUM|NETIF_F_NO_CSUM|NETIF_F_HW_CSUM)))
> + checksum = 0;
> + features &= p->dev->features;
> + }
> +
> + br->dev->features = features | checksum | NETIF_F_LLTX;
> +}
> +
> /* called with RTNL */
> int br_add_if(struct net_bridge *br, struct net_device *dev)
> {
> @@ -368,6 +390,7 @@ int br_del_if(struct net_bridge *br, str
>
> spin_lock_bh(&br->lock);
> br_stp_recalculate_bridge_id(br);
> + br_features_recompute(br);
> spin_unlock_bh(&br->lock);
>
> return 0;
>
---
Catalin(ux aka Dino) BOIE
catab at deuroconsult.ro
http://kernel.umbrella.ro/
next prev parent reply other threads:[~2005-05-26 6:36 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2005-05-24 7:29 [PATCH] [BRIDGE] Catalin(ux aka Dino) BOIE
2005-05-25 16:14 ` Stephen Hemminger
2005-05-25 21:46 ` Stephen Hemminger
2005-05-26 6:36 ` Catalin(ux aka Dino) BOIE [this message]
2005-05-26 5:49 ` Catalin(ux aka Dino) BOIE
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=Pine.LNX.4.62.0505260934310.7768@webhosting.rdsbv.ro \
--to=util@deuroconsult.ro \
--cc=davem@davemloft.net \
--cc=netdev@oss.sgi.com \
--cc=shemminger@osdl.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox