Blame SOURCES/CVE-2022-2964.patch

fe7971
From ad4757373f2ade3e1b238c8967d1b5bf80654820 Mon Sep 17 00:00:00 2001
fe7971
From: Yannick Cote <ycote@redhat.com>
fe7971
Date: Wed, 7 Dec 2022 14:07:55 -0500
fe7971
Subject: [KPATCH CVE-2022-2964] kpatch fixes for CVE-2022-2964
fe7971
fe7971
Kernels:
fe7971
3.10.0-1160.66.1.el7
fe7971
3.10.0-1160.71.1.el7
fe7971
3.10.0-1160.76.1.el7
fe7971
3.10.0-1160.80.1.el7
fe7971
fe7971
fe7971
Kpatch-MR: https://gitlab.com/redhat/prdsc/rhel/src/kpatch/rhel-7/-/merge_requests/47
fe7971
Approved-by: Joe Lawrence (@joe.lawrence)
fe7971
Changes since last build:
fe7971
arches: x86_64 ppc64le
fe7971
ax88179_178a.o: changed function: ax88179_rx_fixup
fe7971
ax88179_178a.o: changed function: ax88179_tx_fixup
fe7971
---------------------------
fe7971
fe7971
Modifications: none
fe7971
fe7971
commit 6887c693d5b263d458cdae235b5ca4cb36d79466
fe7971
Author: Jose Ignacio Tornos Martinez <jtornosm@redhat.com>
fe7971
Date:   Thu Oct 6 18:32:21 2022 +0200
fe7971
fe7971
    net: usb: ax88179_178a: fix packet alignment padding
fe7971
fe7971
    Bugzilla: https://bugzilla.redhat.com/2120504
fe7971
    CVE: CVE-2022-2964
fe7971
fe7971
    commit e869e7a17798d85829fa7d4f9bbe1eebd4b2d3f6
fe7971
    Author: Jeremy Kerr <jk@ozlabs.org>
fe7971
    Date:   Mon Jun 15 10:54:56 2020 +0800
fe7971
fe7971
        net: usb: ax88179_178a: fix packet alignment padding
fe7971
fe7971
        Using a AX88179 device (0b95:1790), I see two bytes of appended data on
fe7971
        every RX packet. For example, this 48-byte ping, using 0xff as a
fe7971
        payload byte:
fe7971
fe7971
          04:20:22.528472 IP 192.168.1.1 > 192.168.1.2: ICMP echo request, id 2447, seq 1, length 64
fe7971
                0x0000:  000a cd35 ea50 000a cd35 ea4f 0800 4500
fe7971
                0x0010:  0054 c116 4000 4001 f63e c0a8 0101 c0a8
fe7971
                0x0020:  0102 0800 b633 098f 0001 87ea cd5e 0000
fe7971
                0x0030:  0000 dcf2 0600 0000 0000 ffff ffff ffff
fe7971
                0x0040:  ffff ffff ffff ffff ffff ffff ffff ffff
fe7971
                0x0050:  ffff ffff ffff ffff ffff ffff ffff ffff
fe7971
                0x0060:  ffff 961f
fe7971
fe7971
        Those last two bytes - 96 1f - aren't part of the original packet.
fe7971
fe7971
        In the ax88179 RX path, the usbnet rx_fixup function trims a 2-byte
fe7971
        'alignment pseudo header' from the start of the packet, and sets the
fe7971
        length from a per-packet field populated by hardware. It looks like that
fe7971
        length field *includes* the 2-byte header; the current driver assumes
fe7971
        that it's excluded.
fe7971
fe7971
        This change trims the 2-byte alignment header after we've set the packet
fe7971
        length, so the resulting packet length is correct. While we're moving
fe7971
        the comment around, this also fixes the spelling of 'pseudo'.
fe7971
fe7971
        Signed-off-by: Jeremy Kerr <jk@ozlabs.org>
fe7971
        Signed-off-by: David S. Miller <davem@davemloft.net>
fe7971
fe7971
    Signed-off-by: Jose Ignacio Tornos Martinez <jtornosm@redhat.com>
fe7971
fe7971
commit cb4cf1dd8820ba776a91ebf5b88ad1c3d83a0dfb
fe7971
Author: Jose Ignacio Tornos Martinez <jtornosm@redhat.com>
fe7971
Date:   Thu Oct 6 18:32:21 2022 +0200
fe7971
fe7971
    ax88179_178a: Merge memcpy + le32_to_cpus to get_unaligned_le32
