diff mbox series

[net-next,v2] bonding: Always assign be16 value to vlan_proto

Message ID 20230420-bonding-be-vlan-proto-v2-1-9f594fabdbd9@kernel.org (mailing list archive)
State Accepted
Commit c1bc7d73c96425db12bb92fbf24c37fd1c9ac329
Delegated to: Netdev Maintainers
Headers show
Series [net-next,v2] bonding: Always assign be16 value to vlan_proto | expand

Checks

Context Check Description
netdev/series_format success Single patches do not need cover letters
netdev/tree_selection success Clearly marked for net-next
netdev/fixes_present success Fixes tag not required for -next series
netdev/header_inline success No static functions without inline keyword in header files
netdev/build_32bit success Errors and warnings before: 11 this patch: 8
netdev/cc_maintainers success CCed 7 of 7 maintainers
netdev/build_clang success Errors and warnings before: 8 this patch: 8
netdev/verify_signedoff success Signed-off-by tag matches author and committer
netdev/deprecated_api success None detected
netdev/check_selftest success No net selftest shell script
netdev/verify_fixes success No Fixes tag
netdev/build_allmodconfig_warn success Errors and warnings before: 11 this patch: 8
netdev/checkpatch success total: 0 errors, 0 warnings, 0 checks, 31 lines checked
netdev/kdoc success Errors and warnings before: 0 this patch: 0
netdev/source_inline success Was 0 now: 0

Commit Message

Simon Horman May 11, 2023, 3:07 p.m. UTC
The type of the vlan_proto field is __be16.
And most users of the field use it as such.

In the case of setting or testing the field for the special VLAN_N_VID
value, host byte order is used. Which seems incorrect.

It also seems somewhat odd to store a VLAN ID value in a field that is
otherwise used to store Ether types.

Address this issue by defining BOND_VLAN_PROTO_NONE, a big endian value.
0xffff was chosen somewhat arbitrarily. What is important is that it
doesn't overlap with any valid VLAN Ether types.

I don't believe the problems described above are a bug because
VLAN_N_VID in both little-endian and big-endian byte order does not
conflict with any supported VLAN Ether types in big-endian byte order.

Reported by sparse as:

 .../bond_main.c:2857:26: warning: restricted __be16 degrades to integer
 .../bond_main.c:2863:20: warning: restricted __be16 degrades to integer
 .../bond_main.c:2939:40: warning: incorrect type in assignment (different base types)
 .../bond_main.c:2939:40:    expected restricted __be16 [usertype] vlan_proto
 .../bond_main.c:2939:40:    got int

No functional changes intended.
Compile tested only.

Signed-off-by: Simon Horman <horms@kernel.org>
---
Changes in v2:
- Decribe Ether Type aspect of problem in patch description
- Use an Ether Type rather than VID valie as sential
- Link to v1: https://lore.kernel.org/r/20230420-bonding-be-vlan-proto-v1-1-754399f51d01@kernel.org
---
 drivers/net/bonding/bond_main.c | 8 +++++---
 1 file changed, 5 insertions(+), 3 deletions(-)

Comments

Jay Vosburgh May 11, 2023, 11:43 p.m. UTC | #1
Simon Horman <horms@kernel.org> wrote:

>The type of the vlan_proto field is __be16.
>And most users of the field use it as such.
>
>In the case of setting or testing the field for the special VLAN_N_VID
>value, host byte order is used. Which seems incorrect.
>
>It also seems somewhat odd to store a VLAN ID value in a field that is
>otherwise used to store Ether types.
>
>Address this issue by defining BOND_VLAN_PROTO_NONE, a big endian value.
>0xffff was chosen somewhat arbitrarily. What is important is that it
>doesn't overlap with any valid VLAN Ether types.

As I think you mentioned, 0xffff is marked as a reserved ethertype.

