[PATCH v7] Add payload to be 32-bit aligned to fix dropped packets

Kumar Thangavel kumarthangavel.hcl at gmail.com
Fri Nov 19 19:15:39 AEDT 2021


On Thu, Nov 18, 2021 at 10:44 PM Eric Dumazet <eric.dumazet at gmail.com>
wrote:

>
>
> On 11/18/21 8:03 AM, Kumar Thangavel wrote:
> > Update NC-SI command handler (both standard and OEM) to take into
> > account of payload paddings in allocating skb (in case of payload
> > size is not 32-bit aligned).
> >
> > The checksum field follows payload field, without taking payload
> > padding into account can cause checksum being truncated, leading to
> > dropped packets.
> >
>
> Patch title should start with a prefix, identifying which layer/driver is
> involved.
>
> Probably in this case
>
> net/ncsi: Add payload to be 32-bit aligned to fix dropped packets
>
ACK.

>
> > Fixes: fb4ee67529ff ("net/ncsi: Add NCSI OEM command support")
> > Signed-off-by: Kumar Thangavel <thangavel.k at hcl.com>
> > Acked-by: Samuel Mendoza-Jonas <sam at mendozajonas.com>
> > Reviewed-by: Paul Menzel <pmenzel at molgen.mpg.de>
> >
> > ---
> >   v7:
> >    - Updated padding_bytes as const static int variable
> >
> >   v6:
> >    - Updated type of padding_bytes variable
> >    - Updated type of payload
> >    - Seperated variable declarations and code
> >
> >   v5:
> >    - Added Fixes tag
> >    - Added const variable for padding_bytes
> >
> >   v4:
> >    - Used existing macro for max function
> >
> >   v3:
> >    - Added Macro for MAX
> >    - Fixed the missed semicolon
> >
> >   v2:
> >    - Added NC-SI spec version and section
> >    - Removed blank line
> >    - corrected spellings
> >
> >   v1:
> >    - Initial draft
> >
> > ---
> > ---
> >  net/ncsi/ncsi-cmd.c | 24 ++++++++++++++++--------
> >  1 file changed, 16 insertions(+), 8 deletions(-)
> >
> > diff --git a/net/ncsi/ncsi-cmd.c b/net/ncsi/ncsi-cmd.c
> > index ba9ae482141b..9a6f10f4833e 100644
> > --- a/net/ncsi/ncsi-cmd.c
> > +++ b/net/ncsi/ncsi-cmd.c
> > @@ -18,6 +18,8 @@
> >  #include "internal.h"
> >  #include "ncsi-pkt.h"
> >
> > +const static int padding_bytes = 26;
>
> It would be nice to have some kind of reference, to explain
> what is this magic value.
>
> ACK.


> Moving the comment [1] here might make sense.
>
>
> > +
> >  u32 ncsi_calculate_checksum(unsigned char *data, int len)
> >  {
> >       u32 checksum = 0;
> > @@ -213,12 +215,17 @@ static int ncsi_cmd_handler_oem(struct sk_buff
> *skb,
> >  {
> >       struct ncsi_cmd_oem_pkt *cmd;
> >       unsigned int len;
> > +     int payload;
>
> [1] This comment could be moved before @padding_bytes
>
> > +     /* NC-SI spec DSP_0222_1.2.0, section 8.2.2.2
> > +      * requires payload to be padded with 0 to
> > +      * 32-bit boundary before the checksum field.
> > +      * Ensure the padding bytes are accounted for in
> > +      * skb allocation
> > +      */
> >
> > +     payload = ALIGN(nca->payload, 4);
> >       len = sizeof(struct ncsi_cmd_pkt_hdr) + 4;
> > -     if (nca->payload < 26)
> > -             len += 26;
> > -     else
> > -             len += nca->payload;
> > +     len += max(payload, padding_bytes);
> >
> >       cmd = skb_put_zero(skb, len);
> >       memcpy(&cmd->mfr_id, nca->data, nca->payload);
> > @@ -272,6 +279,7 @@ static struct ncsi_request
> *ncsi_alloc_command(struct ncsi_cmd_arg *nca)
> >       struct net_device *dev = nd->dev;
> >       int hlen = LL_RESERVED_SPACE(dev);
> >       int tlen = dev->needed_tailroom;
> > +     int payload;
> >       int len = hlen + tlen;
> >       struct sk_buff *skb;
> >       struct ncsi_request *nr;
> > @@ -281,14 +289,14 @@ static struct ncsi_request
> *ncsi_alloc_command(struct ncsi_cmd_arg *nca)
> >               return NULL;
> >
> >       /* NCSI command packet has 16-bytes header, payload, 4 bytes
> checksum.
> > +      * Payload needs padding so that the checksum field following
> payload is
> > +      * aligned to 32-bit boundary.
> >        * The packet needs padding if its payload is less than 26 bytes to
> >        * meet 64 bytes minimal ethernet frame length.
> >        */
> >       len += sizeof(struct ncsi_cmd_pkt_hdr) + 4;
> > -     if (nca->payload < 26)
> > -             len += 26;
> > -     else
> > -             len += nca->payload;
> > +     payload = ALIGN(nca->payload, 4);
> > +     len += max(payload, padding_bytes);
> >
> >       /* Allocate skb */
> >       skb = alloc_skb(len, GFP_ATOMIC);
> >
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.ozlabs.org/pipermail/openbmc/attachments/20211119/8b5ae39a/attachment.htm>


More information about the openbmc mailing list