fe7971
fe7971
    Bugzilla: https://bugzilla.redhat.com/2120504
fe7971
    CVE: CVE-2022-2964
fe7971
fe7971
    commit d1854d509d61d36af44f2130423bff8836e1592e
fe7971
    Author: Chuhong Yuan <hslester96@gmail.com>
fe7971
    Date:   Fri Jul 19 17:07:15 2019 +0800
fe7971
fe7971
        ax88179_178a: Merge memcpy + le32_to_cpus to get_unaligned_le32
fe7971
fe7971
        Merge the combo use of memcpy and le32_to_cpus.
fe7971
        Use get_unaligned_le32 instead.
fe7971
        This simplifies the code.
fe7971
fe7971
        Signed-off-by: Chuhong Yuan <hslester96@gmail.com>
fe7971
        Signed-off-by: David S. Miller <davem@davemloft.net>
fe7971
fe7971
    Signed-off-by: Jose Ignacio Tornos Martinez <jtornosm@redhat.com>
fe7971
fe7971
commit 4e6ea26989123e731329323492d30f826aa28010
fe7971
Author: Jose Ignacio Tornos Martinez <jtornosm@redhat.com>
fe7971
Date:   Thu Oct 6 18:32:21 2022 +0200
fe7971
fe7971
    net: usb: Merge cpu_to_le32s + memcpy to put_unaligned_le32
fe7971
fe7971
    Bugzilla: https://bugzilla.redhat.com/2120504
fe7971
    CVE: CVE-2022-2964
fe7971
fe7971
    Conflicts:
fe7971
        Only ax88179 files
fe7971
fe7971
    commit 7e24b4ed5ac4321e41415b0c6f0f8a8ac14852b2
fe7971
    Author: Chuhong Yuan <hslester96@gmail.com>
fe7971
    Date:   Mon Jul 22 15:41:34 2019 +0800
fe7971
fe7971
        net: usb: Merge cpu_to_le32s + memcpy to put_unaligned_le32
fe7971
fe7971
        Merge the combo uses of cpu_to_le32s and memcpy.
fe7971
        Use put_unaligned_le32 instead.
fe7971
        This simplifies the code.
fe7971
fe7971
        Signed-off-by: Chuhong Yuan <hslester96@gmail.com>
fe7971
        Signed-off-by: David S. Miller <davem@davemloft.net>
fe7971
fe7971
    Signed-off-by: Jose Ignacio Tornos Martinez <jtornosm@redhat.com>
fe7971
fe7971
commit 7faaf2665dcbc3a4fdb31331de699045040ed213
fe7971
Author: Jose Ignacio Tornos Martinez <jtornosm@redhat.com>
fe7971
Date:   Thu Oct 6 18:32:22 2022 +0200
fe7971
fe7971
    net: usb: ax88179_178a: Fix out-of-bounds accesses in RX fixup
fe7971
fe7971
    Bugzilla: https://bugzilla.redhat.com/2120504
fe7971
    CVE: CVE-2022-2964
fe7971
fe7971
    commit 57bc3d3ae8c14df3ceb4e17d26ddf9eeab304581
fe7971
    Author: Jann Horn <jannh@google.com>
fe7971
    Date:   Wed Jan 26 14:14:52 2022 +0100
fe7971
fe7971
        net: usb: ax88179_178a: Fix out-of-bounds accesses in RX fixup
fe7971
fe7971
        ax88179_rx_fixup() contains several out-of-bounds accesses that can be
fe7971
        triggered by a malicious (or defective) USB device, in particular:
fe7971
fe7971
         - The metadata array (hdr_off..hdr_off+2*pkt_cnt) can be out of bounds,
fe7971
           causing OOB reads and (on big-endian systems) OOB endianness flips.
fe7971
         - A packet can overlap the metadata array, causing a later OOB
fe7971
           endianness flip to corrupt data used by a cloned SKB that has already
fe7971
           been handed off into the network stack.
fe7971
         - A packet SKB can be constructed whose tail is far beyond its end,
fe7971
           causing out-of-bounds heap data to be considered part of the SKB's
fe7971
           data.
