Re: [net PATCH 1/2] net: dsa: qca8k: fix inband mgmt for big-endian systems

From: Christian Marangi
Date: Wed Oct 12 2022 - 08:55:29 EST


On Wed, Oct 12, 2022 at 02:42:16PM +0200, Andrew Lunn wrote:
> On Mon, Oct 10, 2022 at 01:14:58PM +0200, Christian Marangi wrote:
> > The header and the data of the skb for the inband mgmt requires
> > to be in little-endian. This is problematic for big-endian system
> > as the mgmt header is written in the cpu byte order.
> >
> > Fix this by converting each value for the mgmt header and data to
> > little-endian, and convert to cpu byte order the mgmt header and
> > data sent by the switch.
> >
> > Fixes: 5950c7c0a68c ("net: dsa: qca8k: add support for mgmt read/write in Ethernet packet")
> > Tested-by: Pawel Dembicki <paweldembicki@xxxxxxxxx>
> > Tested-by: Lech Perczak <lech.perczak@xxxxxxxxx>
> > Signed-off-by: Christian Marangi <ansuelsmth@xxxxxxxxx>
> > Reviewed-by: Lech Perczak <lech.perczak@xxxxxxxxx>
> > ---
> > drivers/net/dsa/qca/qca8k-8xxx.c | 63 ++++++++++++++++++++++++--------
> > include/linux/dsa/tag_qca.h | 6 +--
> > 2 files changed, 50 insertions(+), 19 deletions(-)
> >
> > diff --git a/drivers/net/dsa/qca/qca8k-8xxx.c b/drivers/net/dsa/qca/qca8k-8xxx.c
> > index 5669c92c93f7..4bb9b7eac68b 100644
> > --- a/drivers/net/dsa/qca/qca8k-8xxx.c
> > +++ b/drivers/net/dsa/qca/qca8k-8xxx.c
> > @@ -137,27 +137,42 @@ static void qca8k_rw_reg_ack_handler(struct dsa_switch *ds, struct sk_buff *skb)
> > struct qca8k_mgmt_eth_data *mgmt_eth_data;
> > struct qca8k_priv *priv = ds->priv;
> > struct qca_mgmt_ethhdr *mgmt_ethhdr;
> > + u32 command;
> > u8 len, cmd;
> > + int i;
> >
> > mgmt_ethhdr = (struct qca_mgmt_ethhdr *)skb_mac_header(skb);
> > mgmt_eth_data = &priv->mgmt_eth_data;
> >
> > - cmd = FIELD_GET(QCA_HDR_MGMT_CMD, mgmt_ethhdr->command);
> > - len = FIELD_GET(QCA_HDR_MGMT_LENGTH, mgmt_ethhdr->command);
> > + command = le32_to_cpu(mgmt_ethhdr->command);
> > + cmd = FIELD_GET(QCA_HDR_MGMT_CMD, command);
> > + len = FIELD_GET(QCA_HDR_MGMT_LENGTH, command);
>
> Humm...
>
> This might have the same alignment issue as the second patch. In fact,
> because the Ethernet header is 14 bytes in size, it is often
> deliberately out of alignment by 2 bytes, so that the IP header is
> aligned. You should probably be using get_unaligned_le32() when
> accessing members of mgmt_ethhdr.
>
> Andrew

Should I replace everything to get_unaligned_le32? Or this is only
needed for the mgmt_ethhdr as it's 12 bytes?

The skb data is all 32 bit contiguous stuff so it should be safe? Or
should we treat that also as unalligned just to make sure?

Same question for patch 2. the rest of the mib in skb data are all 32 or
64 values contiguous so wonder if we just take extra care of the
mgmt_ethhdr.

--
Ansuel