Discussion:
[Bridge] [PATCH 04/12] bridge: netfilter: Use the new global ether_<foo>_addr arrays
Joe Perches
2018-03-31 07:05:19 UTC
Permalink
Remove the local consts and use the new globals.

Signed-off-by: Joe Perches <***@perches.com>
---
net/bridge/netfilter/ebt_stp.c | 6 ++----
1 file changed, 2 insertions(+), 4 deletions(-)

diff --git a/net/bridge/netfilter/ebt_stp.c b/net/bridge/netfilter/ebt_stp.c
index 3140eb912d7e..2b7479cc0140 100644
--- a/net/bridge/netfilter/ebt_stp.c
+++ b/net/bridge/netfilter/ebt_stp.c
@@ -153,8 +153,6 @@ ebt_stp_mt(const struct sk_buff *skb, struct xt_action_param *par)
static int ebt_stp_mt_check(const struct xt_mtchk_param *par)
{
const struct ebt_stp_info *info = par->matchinfo;
- const u8 bridge_ula[6] = {0x01, 0x80, 0xc2, 0x00, 0x00, 0x00};
- const u8 msk[6] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
const struct ebt_entry *e = par->entryinfo;

if (info->bitmask & ~EBT_STP_MASK || info->invflags & ~EBT_STP_MASK ||
@@ -162,8 +160,8 @@ static int ebt_stp_mt_check(const struct xt_mtchk_param *par)
return -EINVAL;
/* Make sure the match only receives stp frames */
if (!par->nft_compat &&
- (!ether_addr_equal(e->destmac, bridge_ula) ||
- !ether_addr_equal(e->destmsk, msk) ||
+ (!ether_addr_equal(e->destmac, ether_stp_addr) ||
+ !ether_addr_equal(e->destmsk, ether_broadcast_addr) ||
!(e->bitmask & EBT_DESTMAC)))
return -EINVAL;
--
2.15.0
Joe Perches
2018-03-31 07:05:17 UTC
Permalink
eth_stp_addr is not in the same form as the other global ether_<foo>_addr
addresses like ether_broadcast_addr.

Convert it treewide.

Miscellanea:

o Add comment to the ether_stp_addr define to show it's for spanning-tree

Signed-off-by: Joe Perches <***@perches.com>
---
drivers/net/dsa/lan9303-core.c | 4 ++--
include/linux/etherdevice.h | 3 ++-
net/bridge/br_device.c | 4 ++--
3 files changed, 6 insertions(+), 5 deletions(-)

diff --git a/drivers/net/dsa/lan9303-core.c b/drivers/net/dsa/lan9303-core.c
index fefa454f3e56..a6f015ef251a 100644
--- a/drivers/net/dsa/lan9303-core.c
+++ b/drivers/net/dsa/lan9303-core.c
@@ -789,7 +789,7 @@ static int lan9303_separate_ports(struct lan9303 *chip)
{
int ret;

- lan9303_alr_del_port(chip, eth_stp_addr, 0);
+ lan9303_alr_del_port(chip, ether_stp_addr, 0);
ret = lan9303_write_switch_reg(chip, LAN9303_SWE_PORT_MIRROR,
LAN9303_SWE_PORT_MIRROR_SNIFFER_PORT0 |
LAN9303_SWE_PORT_MIRROR_MIRRORED_PORT1 |
@@ -814,7 +814,7 @@ static void lan9303_bridge_ports(struct lan9303 *chip)

lan9303_write_switch_reg(chip, LAN9303_SWE_PORT_STATE,
chip->swe_port_state);
- lan9303_alr_add_port(chip, eth_stp_addr, 0, true);
+ lan9303_alr_add_port(chip, ether_stp_addr, 0, true);
}

static void lan9303_handle_reset(struct lan9303 *chip)
diff --git a/include/linux/etherdevice.h b/include/linux/etherdevice.h
index 85d2486b2959..142da8043b24 100644
--- a/include/linux/etherdevice.h
+++ b/include/linux/etherdevice.h
@@ -70,7 +70,8 @@ extern const u8 ether_zero_addr[ETH_ALEN]; /* all zeros */
/* Reserved Ethernet Addresses per IEEE 802.1Q */
extern const u8 ether_reserved_addr_base[ETH_ALEN];

-#define eth_stp_addr ether_reserved_addr_base
+/* Ethernet bridge - spanning tree protocol */
+#define ether_stp_addr ether_reserved_addr_base

/**
* is_link_local_ether_addr - Determine if given Ethernet address is link-local
diff --git a/net/bridge/br_device.c b/net/bridge/br_device.c
index 278fc999d355..3abcf69d1976 100644
--- a/net/bridge/br_device.c
+++ b/net/bridge/br_device.c
@@ -1,4 +1,4 @@
-/*
+gg/*
* Device handling code
* Linux ethernet bridge
*
@@ -431,7 +431,7 @@ void br_dev_setup(struct net_device *dev)
br->bridge_id.prio[0] = 0x80;
br->bridge_id.prio[1] = 0x00;

- ether_addr_copy(br->group_addr, eth_stp_addr);
+ ether_addr_copy(br->group_addr, ether_stp_addr);

br->stp_enabled = BR_NO_STP;
br->group_fwd_mask = BR_GROUPFWD_DEFAULT;
--
2.15.0
Andrew Lunn
2018-03-31 17:36:43 UTC
Permalink
Post by Joe Perches
--- a/net/bridge/br_device.c
+++ b/net/bridge/br_device.c
@@ -1,4 +1,4 @@
-/*
+gg/*
Hi Joe

This does not look good.

Andrew
Joe Perches
2018-03-31 18:01:21 UTC
Permalink
Post by Andrew Lunn
Post by Joe Perches
--- a/net/bridge/br_device.c
+++ b/net/bridge/br_device.c
@@ -1,4 +1,4 @@
-/*
+gg/*
Hi Joe
This does not look good.
Definitely agree with that. apologies for not noticing.

It's emacs editing nonsense like a superfluous :wq for vim
Joe Perches
2018-03-31 18:34:06 UTC
Permalink
eth_stp_addr is not in the same form as the other global ether_<foo>_addr
addresses like ether_broadcast_addr.

Convert it treewide.

Miscellanea:

o Add comment to the ether_stp_addr define to show it's for spanning-tree

Signed-off-by: Joe Perches <***@perches.com>
---

V2: Remove gg from initial comment (bad editing)

drivers/net/dsa/lan9303-core.c | 4 ++--
include/linux/etherdevice.h | 3 ++-
net/bridge/br_device.c | 2 +-
3 files changed, 5 insertions(+), 4 deletions(-)

diff --git a/drivers/net/dsa/lan9303-core.c b/drivers/net/dsa/lan9303-core.c
index fefa454f3e56..a6f015ef251a 100644
--- a/drivers/net/dsa/lan9303-core.c
+++ b/drivers/net/dsa/lan9303-core.c
@@ -789,7 +789,7 @@ static int lan9303_separate_ports(struct lan9303 *chip)
{
int ret;

- lan9303_alr_del_port(chip, eth_stp_addr, 0);
+ lan9303_alr_del_port(chip, ether_stp_addr, 0);
ret = lan9303_write_switch_reg(chip, LAN9303_SWE_PORT_MIRROR,
LAN9303_SWE_PORT_MIRROR_SNIFFER_PORT0 |
LAN9303_SWE_PORT_MIRROR_MIRRORED_PORT1 |
@@ -814,7 +814,7 @@ static void lan9303_bridge_ports(struct lan9303 *chip)

lan9303_write_switch_reg(chip, LAN9303_SWE_PORT_STATE,
chip->swe_port_state);
- lan9303_alr_add_port(chip, eth_stp_addr, 0, true);
+ lan9303_alr_add_port(chip, ether_stp_addr, 0, true);
}

static void lan9303_handle_reset(struct lan9303 *chip)
diff --git a/include/linux/etherdevice.h b/include/linux/etherdevice.h
index 85d2486b2959..142da8043b24 100644
--- a/include/linux/etherdevice.h
+++ b/include/linux/etherdevice.h
@@ -70,7 +70,8 @@ extern const u8 ether_zero_addr[ETH_ALEN]; /* all zeros */
/* Reserved Ethernet Addresses per IEEE 802.1Q */
extern const u8 ether_reserved_addr_base[ETH_ALEN];

-#define eth_stp_addr ether_reserved_addr_base
+/* Ethernet bridge - spanning tree protocol */
+#define ether_stp_addr ether_reserved_addr_base

/**
* is_link_local_ether_addr - Determine if given Ethernet address is link-local
diff --git a/net/bridge/br_device.c b/net/bridge/br_device.c
index 278fc999d355..17b1917b6ecd 100644
--- a/net/bridge/br_device.c
+++ b/net/bridge/br_device.c
@@ -431,7 +431,7 @@ void br_dev_setup(struct net_device *dev)
br->bridge_id.prio[0] = 0x80;
br->bridge_id.prio[1] = 0x00;

- ether_addr_copy(br->group_addr, eth_stp_addr);
+ ether_addr_copy(br->group_addr, ether_stp_addr);

br->stp_enabled = BR_NO_STP;
br->group_fwd_mask = BR_GROUPFWD_DEFAULT;
--
2.15.0
David Miller
2018-04-01 18:07:12 UTC
Permalink
From: Joe Perches <***@perches.com>
Date: Sat, 31 Mar 2018 11:34:06 -0700
Post by Joe Perches
eth_stp_addr is not in the same form as the other global ether_<foo>_addr
addresses like ether_broadcast_addr.
Convert it treewide.
o Add comment to the ether_stp_addr define to show it's for spanning-tree
---
V2: Remove gg from initial comment (bad editing)
Joe this was part of a larger series.

Please repost the entire series when you fix a patch contained
in that series, not just the patch that is changing.

Thank you.
Pablo Neira Ayuso
2018-03-31 18:28:10 UTC
Permalink
Hi Joe,
Post by Joe Perches
Remove the local consts and use the new globals.
This one is already upstream:

https://git.kernel.org/pub/scm/linux/kernel/git/pablo/nf-next.git/commit/?id=9124a20d8794663a396b5d6f91f66903848a042b

I can see you're using is_broadcast_ether_addr(e->destmsk) in this new
version, we would need an incremental version.

Thanks.
Post by Joe Perches
---
net/bridge/netfilter/ebt_stp.c | 6 ++----
1 file changed, 2 insertions(+), 4 deletions(-)
diff --git a/net/bridge/netfilter/ebt_stp.c b/net/bridge/netfilter/ebt_stp.c
index 3140eb912d7e..2b7479cc0140 100644
--- a/net/bridge/netfilter/ebt_stp.c
+++ b/net/bridge/netfilter/ebt_stp.c
@@ -153,8 +153,6 @@ ebt_stp_mt(const struct sk_buff *skb, struct xt_action_param *par)
static int ebt_stp_mt_check(const struct xt_mtchk_param *par)
{
const struct ebt_stp_info *info = par->matchinfo;
- const u8 bridge_ula[6] = {0x01, 0x80, 0xc2, 0x00, 0x00, 0x00};
- const u8 msk[6] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
const struct ebt_entry *e = par->entryinfo;
if (info->bitmask & ~EBT_STP_MASK || info->invflags & ~EBT_STP_MASK ||
@@ -162,8 +160,8 @@ static int ebt_stp_mt_check(const struct xt_mtchk_param *par)
return -EINVAL;
/* Make sure the match only receives stp frames */
if (!par->nft_compat &&
- (!ether_addr_equal(e->destmac, bridge_ula) ||
- !ether_addr_equal(e->destmsk, msk) ||
+ (!ether_addr_equal(e->destmac, ether_stp_addr) ||
+ !ether_addr_equal(e->destmsk, ether_broadcast_addr) ||
!(e->bitmask & EBT_DESTMAC)))
return -EINVAL;
--
2.15.0
Joe Perches
2018-03-31 18:40:42 UTC
Permalink
Post by Pablo Neira Ayuso
Hi Joe,
Hi Pablo.
Post by Pablo Neira Ayuso
Post by Joe Perches
Remove the local consts and use the new globals.
https://git.kernel.org/pub/scm/linux/kernel/git/pablo/nf-next.git/commit/?id=9124a20d8794663a396b5d6f91f66903848a042b
I can see you're using is_broadcast_ether_addr(e->destmsk) in this new
version, we would need an incremental version.
No worries. I did it against next-20180329
and that other commit wasn't there.
Felix Fietkau
2018-04-05 13:27:49 UTC
Permalink
There are many local static and non-static arrays that are used for
Ethernet broadcast address output or comparison.
Centralize the array into a single separate file and remove the local
arrays.
I suspect that for many targets and configurations, the local arrays
might actually be smaller than exporting a global. You have to factor in
not just the .text size, but the fact that referencing an exported
symbol needs a .reloc entry as well, which also eats up some space (at
least when the code is being built as module).

In my opinion, your series probably causes more bloat in common
configurations instead of reducing it.

You're also touching several places that could easily use
eth_broadcast_addr and eth_zero_addr. I think making those changes would
be more productive than what you did in this series.

- Felix
Joe Perches
2018-04-05 13:51:32 UTC
Permalink
Post by Felix Fietkau
There are many local static and non-static arrays that are used for
Ethernet broadcast address output or comparison.
Centralize the array into a single separate file and remove the local
arrays.
I suspect that for many targets and configurations, the local arrays
might actually be smaller than exporting a global.
I tried x86-64 allnoconfig and defconfig.
Those both did not increase vmlinux size.

The defconfig actually got smaller, but that might have been
some object alignment oddity.
Post by Felix Fietkau
You have to factor in
not just the .text size, but the fact that referencing an exported
symbol needs a .reloc entry as well, which also eats up some space (at
least when the code is being built as module).
Thanks, the modules I built got smaller.
Post by Felix Fietkau
In my opinion, your series probably causes more bloat in common
configurations instead of reducing it.
You're also touching several places that could easily use
eth_broadcast_addr and eth_zero_addr. I think making those changes would
be more productive than what you did in this series.
Doubtful. AFAIK: possible unaligned addresses.
Felix Fietkau
2018-04-05 14:05:51 UTC
Permalink
Post by Joe Perches
Post by Felix Fietkau
You have to factor in
not just the .text size, but the fact that referencing an exported
symbol needs a .reloc entry as well, which also eats up some space (at
least when the code is being built as module).
Thanks, the modules I built got smaller.
Please post some numbers to show this. By the way, on other
architectures the numbers will probably be different, especially on
ARM/MIPS.
Post by Joe Perches
Post by Felix Fietkau
In my opinion, your series probably causes more bloat in common
configurations instead of reducing it.
You're also touching several places that could easily use
eth_broadcast_addr and eth_zero_addr. I think making those changes would
be more productive than what you did in this series.
Doubtful. AFAIK: possible unaligned addresses.
Those two are just memset calls, alignment does not matter.

- Felix

Loading...