fe7971
fe7971
        I have tested that this can be used by a malicious USB device to send a
fe7971
        bogus ICMPv6 Echo Request and receive an ICMPv6 Echo Reply in response
fe7971
        that contains random kernel heap data.
fe7971
        It's probably also possible to get OOB writes from this on a
fe7971
        little-endian system somehow - maybe by triggering skb_cow() via IP
fe7971
        options processing -, but I haven't tested that.
fe7971
fe7971
        Fixes: e2ca90c276e1 ("ax88179_178a: ASIX AX88179_178A USB 3.0/2.0 to gigabit ethernet adapter driver")
fe7971
        Cc: stable@kernel.org
fe7971
        Signed-off-by: Jann Horn <jannh@google.com>
fe7971
        Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
fe7971
fe7971
    Signed-off-by: Jose Ignacio Tornos Martinez <jtornosm@redhat.com>
fe7971
fe7971
commit 4e8b1e4091c6dce2911ffe8b9a8a7c58f8b028bc
fe7971
Author: Jose Ignacio Tornos Martinez <jtornosm@redhat.com>
fe7971
Date:   Thu Nov 17 08:53:37 2022 +0100
fe7971
fe7971
    net: usb: ax88179_178a: Fix packet receiving
fe7971
fe7971
    Bugzilla: https://bugzilla.redhat.com/2120504
fe7971
    CVE: CVE-2022-2964
fe7971
fe7971
    commit f8ebb3ac881b17712e1d5967c97ab1806b16d3d6
fe7971
    Author: Jose Alonso <joalonsof@gmail.com>
fe7971
    Date:   Tue Jun 28 12:13:02 2022 -0300
fe7971
fe7971
        net: usb: ax88179_178a: Fix packet receiving
fe7971
fe7971
        This patch corrects packet receiving in ax88179_rx_fixup.
fe7971
fe7971
        - problem observed:
fe7971
          ifconfig shows allways a lot of 'RX Errors' while packets
fe7971
          are received normally.
fe7971
fe7971
          This occurs because ax88179_rx_fixup does not recognise properly
fe7971
          the usb urb received.
fe7971
          The packets are normally processed and at the end, the code exits
fe7971
          with 'return 0', generating RX Errors.
fe7971
          (pkt_cnt==-2 and ptk_hdr over field rx_hdr trying to identify
fe7971
           another packet there)
fe7971
fe7971
          This is a usb urb received by "tcpdump -i usbmon2 -X" on a
fe7971
          little-endian CPU:
fe7971
          0x0000:  eeee f8e3 3b19 87a0 94de 80e3 daac 0800
fe7971
                   ^         packet 1 start (pkt_len = 0x05ec)
fe7971
                   ^^^^      IP alignment pseudo header
fe7971
                        ^    ethernet packet start
fe7971
                   last byte ethernet packet   v
fe7971
                   padding (8-bytes aligned)     vvvv vvvv
fe7971
          0x05e0:  c92d d444 1420 8a69 83dd 272f e82b 9811
fe7971
          0x05f0:  eeee f8e3 3b19 87a0 94de 80e3 daac 0800
fe7971
          ...      ^ packet 2
fe7971
          0x0be0:  eeee f8e3 3b19 87a0 94de 80e3 daac 0800
fe7971
          ...
fe7971
          0x1130:  9d41 9171 8a38 0ec5 eeee f8e3 3b19 87a0
fe7971
          ...
fe7971
          0x1720:  8cfc 15ff 5e4c e85c eeee f8e3 3b19 87a0
fe7971
          ...
fe7971
          0x1d10:  ecfa 2a3a 19ab c78c eeee f8e3 3b19 87a0
fe7971
          ...
fe7971
          0x2070:  eeee f8e3 3b19 87a0 94de 80e3 daac 0800
fe7971
          ...      ^ packet 7
fe7971
          0x2120:  7c88 4ca5 5c57 7dcc 0d34 7577 f778 7e0a
fe7971
          0x2130:  f032 e093 7489 0740 3008 ec05 0000 0080
fe7971
                                       ====1==== ====2====
fe7971
                   hdr_off             ^
fe7971
                   pkt_len = 0x05ec         ^^^^
fe7971
                   AX_RXHDR_*=0x00830  ^^^^   ^
fe7971
                   pkt_len = 0                        ^^^^
