lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <CA+FuTSdS86GtG15y17G0nNaqHjHTeYzFn+0N5+nTjXM8u=hpJw@mail.gmail.com>
Date:   Fri, 30 Oct 2020 12:32:46 -0400
From:   Willem de Bruijn <willemdebruijn.kernel@...il.com>
To:     Xie He <xie.he.0141@...il.com>
Cc:     Jakub Kicinski <kuba@...nel.org>,
        "David S. Miller" <davem@...emloft.net>,
        Network Development <netdev@...r.kernel.org>,
        linux-kernel <linux-kernel@...r.kernel.org>,
        Willem de Bruijn <willemdebruijn.kernel@...il.com>,
        Krzysztof Halasa <khc@...waw.pl>
Subject: Re: [PATCH net-next v4 5/5] net: hdlc_fr: Add support for any Ethertype

On Thu, Oct 29, 2020 at 10:32 PM Xie He <xie.he.0141@...il.com> wrote:
>
> Change the fr_rx function to make this driver support any Ethertype
> when receiving skbs on normal (non-Ethernet-emulating) PVC devices.
> (This driver is already able to handle any Ethertype when sending.)
>
> Originally in the fr_rx function, the code that parses the long (10-byte)
> header only recognizes a few Ethertype values and drops frames with other
> Ethertype values. This patch replaces this code to make fr_rx support
> any Ethertype. This patch also creates a new function fr_snap_parse as
> part of the new code.
>
> Cc: Willem de Bruijn <willemdebruijn.kernel@...il.com>
> Cc: Krzysztof Halasa <khc@...waw.pl>
> Signed-off-by: Xie He <xie.he.0141@...il.com>
> ---
>  drivers/net/wan/hdlc_fr.c | 75 +++++++++++++++++++++++++--------------
>  1 file changed, 49 insertions(+), 26 deletions(-)
>
> diff --git a/drivers/net/wan/hdlc_fr.c b/drivers/net/wan/hdlc_fr.c
> index 9a37575686b9..e95efc14bc97 100644
> --- a/drivers/net/wan/hdlc_fr.c
> +++ b/drivers/net/wan/hdlc_fr.c
> @@ -871,6 +871,45 @@ static int fr_lmi_recv(struct net_device *dev, struct sk_buff *skb)
>         return 0;
>  }
>

>  static int fr_rx(struct sk_buff *skb)
>  {
> @@ -945,35 +984,19 @@ static int fr_rx(struct sk_buff *skb)
>                 skb->protocol = htons(ETH_P_IPV6);
>                 skb_reset_mac_header(skb);
>
> -       } else if (skb->len > 10 && data[3] == FR_PAD &&
> -                  data[4] == NLPID_SNAP && data[5] == FR_PAD) {
> -               u16 oui = ntohs(*(__be16*)(data + 6));
> -               u16 pid = ntohs(*(__be16*)(data + 8));
> -               skb_pull(skb, 10);
> -
> -               switch ((((u32)oui) << 16) | pid) {
> -               case ETH_P_ARP: /* routed frame with SNAP */
> -               case ETH_P_IPX:
> -               case ETH_P_IP:  /* a long variant */
> -               case ETH_P_IPV6:
> -                       if (!pvc->main)
> -                               goto rx_drop;
> -                       skb->dev = pvc->main;
> -                       skb->protocol = htons(pid);
> -                       skb_reset_mac_header(skb);
> -                       break;
> -
> -               case 0x80C20007: /* bridged Ethernet frame */
> -                       if (!pvc->ether)
> +       } else if (data[3] == FR_PAD) {
> +               if (skb->len < 5)
> +                       goto rx_error;
> +               if (data[4] == NLPID_SNAP) { /* A SNAP header follows */

Should this still check data[5] == FR_PAD?


> +                       skb_pull(skb, 5);
> +                       if (skb->len < 5) /* Incomplete SNAP header */
> +                               goto rx_error;
> +                       if (fr_snap_parse(skb, pvc))
>                                 goto rx_drop;
> -                       skb->protocol = eth_type_trans(skb, pvc->ether);
> -                       break;
> -
> -               default:
> -                       netdev_info(frad, "Unsupported protocol, OUI=%x PID=%x\n",
> -                                   oui, pid);
> +               } else {
>                         goto rx_drop;
>                 }
> +
>         } else {
>                 netdev_info(frad, "Unsupported protocol, NLPID=%x length=%i\n",
>                             data[3], skb->len);
> --
> 2.27.0
>

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