From: Vlad Yasevich <vyasevich@gmail.com>
To: Toshiaki Makita <makita.toshiaki@lab.ntt.co.jp>,
"Michael S. Tsirkin" <mst@redhat.com>
Cc: Vlad Yasevich <vyasevic@redhat.com>,
netdev@vger.kernel.org, bridge@lists.linux-foundation.org,
Stephen Hemminger <stephen@networkplumber.org>,
David Laight <David.Laight@ACULAB.COM>,
"David S . Miller" <davem@davemloft.net>
Subject: Re: [Bridge] [PATCH v2 net-next] bridge: Fix incorrect judgment of promisc
Date: Thu, 05 Jun 2014 10:57:41 -0400 [thread overview]
Message-ID: <53908565.5050402@gmail.com> (raw)
In-Reply-To: <53906A23.5040006@lab.ntt.co.jp>
On 06/05/2014 09:01 AM, Toshiaki Makita wrote:
> (2014/06/05 21:30), Michael S. Tsirkin wrote:
>> On Thu, Jun 05, 2014 at 08:53:32PM +0900, Toshiaki Makita wrote:
>>> br_manage_promisc() incorrectly expects br_auto_port() to return only 0
>>> or 1, while it actually returns flags, i.e., a subset of BR_AUTO_MASK.
>>>
>>> Signed-off-by: Toshiaki Makita <makita.toshiaki@lab.ntt.co.jp>
>>> ---
>>> net/bridge/br_if.c | 3 ++-
>>> 1 file changed, 2 insertions(+), 1 deletion(-)
>>>
>>> diff --git a/net/bridge/br_if.c b/net/bridge/br_if.c
>>> index a08d2b8..3eca3fd 100644
>>> --- a/net/bridge/br_if.c
>>> +++ b/net/bridge/br_if.c
>>> @@ -153,7 +153,8 @@ void br_manage_promisc(struct net_bridge *br)
>>> * This lets us disable promiscuous mode and write
>>> * this config to hw.
>>> */
>>> - if (br->auto_cnt <= br_auto_port(p))
>>> + if (br->auto_cnt == 0 ||
>>> + (br->auto_cnt == 1 && br_auto_port(p)))
>>> br_port_clear_promisc(p);
>>> else
>>> br_port_set_promisc(p);
>>
>> It's all a nasty side-effect of using macros IMHO.
>>
>> How about we just make these inline functions returning bool?
>>
>> The bugfix will fall out naturally.
>>
>> Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
>>
>> Warning: untested.
>>
>>
>> diff --git a/net/bridge/br_private.h b/net/bridge/br_private.h
>> index 53d6e32..5818dd2 100644
>> --- a/net/bridge/br_private.h
>> +++ b/net/bridge/br_private.h
>> @@ -200,8 +200,15 @@ struct net_bridge_port
>> #endif
>> };
>>
>> -#define br_auto_port(p) ((p)->flags & BR_AUTO_MASK)
>> -#define br_promisc_port(p) ((p)->flags & BR_PROMISC)
>> +static inline bool br_auto_port(struct net_bridge_port *p)
>> +{
>> + return p->flags & BR_AUTO_MASK;
>> +}
>> +
>> +static inline bool br_promisc_port(struct net_bridge_port *p)
>> +{
>> + return p->flags & BR_PROMISC;
>> +}
>>
>> #define br_port_exists(dev) (dev->priv_flags & IFF_BRIDGE_PORT)
>
> This also looks good.
>
> IMHO, the caller side should not assume these macros (or inline
> functions) return boolean value. There exists similar macro such as
> br_port_exists() that doesn't return boolean.
>
> Ohterwise, we should change all macros into boolean functions, but it
> might affect performance a little if such a macro is used in fast path?
> (I'm worried about the cost of casting non-zero values into 1.)
The following works correctly for me:
#define br_auto_port(p) !!((p)->flags & BR_AUTO_MASK)
Small test shows:
printf("%d\n", br_auto_port(0x20);
1 <-- correct. learning is set.
printf("%d\n", br_auto_port(0x40);
1 <-- correct. flooding is set.
printf("%d\n", br_auto_port(0x60);
1 <-- correct, both are set.
printf("%d\n", br_auto_port(0x08);
0 <-- correct. neither are set.
-vlad
>
> Thanks,
> Toshiaki Makita
> --
> To unsubscribe from this list: send the line "unsubscribe netdev" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
>
WARNING: multiple messages have this Message-ID (diff)
From: Vlad Yasevich <vyasevich@gmail.com>
To: Toshiaki Makita <makita.toshiaki@lab.ntt.co.jp>,
"Michael S. Tsirkin" <mst@redhat.com>
Cc: "David S . Miller" <davem@davemloft.net>,
Stephen Hemminger <stephen@networkplumber.org>,
David Laight <David.Laight@ACULAB.COM>,
Vlad Yasevich <vyasevic@redhat.com>,
netdev@vger.kernel.org, bridge@lists.linux-foundation.org
Subject: Re: [PATCH v2 net-next] bridge: Fix incorrect judgment of promisc
Date: Thu, 05 Jun 2014 10:57:41 -0400 [thread overview]
Message-ID: <53908565.5050402@gmail.com> (raw)
In-Reply-To: <53906A23.5040006@lab.ntt.co.jp>
On 06/05/2014 09:01 AM, Toshiaki Makita wrote:
> (2014/06/05 21:30), Michael S. Tsirkin wrote:
>> On Thu, Jun 05, 2014 at 08:53:32PM +0900, Toshiaki Makita wrote:
>>> br_manage_promisc() incorrectly expects br_auto_port() to return only 0
>>> or 1, while it actually returns flags, i.e., a subset of BR_AUTO_MASK.
>>>
>>> Signed-off-by: Toshiaki Makita <makita.toshiaki@lab.ntt.co.jp>
>>> ---
>>> net/bridge/br_if.c | 3 ++-
>>> 1 file changed, 2 insertions(+), 1 deletion(-)
>>>
>>> diff --git a/net/bridge/br_if.c b/net/bridge/br_if.c
>>> index a08d2b8..3eca3fd 100644
>>> --- a/net/bridge/br_if.c
>>> +++ b/net/bridge/br_if.c
>>> @@ -153,7 +153,8 @@ void br_manage_promisc(struct net_bridge *br)
>>> * This lets us disable promiscuous mode and write
>>> * this config to hw.
>>> */
>>> - if (br->auto_cnt <= br_auto_port(p))
>>> + if (br->auto_cnt == 0 ||
>>> + (br->auto_cnt == 1 && br_auto_port(p)))
>>> br_port_clear_promisc(p);
>>> else
>>> br_port_set_promisc(p);
>>
>> It's all a nasty side-effect of using macros IMHO.
>>
>> How about we just make these inline functions returning bool?
>>
>> The bugfix will fall out naturally.
>>
>> Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
>>
>> Warning: untested.
>>
>>
>> diff --git a/net/bridge/br_private.h b/net/bridge/br_private.h
>> index 53d6e32..5818dd2 100644
>> --- a/net/bridge/br_private.h
>> +++ b/net/bridge/br_private.h
>> @@ -200,8 +200,15 @@ struct net_bridge_port
>> #endif
>> };
>>
>> -#define br_auto_port(p) ((p)->flags & BR_AUTO_MASK)
>> -#define br_promisc_port(p) ((p)->flags & BR_PROMISC)
>> +static inline bool br_auto_port(struct net_bridge_port *p)
>> +{
>> + return p->flags & BR_AUTO_MASK;
>> +}
>> +
>> +static inline bool br_promisc_port(struct net_bridge_port *p)
>> +{
>> + return p->flags & BR_PROMISC;
>> +}
>>
>> #define br_port_exists(dev) (dev->priv_flags & IFF_BRIDGE_PORT)
>
> This also looks good.
>
> IMHO, the caller side should not assume these macros (or inline
> functions) return boolean value. There exists similar macro such as
> br_port_exists() that doesn't return boolean.
>
> Ohterwise, we should change all macros into boolean functions, but it
> might affect performance a little if such a macro is used in fast path?
> (I'm worried about the cost of casting non-zero values into 1.)
The following works correctly for me:
#define br_auto_port(p) !!((p)->flags & BR_AUTO_MASK)
Small test shows:
printf("%d\n", br_auto_port(0x20);
1 <-- correct. learning is set.
printf("%d\n", br_auto_port(0x40);
1 <-- correct. flooding is set.
printf("%d\n", br_auto_port(0x60);
1 <-- correct, both are set.
printf("%d\n", br_auto_port(0x08);
0 <-- correct. neither are set.
-vlad
>
> Thanks,
> Toshiaki Makita
> --
> To unsubscribe from this list: send the line "unsubscribe netdev" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
>
next prev parent reply other threads:[~2014-06-05 14:57 UTC|newest]
Thread overview: 14+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-06-05 11:53 [Bridge] [PATCH v2 net-next] bridge: Fix incorrect judgment of promisc Toshiaki Makita
2014-06-05 11:53 ` Toshiaki Makita
2014-06-05 12:30 ` [Bridge] " Michael S. Tsirkin
2014-06-05 12:30 ` Michael S. Tsirkin
2014-06-05 13:01 ` [Bridge] " Toshiaki Makita
2014-06-05 13:01 ` Toshiaki Makita
2014-06-05 14:57 ` Vlad Yasevich [this message]
2014-06-05 14:57 ` Vlad Yasevich
2014-06-05 22:21 ` [Bridge] " David Miller
2014-06-05 22:21 ` David Miller
2014-06-06 8:48 ` [Bridge] " David Laight
2014-06-06 8:48 ` David Laight
2014-06-06 14:13 ` [Bridge] " Vlad Yasevich
2014-06-06 14:13 ` Vlad Yasevich
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=53908565.5050402@gmail.com \
--to=vyasevich@gmail.com \
--cc=David.Laight@ACULAB.COM \
--cc=bridge@lists.linux-foundation.org \
--cc=davem@davemloft.net \
--cc=makita.toshiaki@lab.ntt.co.jp \
--cc=mst@redhat.com \
--cc=netdev@vger.kernel.org \
--cc=stephen@networkplumber.org \
--cc=vyasevic@redhat.com \
/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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.