fe7971
                   AX_RXHDR_DROP_ERR=0x80000000  ^^^^   ^
fe7971
          0x2140:  3008 ec05 0000 0080 3008 5805 0000 0080
fe7971
          0x2150:  3008 ec05 0000 0080 3008 ec05 0000 0080
fe7971
          0x2160:  3008 5803 0000 0080 3008 c800 0000 0080
fe7971
                   ===11==== ===12==== ===13==== ===14====
fe7971
          0x2170:  0000 0000 0e00 3821
fe7971
                             ^^^^ ^^^^ rx_hdr
fe7971
                             ^^^^      pkt_cnt=14
fe7971
                                  ^^^^ hdr_off=0x2138
fe7971
                   ^^^^ ^^^^           padding
fe7971
fe7971
          The dump shows that pkt_cnt is the number of entrys in the
fe7971
          per-packet metadata. It is "2 * packet count".
fe7971
          Each packet have two entrys. The first have a valid
fe7971
          value (pkt_len and AX_RXHDR_*) and the second have a
fe7971
          dummy-header 0x80000000 (pkt_len=0 with AX_RXHDR_DROP_ERR).
fe7971
          Why exists dummy-header for each packet?!?
fe7971
          My guess is that this was done probably to align the
fe7971
          entry for each packet to 64-bits and maintain compatibility
fe7971
          with old firmware.
fe7971
          There is also a padding (0x00000000) before the rx_hdr to
fe7971
          align the end of rx_hdr to 64-bit.
fe7971
          Note that packets have a alignment of 64-bits (8-bytes).
fe7971
fe7971
          This patch assumes that the dummy-header and the last
fe7971
          padding are optional. So it preserves semantics and
fe7971
          recognises the same valid packets as the current code.
fe7971
fe7971
          This patch was made using only the dumpfile information and
fe7971
          tested with only one device:
fe7971
          0b95:1790 ASIX Electronics Corp. AX88179 Gigabit Ethernet
fe7971
fe7971
        Fixes: 57bc3d3ae8c1 ("net: usb: ax88179_178a: Fix out-of-bounds accesses in RX fixup")
fe7971
        Fixes: e2ca90c276e1 ("ax88179_178a: ASIX AX88179_178A USB 3.0/2.0 to gigabit ethernet adapter driver")
fe7971
        Signed-off-by: Jose Alonso <joalonsof@gmail.com>
fe7971
        Acked-by: Paolo Abeni <pabeni@redhat.com>
fe7971
        Link: https://lore.kernel.org/r/d6970bb04bf67598af4d316eaeb1792040b18cfd.camel@gmail.com
fe7971
        Signed-off-by: Paolo Abeni <pabeni@redhat.com>
fe7971
fe7971
    Signed-off-by: Jose Ignacio Tornos Martinez <jtornosm@redhat.com>
fe7971
fe7971
Signed-off-by: Yannick Cote <ycote@redhat.com>
fe7971
---
fe7971
 drivers/net/usb/ax88179_178a.c | 128 ++++++++++++++++++++++++---------
fe7971
 1 file changed, 93 insertions(+), 35 deletions(-)
fe7971
fe7971
diff --git a/drivers/net/usb/ax88179_178a.c b/drivers/net/usb/ax88179_178a.c
fe7971
index 7f496ccdd272..1940f31facf0 100644
fe7971
--- a/drivers/net/usb/ax88179_178a.c
fe7971
+++ b/drivers/net/usb/ax88179_178a.c
fe7971
@@ -1375,58 +1375,119 @@ static int ax88179_rx_fixup(struct usbnet *dev, struct sk_buff *skb)
fe7971
 	u16 hdr_off;
fe7971
 	u32 *pkt_hdr;
fe7971
 
