Thread (23 messages) 23 messages, 4 authors, 2008-07-02

Re: [PATCH 3/3] netdevice: order of synchronization of IFF_PROMISC and IFF_ALLMULTI

From: Patrick McHardy <hidden>
Date: 2008-06-16 10:03:49

Wang Chen wrote:
Patrick McHardy said the following on 2008-6-16 17:27:
quoted
Wang Chen wrote:
quoted
-    if (dev->flags & IFF_ALLMULTI)
-        dev_set_allmulti(real_dev, 1);
+    /* NOTE: order of synchronization of IFF_PROMISC and IFF_ALLMULTI
+       is important. Some (broken) drivers set IFF_PROMISC, when
+       IFF_ALLMULTI is requested not asking us and not reporting.
+     */
     if (dev->flags & IFF_PROMISC)
         dev_set_promiscuity(real_dev, 1);
+    if (dev->flags & IFF_ALLMULTI)
+        dev_set_allmulti(real_dev, 1);
What exactly is the problem here? The VLAN code is obviously not
one of the broken drivers, so why should it care what other drivers
do?
I think the problem is that allmulti is not valid if promis is not on.
No, PROMISC is a superset of ALLMULTI.
And about the comment, I copy it from dev_change_flags() and think
it seems suit for here.
Did I misunderstand this comment?
I think it refers to broken behaviour by drivers that set
IFF_PROMISC themselves when asked to disable multicast
filtering by setting IFF_ALLMULTI. This would cause the
test for changed flags in dev_set_promiscuity to return zero
and not program the device for promiscous mode properly.

There are a few examples of this in the tree. But calling
dev_set_promiscuity() before dev_set_allmulti() only helps
in the dev_change_flags() case since its the only function
that might change both flags at once. In all other cases it
depends on the caller.

So for the dev_change_flags() case VLAN already uses the
"proper" ordering, the other cases might be broken with
or without your patch.

I'd suggest to fix the drivers instead, perhaps start by
adding a warning to dev_change_flags() that is triggered
by the driver changing the flags itself.
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help