>I don't believe the problems described above are a bug because
>VLAN_N_VID in both little-endian and big-endian byte order does not
>conflict with any supported VLAN Ether types in big-endian byte order.
>
>Reported by sparse as:
>
> .../bond_main.c:2857:26: warning: restricted __be16 degrades to integer
> .../bond_main.c:2863:20: warning: restricted __be16 degrades to integer
> .../bond_main.c:2939:40: warning: incorrect type in assignment (different base types)
> .../bond_main.c:2939:40:    expected restricted __be16 [usertype] vlan_proto
> .../bond_main.c:2939:40:    got int
>
>No functional changes intended.
>Compile tested only.
>
>Signed-off-by: Simon Horman <horms@kernel.org>

Acked-by: Jay Vosburgh <jay.vosburgh@canonical.com>

	-J

>---
>Changes in v2:
>- Decribe Ether Type aspect of problem in patch description
>- Use an Ether Type rather than VID valie as sential
>- Link to v1: https://lore.kernel.org/r/20230420-bonding-be-vlan-proto-v1-1-754399f51d01@kernel.org
>---
> drivers/net/bonding/bond_main.c | 8 +++++---
> 1 file changed, 5 insertions(+), 3 deletions(-)
>
>diff --git a/drivers/net/bonding/bond_main.c b/drivers/net/bonding/bond_main.c
>index 3fed888629f7..ebf61c19dcef 100644
>--- a/drivers/net/bonding/bond_main.c
>+++ b/drivers/net/bonding/bond_main.c
>@@ -2871,6 +2871,8 @@ static bool bond_has_this_ip(struct bonding *bond, __be32 ip)
> 	return ret;
> }
> 
>+#define BOND_VLAN_PROTO_NONE cpu_to_be16(0xffff)
>+
> static bool bond_handle_vlan(struct slave *slave, struct bond_vlan_tag *tags,
> 			     struct sk_buff *skb)
> {
>@@ -2878,13 +2880,13 @@ static bool bond_handle_vlan(struct slave *slave, struct bond_vlan_tag *tags,
> 	struct net_device *slave_dev = slave->dev;
> 	struct bond_vlan_tag *outer_tag = tags;
> 
>-	if (!tags || tags->vlan_proto == VLAN_N_VID)
>+	if (!tags || tags->vlan_proto == BOND_VLAN_PROTO_NONE)
> 		return true;
> 
> 	tags++;
> 
> 	/* Go through all the tags backwards and add them to the packet */
>-	while (tags->vlan_proto != VLAN_N_VID) {
>+	while (tags->vlan_proto != BOND_VLAN_PROTO_NONE) {
> 		if (!tags->vlan_id) {
> 			tags++;
> 			continue;
>@@ -2960,7 +2962,7 @@ struct bond_vlan_tag *bond_verify_device_path(struct net_device *start_dev,
> 		tags = kcalloc(level + 1, sizeof(*tags), GFP_ATOMIC);
> 		if (!tags)
> 			return ERR_PTR(-ENOMEM);
>-		tags[level].vlan_proto = VLAN_N_VID;
>+		tags[level].vlan_proto = BOND_VLAN_PROTO_NONE;
> 		return tags;
> 	}
> 
>
>

---
	-Jay Vosburgh, jay.vosburgh@canonical.com
patchwork-bot+netdevbpf@kernel.org May 12, 2023, 8:40 a.m. UTC | #2
Hello:

This patch was applied to netdev/net-next.git (main)
by David S. Miller <davem@davemloft.net>:

On Thu, 11 May 2023 17:07:12 +0200 you wrote:
> The type of the vlan_proto field is __be16.
> And most users of the field use it as such.
> 
> In the case of setting or testing the field for the special VLAN_N_VID
> value, host byte order is used. Which seems incorrect.
> 
> It also seems somewhat odd to store a VLAN ID value in a field that is
> otherwise used to store Ether types.
> 
> [...]

Here is the summary with links:
  - [net-next,v2] bonding: Always assign be16 value to vlan_proto
    https://git.kernel.org/netdev/net-next/c/c1bc7d73c964

You are awesome, thank you!
Simon Horman May 12, 2023, 9:28 a.m. UTC | #3
On Thu, May 11, 2023 at 04:43:57PM -0700, Jay Vosburgh wrote:
> Simon Horman <horms@kernel.org> wrote:
> 
> >The type of the vlan_proto field is __be16.
> >And most users of the field use it as such.
> >
> >In the case of setting or testing the field for the special VLAN_N_VID
> >value, host byte order is used. Which seems incorrect.
> >
> >It also seems somewhat odd to store a VLAN ID value in a field that is
> >otherwise used to store Ether types.
> >
> >Address this issue by defining BOND_VLAN_PROTO_NONE, a big endian value.
> >0xffff was chosen somewhat arbitrarily. What is important is that it
> >doesn't overlap with any valid VLAN Ether types.
> 
> As I think you mentioned, 0xffff is marked as a reserved ethertype.

Yes, it seems that I did. It is reserved in RFC-1701.

I can work it into the patch description if you like - there is no
particular reason I didn't for v2.

[1] https://lore.kernel.org/all/ZEI0zpDyJtfogO7s@kernel.org/
[2] https://www.rfc-editor.org/rfc/rfc1701.html
[3] https://www.iana.org/assignments/ieee-802-numbers/ieee-802-numbers.xhtml

> >I don't believe the problems described above are a bug because
> >VLAN_N_VID in both little-endian and big-endian byte order does not
> >conflict with any supported VLAN Ether types in big-endian byte order.
> >
> >Reported by sparse as:
> >
> > .../bond_main.c:2857:26: warning: restricted __be16 degrades to integer
> > .../bond_main.c:2863:20: warning: restricted __be16 degrades to integer
> > .../bond_main.c:2939:40: warning: incorrect type in assignment (different base types)
> > .../bond_main.c:2939:40:    expected restricted __be16 [usertype] vlan_proto
> > .../bond_main.c:2939:40:    got int
> >
> >No functional changes intended.
> >Compile tested only.
> >
> >Signed-off-by: Simon Horman <horms@kernel.org>
> 
> Acked-by: Jay Vosburgh <jay.vosburgh@canonical.com>
> 
> 	-J
> 
> >---
> >Changes in v2:
> >- Decribe Ether Type aspect of problem in patch description
> >- Use an Ether Type rather than VID valie as sential
> >- Link to v1: https://lore.kernel.org/r/20230420-bonding-be-vlan-proto-v1-1-754399f51d01@kernel.org
> >---
> > drivers/net/bonding/bond_main.c | 8 +++++---
> > 1 file changed, 5 insertions(+), 3 deletions(-)
> >
> >diff --git a/drivers/net/bonding/bond_main.c b/drivers/net/bonding/bond_main.c
> >index 3fed888629f7..ebf61c19dcef 100644
> >--- a/drivers/net/bonding/bond_main.c
> >+++ b/drivers/net/bonding/bond_main.c
> >@@ -2871,6 +2871,8 @@ static bool bond_has_this_ip(struct bonding *bond, __be32 ip)
> > 	return ret;
> > }
> > 
> >+#define BOND_VLAN_PROTO_NONE cpu_to_be16(0xffff)
> >+
> > static bool bond_handle_vlan(struct slave *slave, struct bond_vlan_tag *tags,
> > 			     struct sk_buff *skb)
> > {
> >@@ -2878,13 +2880,13 @@ static bool bond_handle_vlan(struct slave *slave, struct bond_vlan_tag *tags,
> > 	struct net_device *slave_dev = slave->dev;
> > 	struct bond_vlan_tag *outer_tag = tags;
> > 
> >-	if (!tags || tags->vlan_proto == VLAN_N_VID)
> >+	if (!tags || tags->vlan_proto == BOND_VLAN_PROTO_NONE)
> > 		return true;
> > 
> > 	tags++;
> > 
> > 	/* Go through all the tags backwards and add them to the packet */
> >-	while (tags->vlan_proto != VLAN_N_VID) {
> >+	while (tags->vlan_proto != BOND_VLAN_PROTO_NONE) {
> > 		if (!tags->vlan_id) {
> > 			tags++;
> > 			continue;
> >@@ -2960,7 +2962,7 @@ struct bond_vlan_tag *bond_verify_device_path(struct net_device *start_dev,
> > 		tags = kcalloc(level + 1, sizeof(*tags), GFP_ATOMIC);
> > 		if (!tags)
> > 			return ERR_PTR(-ENOMEM);
> >-		tags[level].vlan_proto = VLAN_N_VID;
> >+		tags[level].vlan_proto = BOND_VLAN_PROTO_NONE;
> > 		return tags;
> > 	}
> > 
> >
> >
> 
> ---
> 	-Jay Vosburgh, jay.vosburgh@canonical.com
>
Simon Horman May 12, 2023, 9:30 a.m. UTC | #4
On Fri, May 12, 2023 at 11:29:06AM +0200, Simon Horman wrote:
> On Thu, May 11, 2023 at 04:43:57PM -0700, Jay Vosburgh wrote:
> > Simon Horman <horms@kernel.org> wrote:
> > 
> > >The type of the vlan_proto field is __be16.
> > >And most users of the field use it as such.
> > >
> > >In the case of setting or testing the field for the special VLAN_N_VID
> > >value, host byte order is used. Which seems incorrect.
> > >
> > >It also seems somewhat odd to store a VLAN ID value in a field that is
> > >otherwise used to store Ether types.
> > >
> > >Address this issue by defining BOND_VLAN_PROTO_NONE, a big endian value.
> > >0xffff was chosen somewhat arbitrarily. What is important is that it
> > >doesn't overlap with any valid VLAN Ether types.
> > 
> > As I think you mentioned, 0xffff is marked as a reserved ethertype.
> 
> Yes, it seems that I did. It is reserved in RFC-1701.
> 
> I can work it into the patch description if you like - there is no
> particular reason I didn't for v2.
> 
> [1] https://lore.kernel.org/all/ZEI0zpDyJtfogO7s@kernel.org/
> [2] https://www.rfc-editor.org/rfc/rfc1701.html
> [3] https://www.iana.org/assignments/ieee-802-numbers/ieee-802-numbers.xhtml

I guess there will be no v2 as v2 was accepted :)

  - [net-next,v2] bonding: Always assign be16 value to vlan_proto
    https://git.kernel.org/netdev/net-next/c/c1bc7d73c964

In any case, this is now documented in the ML archives.
diff mbox series

Patch

diff --git a/drivers/net/bonding/bond_main.c b/drivers/net/bonding/bond_main.c
index 3fed888629f7..ebf61c19dcef 100644
--- a/drivers/net/bonding/bond_main.c
+++ b/drivers/net/bonding/bond_main.c
@@ -2871,6 +2871,8 @@  static bool bond_has_this_ip(struct bonding *bond, __be32 ip)
 	return ret;
 }
 
+#define BOND_VLAN_PROTO_NONE cpu_to_be16(0xffff)
+
 static bool bond_handle_vlan(struct slave *slave, struct bond_vlan_tag *tags,
 			     struct sk_buff *skb)
 {
@@ -2878,13 +2880,13 @@  static bool bond_handle_vlan(struct slave *slave, struct bond_vlan_tag *tags,
 	struct net_device *slave_dev = slave->dev;
 	struct bond_vlan_tag *outer_tag = tags;
 
-	if (!tags || tags->vlan_proto == VLAN_N_VID)
+	if (!tags || tags->vlan_proto == BOND_VLAN_PROTO_NONE)
 		return true;
 
 	tags++;
 
 	/* Go through all the tags backwards and add them to the packet */
-	while (tags->vlan_proto != VLAN_N_VID) {
+	while (tags->vlan_proto != BOND_VLAN_PROTO_NONE) {
 		if (!tags->vlan_id) {
 			tags++;
 			continue;
@@ -2960,7 +2962,7 @@  struct bond_vlan_tag *bond_verify_device_path(struct net_device *start_dev,
 		tags = kcalloc(level + 1, sizeof(*tags), GFP_ATOMIC);
 		if (!tags)
 			return ERR_PTR(-ENOMEM);
-		tags[level].vlan_proto = VLAN_N_VID;
+		tags[level].vlan_proto = BOND_VLAN_PROTO_NONE;
 		return tags;
 	}