fe7971
-	/* This check is no longer done by usbnet */
fe7971
-	if (skb->len < dev->net->hard_header_len)
fe7971
+	/* At the end of the SKB, there's a header telling us how many packets
fe7971
+	 * are bundled into this buffer and where we can find an array of
fe7971
+	 * per-packet metadata (which contains elements encoded into u16).
fe7971
+	 */
fe7971
+
fe7971
+	/* SKB contents for current firmware:
fe7971
+	 *   <packet 1> <padding>
fe7971
+	 *   ...
fe7971
+	 *   <packet N> <padding>
fe7971
+	 *   <per-packet metadata entry 1> <dummy header>
fe7971
+	 *   ...
fe7971
+	 *   <per-packet metadata entry N> <dummy header>
fe7971
+	 *   <padding2> <rx_hdr>
fe7971
+	 *
fe7971
+	 * where:
fe7971
+	 *   <packet N> contains pkt_len bytes:
fe7971
+	 *		2 bytes of IP alignment pseudo header
fe7971
+	 *		packet received
fe7971
+	 *   <per-packet metadata entry N> contains 4 bytes:
fe7971
+	 *		pkt_len and fields AX_RXHDR_*
fe7971
+	 *   <padding>	0-7 bytes to terminate at
fe7971
+	 *		8 bytes boundary (64-bit).
fe7971
+	 *   <padding2> 4 bytes to make rx_hdr terminate at
fe7971
+	 *		8 bytes boundary (64-bit)
fe7971
+	 *   <dummy-header> contains 4 bytes:
fe7971
+	 *		pkt_len=0 and AX_RXHDR_DROP_ERR
fe7971
+	 *   <rx-hdr>	contains 4 bytes:
fe7971
+	 *		pkt_cnt and hdr_off (offset of
fe7971
+	 *		  <per-packet metadata entry 1>)
fe7971
+	 *
fe7971
+	 * pkt_cnt is number of entrys in the per-packet metadata.
fe7971
+	 * In current firmware there is 2 entrys per packet.
fe7971
+	 * The first points to the packet and the
fe7971
+	 *  second is a dummy header.
fe7971
+	 * This was done probably to align fields in 64-bit and
fe7971
+	 *  maintain compatibility with old firmware.
fe7971
+	 * This code assumes that <dummy header> and <padding2> are
fe7971
+	 *  optional.
fe7971
+	 */
fe7971
+
fe7971
+	if (skb->len < 4)
fe7971
 		return 0;
fe7971
-
fe7971
 	skb_trim(skb, skb->len - 4);
fe7971
-	memcpy(&rx_hdr, skb_tail_pointer(skb), 4);
fe7971
-	le32_to_cpus(&rx_hdr);
fe7971
-
fe7971
+	rx_hdr = get_unaligned_le32(skb_tail_pointer(skb));
fe7971
 	pkt_cnt = (u16)rx_hdr;
fe7971
 	hdr_off = (u16)(rx_hdr >> 16);
fe7971
+
fe7971
+	if (pkt_cnt == 0)
fe7971
+		return 0;
fe7971
+
fe7971
+	/* Make sure that the bounds of the metadata array are inside the SKB
fe7971
+	 * (and in front of the counter at the end).
fe7971
+	 */
fe7971
+	if (pkt_cnt * 4 + hdr_off > skb->len)
fe7971
+		return 0;
fe7971
 	pkt_hdr = (u32 *)(skb->data + hdr_off);
fe7971
 
fe7971
-	while (pkt_cnt--) {
fe7971
+	/* Packets must not overlap the metadata array */
fe7971
+	skb_trim(skb, hdr_off);
fe7971
+
fe7971
+	for (; pkt_cnt > 0; pkt_cnt--, pkt_hdr++) {
fe7971
+		u16 pkt_len_plus_padd;
fe7971
 		u16 pkt_len;
fe7971
 
fe7971
 		le32_to_cpus(pkt_hdr);
fe7971
 		pkt_len = (*pkt_hdr >> 16) & 0x1fff;
fe7971
+		pkt_len_plus_padd = (pkt_len + 7) & 0xfff8;
fe7971
+
fe7971
+		/* Skip dummy header used for alignment
fe7971
+		 */
fe7971
+		if (pkt_len == 0)
fe7971
+			continue;
fe7971
+
fe7971
+		if (pkt_len_plus_padd > skb->len)
fe7971
+			return 0;
fe7971
 
fe7971
 		/* Check CRC or runt packet */
fe7971
-		if ((*pkt_hdr & AX_RXHDR_CRC_ERR) ||
fe7971
-		    (*pkt_hdr & AX_RXHDR_DROP_ERR)) {
fe7971
-			skb_pull(skb, (pkt_len + 7) & 0xFFF8);
fe7971
-			pkt_hdr++;
fe7971
+		if ((*pkt_hdr & (AX_RXHDR_CRC_ERR | AX_RXHDR_DROP_ERR)) ||
fe7971
+		    pkt_len < 2 + ETH_HLEN) {
fe7971
+			dev->net->stats.rx_errors++;
fe7971
+			skb_pull(skb, pkt_len_plus_padd);
fe7971
 			continue;
fe7971
 		}
fe7971
 
fe7971
-		if (pkt_cnt == 0) {
fe7971
-			/* Skip IP alignment psudo header */
fe7971
+		/* last packet */
fe7971
+		if (pkt_len_plus_padd == skb->len) {
fe7971
+			skb_trim(skb, pkt_len);
fe7971
+
fe7971
+			/* Skip IP alignment pseudo header */
fe7971
 			skb_pull(skb, 2);
fe7971
-			skb->len = pkt_len;
fe7971
-			skb_set_tail_pointer(skb, pkt_len);
fe7971
-			skb->truesize = pkt_len + sizeof(struct sk_buff);
fe7971
+
fe7971
+			skb->truesize = SKB_TRUESIZE(pkt_len_plus_padd);
fe7971
 			ax88179_rx_checksum(skb, pkt_hdr);
fe7971
 			return 1;
fe7971
 		}
fe7971
 
fe7971
 		ax_skb = skb_clone(skb, GFP_ATOMIC);
fe7971
-		if (ax_skb) {
fe7971
-			ax_skb->len = pkt_len;
fe7971
-			ax_skb->data = skb->data + 2;
fe7971
-			skb_set_tail_pointer(ax_skb, pkt_len);
fe7971
-			ax_skb->truesize = pkt_len + sizeof(struct sk_buff);
fe7971
-			ax88179_rx_checksum(ax_skb, pkt_hdr);
fe7971
-			usbnet_skb_return(dev, ax_skb);
fe7971
-		} else {
fe7971
+		if (!ax_skb)
fe7971
 			return 0;
fe7971
-		}
fe7971
+		skb_trim(ax_skb, pkt_len);
fe7971
 
fe7971
-		skb_pull(skb, (pkt_len + 7) & 0xFFF8);
fe7971
-		pkt_hdr++;
fe7971
+		/* Skip IP alignment pseudo header */
fe7971
+		skb_pull(ax_skb, 2);
fe7971
+
fe7971
+		skb->truesize = pkt_len_plus_padd +
fe7971
+				SKB_DATA_ALIGN(sizeof(struct sk_buff));
fe7971
+		ax88179_rx_checksum(ax_skb, pkt_hdr);
fe7971
+		usbnet_skb_return(dev, ax_skb);
fe7971
+
fe7971
+		skb_pull(skb, pkt_len_plus_padd);
fe7971
 	}
fe7971
-	return 1;
fe7971
+
fe7971
+	return 0;
fe7971
 }
fe7971
 
fe7971
 static struct sk_buff *
fe7971
@@ -1436,6 +1497,7 @@ ax88179_tx_fixup(struct usbnet *dev, struct sk_buff *skb, gfp_t flags)
fe7971
 	int frame_size = dev->maxpacket;
fe7971
 	int mss = skb_shinfo(skb)->gso_size;
fe7971
 	int headroom;
fe7971
+	void *ptr;
fe7971
 
fe7971
 	tx_hdr1 = skb->len;
fe7971
 	tx_hdr2 = mss;
fe7971
@@ -1450,13 +1512,9 @@ ax88179_tx_fixup(struct usbnet *dev, struct sk_buff *skb, gfp_t flags)
fe7971
 		return NULL;
fe7971
 	}
fe7971
 
fe7971
-	skb_push(skb, 4);
fe7971
-	cpu_to_le32s(&tx_hdr2);
fe7971
-	skb_copy_to_linear_data(skb, &tx_hdr2, 4);
fe7971
-
fe7971
-	skb_push(skb, 4);
fe7971
-	cpu_to_le32s(&tx_hdr1);
fe7971
-	skb_copy_to_linear_data(skb, &tx_hdr1, 4);
fe7971
+	ptr = skb_push(skb, 8);
fe7971
+	put_unaligned_le32(tx_hdr1, ptr);
fe7971
+	put_unaligned_le32(tx_hdr2, ptr + 4);
fe7971
 
fe7971
 	return skb;
fe7971
 }
fe7971
-- 
fe7971
2.39.0
fe7971
fe7971