All of lore.kernel.org
 help / color / mirror / Atom feed
From: Sasha Levin <sashal@kernel.org>
To: linux-kernel@vger.kernel.org, stable@vger.kernel.org
Cc: Xie He <xie.he.0141@gmail.com>, Krzysztof Halasa <khc@pm.waw.pl>,
	"David S . Miller" <davem@davemloft.net>,
	Sasha Levin <sashal@kernel.org>,
	netdev@vger.kernel.org
Subject: [PATCH AUTOSEL 4.19 38/60] drivers/net/wan/hdlc_fr: Correctly handle special skb->protocol values
Date: Mon, 26 Oct 2020 20:03:53 -0400	[thread overview]
Message-ID: <20201027000415.1026364-38-sashal@kernel.org> (raw)
In-Reply-To: <20201027000415.1026364-1-sashal@kernel.org>

From: Xie He <xie.he.0141@gmail.com>

[ Upstream commit 8306266c1d51aac9aa7aa907fe99032a58c6382c ]

The fr_hard_header function is used to prepend the header to skbs before
transmission. It is used in 3 situations:
1) When a control packet is generated internally in this driver;
2) When a user sends an skb on an Ethernet-emulating PVC device;
3) When a user sends an skb on a normal PVC device.

These 3 situations need to be handled differently by fr_hard_header.
Different headers should be prepended to the skb in different situations.

Currently fr_hard_header distinguishes these 3 situations using
skb->protocol. For situation 1 and 2, a special skb->protocol value
will be assigned before calling fr_hard_header, so that it can recognize
these 2 situations. All skb->protocol values other than these special ones
are treated by fr_hard_header as situation 3.

However, it is possible that in situation 3, the user sends an skb with
one of the special skb->protocol values. In this case, fr_hard_header
would incorrectly treat it as situation 1 or 2.

This patch tries to solve this issue by using skb->dev instead of
skb->protocol to distinguish between these 3 situations. For situation
1, skb->dev would be NULL; for situation 2, skb->dev->type would be
ARPHRD_ETHER; and for situation 3, skb->dev->type would be ARPHRD_DLCI.

This way fr_hard_header would be able to distinguish these 3 situations
correctly regardless what skb->protocol value the user tries to use in
situation 3.

Cc: Krzysztof Halasa <khc@pm.waw.pl>
Signed-off-by: Xie He <xie.he.0141@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Signed-off-by: Sasha Levin <sashal@kernel.org>
---
 drivers/net/wan/hdlc_fr.c | 98 ++++++++++++++++++++-------------------
 1 file changed, 51 insertions(+), 47 deletions(-)

diff --git a/drivers/net/wan/hdlc_fr.c b/drivers/net/wan/hdlc_fr.c
index 03b5f5cce6f47..96b4ce13f3a5d 100644
--- a/drivers/net/wan/hdlc_fr.c
+++ b/drivers/net/wan/hdlc_fr.c
@@ -276,63 +276,69 @@ static inline struct net_device **get_dev_p(struct pvc_device *pvc,
 
 static int fr_hard_header(struct sk_buff **skb_p, u16 dlci)
 {
-	u16 head_len;
 	struct sk_buff *skb = *skb_p;
 
-	switch (skb->protocol) {
-	case cpu_to_be16(NLPID_CCITT_ANSI_LMI):
-		head_len = 4;
-		skb_push(skb, head_len);
-		skb->data[3] = NLPID_CCITT_ANSI_LMI;
-		break;
-
-	case cpu_to_be16(NLPID_CISCO_LMI):
-		head_len = 4;
-		skb_push(skb, head_len);
-		skb->data[3] = NLPID_CISCO_LMI;
-		break;
-
-	case cpu_to_be16(ETH_P_IP):
-		head_len = 4;
-		skb_push(skb, head_len);
-		skb->data[3] = NLPID_IP;
-		break;
-
-	case cpu_to_be16(ETH_P_IPV6):
-		head_len = 4;
-		skb_push(skb, head_len);
-		skb->data[3] = NLPID_IPV6;
-		break;
-
-	case cpu_to_be16(ETH_P_802_3):
-		head_len = 10;
-		if (skb_headroom(skb) < head_len) {
-			struct sk_buff *skb2 = skb_realloc_headroom(skb,
-								    head_len);
+	if (!skb->dev) { /* Control packets */
+		switch (dlci) {
+		case LMI_CCITT_ANSI_DLCI:
+			skb_push(skb, 4);
+			skb->data[3] = NLPID_CCITT_ANSI_LMI;
+			break;
+
+		case LMI_CISCO_DLCI:
+			skb_push(skb, 4);
+			skb->data[3] = NLPID_CISCO_LMI;
+			break;
+
+		default:
+			return -EINVAL;
+		}
+
+	} else if (skb->dev->type == ARPHRD_DLCI) {
+		switch (skb->protocol) {
+		case htons(ETH_P_IP):
+			skb_push(skb, 4);
+			skb->data[3] = NLPID_IP;
+			break;
+
+		case htons(ETH_P_IPV6):
+			skb_push(skb, 4);
+			skb->data[3] = NLPID_IPV6;
+			break;
+
+		default:
+			skb_push(skb, 10);
+			skb->data[3] = FR_PAD;
+			skb->data[4] = NLPID_SNAP;
+			/* OUI 00-00-00 indicates an Ethertype follows */
+			skb->data[5] = 0x00;
+			skb->data[6] = 0x00;
+			skb->data[7] = 0x00;
+			/* This should be an Ethertype: */
+			*(__be16 *)(skb->data + 8) = skb->protocol;
+		}
+
+	} else if (skb->dev->type == ARPHRD_ETHER) {
+		if (skb_headroom(skb) < 10) {
+			struct sk_buff *skb2 = skb_realloc_headroom(skb, 10);
 			if (!skb2)
 				return -ENOBUFS;
 			dev_kfree_skb(skb);
 			skb = *skb_p = skb2;
 		}
-		skb_push(skb, head_len);
+		skb_push(skb, 10);
 		skb->data[3] = FR_PAD;
 		skb->data[4] = NLPID_SNAP;
-		skb->data[5] = FR_PAD;
+		/* OUI 00-80-C2 stands for the 802.1 organization */
+		skb->data[5] = 0x00;
 		skb->data[6] = 0x80;
 		skb->data[7] = 0xC2;
+		/* PID 00-07 stands for Ethernet frames without FCS */
 		skb->data[8] = 0x00;
-		skb->data[9] = 0x07; /* bridged Ethernet frame w/out FCS */
-		break;
+		skb->data[9] = 0x07;
 
-	default:
-		head_len = 10;
-		skb_push(skb, head_len);
-		skb->data[3] = FR_PAD;
-		skb->data[4] = NLPID_SNAP;
-		skb->data[5] = FR_PAD;
-		skb->data[6] = FR_PAD;
-		skb->data[7] = FR_PAD;
-		*(__be16*)(skb->data + 8) = skb->protocol;
+	} else {
+		return -EINVAL;
 	}
 
 	dlci_to_q922(skb->data, dlci);
@@ -428,8 +434,8 @@ static netdev_tx_t pvc_xmit(struct sk_buff *skb, struct net_device *dev)
 				skb_put(skb, pad);
 				memset(skb->data + len, 0, pad);
 			}
-			skb->protocol = cpu_to_be16(ETH_P_802_3);
 		}
+		skb->dev = dev;
 		if (!fr_hard_header(&skb, pvc->dlci)) {
 			dev->stats.tx_bytes += skb->len;
 			dev->stats.tx_packets++;
@@ -497,10 +503,8 @@ static void fr_lmi_send(struct net_device *dev, int fullrep)
 	memset(skb->data, 0, len);
 	skb_reserve(skb, 4);
 	if (lmi == LMI_CISCO) {
-		skb->protocol = cpu_to_be16(NLPID_CISCO_LMI);
 		fr_hard_header(&skb, LMI_CISCO_DLCI);
 	} else {
-		skb->protocol = cpu_to_be16(NLPID_CCITT_ANSI_LMI);
 		fr_hard_header(&skb, LMI_CCITT_ANSI_DLCI);
 	}
 	data = skb_tail_pointer(skb);
-- 
2.25.1


  parent reply	other threads:[~2020-10-27  0:08 UTC|newest]

Thread overview: 91+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-10-27  0:03 [PATCH AUTOSEL 4.19 01/60] powerpc/powernv/smp: Fix spurious DBG() warning Sasha Levin
2020-10-27  0:03 ` Sasha Levin
2020-10-27  0:03 ` [PATCH AUTOSEL 4.19 02/60] powerpc: select ARCH_WANT_IRQS_OFF_ACTIVATE_MM Sasha Levin
2020-10-27  0:03   ` Sasha Levin
2020-10-27  0:03 ` [PATCH AUTOSEL 4.19 03/60] sparc64: remove mm_cpumask clearing to fix kthread_use_mm race Sasha Levin
2020-10-27  0:03   ` Sasha Levin
2020-10-27  0:03 ` [PATCH AUTOSEL 4.19 04/60] f2fs: add trace exit in exception path Sasha Levin
2020-10-27  0:03   ` [f2fs-dev] " Sasha Levin
2020-10-27  0:03 ` [PATCH AUTOSEL 4.19 05/60] f2fs: fix uninit-value in f2fs_lookup Sasha Levin
2020-10-27  0:03   ` [f2fs-dev] " Sasha Levin
2020-10-27  0:03 ` [PATCH AUTOSEL 4.19 06/60] f2fs: fix to check segment boundary during SIT page readahead Sasha Levin
2020-10-27  0:03   ` [f2fs-dev] " Sasha Levin
2020-10-27  0:03 ` [PATCH AUTOSEL 4.19 07/60] um: change sigio_spinlock to a mutex Sasha Levin
2020-10-27  0:03   ` Sasha Levin
2020-10-27  0:03 ` [PATCH AUTOSEL 4.19 08/60] MIPS: ftrace: Remove redundant #ifdef CONFIG_DYNAMIC_FTRACE Sasha Levin
2020-10-27  7:59   ` Sergei Shtylyov
2020-10-27  0:03 ` [PATCH AUTOSEL 4.19 09/60] ARM: 8997/2: hw_breakpoint: Handle inexact watchpoint addresses Sasha Levin
2020-10-27  0:03   ` Sasha Levin
2020-10-27  0:03 ` [PATCH AUTOSEL 4.19 10/60] power: supply: bq27xxx: report "not charging" on all types Sasha Levin
2020-10-27  0:03 ` [PATCH AUTOSEL 4.19 11/60] xfs: fix realtime bitmap/summary file truncation when growing rt volume Sasha Levin
2020-10-27  0:03 ` [PATCH AUTOSEL 4.19 12/60] video: fbdev: pvr2fb: initialize variables Sasha Levin
2020-10-27  0:03   ` Sasha Levin
2020-10-27  0:03 ` [PATCH AUTOSEL 4.19 13/60] ath10k: start recovery process when payload length exceeds max htc length for sdio Sasha Levin
2020-10-27  0:03   ` Sasha Levin
2020-10-27  0:03 ` [PATCH AUTOSEL 4.19 14/60] ath10k: fix VHT NSS calculation when STBC is enabled Sasha Levin
2020-10-27  0:03   ` Sasha Levin
2020-10-27  0:03 ` [PATCH AUTOSEL 4.19 15/60] drm/brige/megachips: Add checking if ge_b850v3_lvds_init() is working correctly Sasha Levin
2020-10-27  0:03   ` Sasha Levin
2020-10-27  0:03 ` [PATCH AUTOSEL 4.19 16/60] media: videodev2.h: RGB BT2020 and HSV are always full range Sasha Levin
2020-10-27  0:03 ` [PATCH AUTOSEL 4.19 17/60] media: platform: Improve queue set up flow for bug fixing Sasha Levin
2020-10-27  0:03   ` Sasha Levin
2020-10-27  0:03   ` Sasha Levin
2020-10-27  0:03 ` [PATCH AUTOSEL 4.19 18/60] usb: typec: tcpm: During PR_SWAP, source caps should be sent only after tSwapSourceStart Sasha Levin
2020-10-27  0:03 ` [PATCH AUTOSEL 4.19 19/60] media: tw5864: check status of tw5864_frameinterval_get Sasha Levin
2020-10-27  0:03 ` [PATCH AUTOSEL 4.19 20/60] media: imx274: fix frame interval handling Sasha Levin
2020-10-27  0:03 ` [PATCH AUTOSEL 4.19 21/60] mmc: via-sdmmc: Fix data race bug Sasha Levin
2020-10-27  0:03 ` [PATCH AUTOSEL 4.19 22/60] drm/bridge/synopsys: dsi: add support for non-continuous HS clock Sasha Levin
2020-10-27  0:03   ` Sasha Levin
2020-10-27  0:03 ` [PATCH AUTOSEL 4.19 23/60] arm64: topology: Stop using MPIDR for topology information Sasha Levin
2020-10-27  0:03   ` Sasha Levin
2020-10-27  0:03 ` [PATCH AUTOSEL 4.19 24/60] printk: reduce LOG_BUF_SHIFT range for H8300 Sasha Levin
2020-10-27  0:03 ` [PATCH AUTOSEL 4.19 25/60] ia64: kprobes: Use generic kretprobe trampoline handler Sasha Levin
2020-10-27  0:03   ` Sasha Levin
2020-10-27  0:03 ` [PATCH AUTOSEL 4.19 26/60] kgdb: Make "kgdbcon" work properly with "kgdb_earlycon" Sasha Levin
2020-10-27  0:03 ` [PATCH AUTOSEL 4.19 27/60] media: uvcvideo: Fix dereference of out-of-bound list iterator Sasha Levin
2020-10-27  0:03 ` [PATCH AUTOSEL 4.19 28/60] riscv: Define AT_VECTOR_SIZE_ARCH for ARCH_DLINFO Sasha Levin
2020-10-27  0:03   ` Sasha Levin
2020-11-06  5:26   ` Palmer Dabbelt
2020-11-06  5:26     ` Palmer Dabbelt
2020-10-27  0:03 ` [PATCH AUTOSEL 4.19 29/60] cpufreq: sti-cpufreq: add stih418 support Sasha Levin
2020-10-27  0:03   ` Sasha Levin
2020-10-27  0:03 ` [PATCH AUTOSEL 4.19 30/60] USB: adutux: fix debugging Sasha Levin
2020-10-27  0:03 ` [PATCH AUTOSEL 4.19 31/60] uio: free uio id after uio file node is freed Sasha Levin
2020-10-27  0:03 ` [PATCH AUTOSEL 4.19 32/60] usb: xhci: omit duplicate actions when suspending a runtime suspended host Sasha Levin
2020-10-27  0:03 ` [PATCH AUTOSEL 4.19 33/60] arm64/mm: return cpu_all_mask when node is NUMA_NO_NODE Sasha Levin
2020-10-27  0:03   ` Sasha Levin
2020-10-27  0:03 ` [PATCH AUTOSEL 4.19 34/60] xfs: don't free rt blocks when we're doing a REMAP bunmapi call Sasha Levin
2020-10-27  0:03 ` [PATCH AUTOSEL 4.19 35/60] ACPI: Add out of bounds and numa_off protections to pxm_to_node() Sasha Levin
2020-10-27  0:03 ` [PATCH AUTOSEL 4.19 36/60] genirq: Add stub for set_handle_irq() when !GENERIC_IRQ_MULTI_HANDLER Sasha Levin
2020-10-27  0:03 ` [PATCH AUTOSEL 4.19 37/60] dm: change max_io_len() to use blk_max_size_offset() Sasha Levin
2020-10-27  0:03   ` [dm-devel] " Sasha Levin
2020-10-27  0:03 ` Sasha Levin [this message]
2020-10-27  0:03 ` [PATCH AUTOSEL 4.19 39/60] bus/fsl_mc: Do not rely on caller to provide non NULL mc_io Sasha Levin
2020-10-27  0:03 ` [PATCH AUTOSEL 4.19 40/60] power: supply: test_power: add missing newlines when printing parameters by sysfs Sasha Levin
2020-10-27  0:03 ` [PATCH AUTOSEL 4.19 41/60] drm/amd/display: HDMI remote sink need mode validation for Linux Sasha Levin
2020-10-27  0:03   ` Sasha Levin
2020-10-27  0:03   ` Sasha Levin
2020-10-27  0:03 ` [PATCH AUTOSEL 4.19 42/60] btrfs: fix replace of seed device Sasha Levin
2020-10-27  0:03 ` [PATCH AUTOSEL 4.19 43/60] md/bitmap: md_bitmap_get_counter returns wrong blocks Sasha Levin
2020-10-27  0:03 ` [PATCH AUTOSEL 4.19 44/60] bnxt_en: Log unknown link speed appropriately Sasha Levin
2020-10-27  0:04 ` [PATCH AUTOSEL 4.19 45/60] rpmsg: glink: Use complete_all for open states Sasha Levin
2020-10-27  0:04 ` [PATCH AUTOSEL 4.19 46/60] clk: ti: clockdomain: fix static checker warning Sasha Levin
2020-10-27  0:04 ` [PATCH AUTOSEL 4.19 47/60] net: 9p: initialize sun_server.sun_path to have addr's value only when addr is valid Sasha Levin
2020-10-27  0:04 ` [PATCH AUTOSEL 4.19 48/60] drivers: watchdog: rdc321x_wdt: Fix race condition bugs Sasha Levin
2020-10-27  0:04 ` [PATCH AUTOSEL 4.19 49/60] ext4: Detect already used quota file early Sasha Levin
2020-10-27  0:04 ` [PATCH AUTOSEL 4.19 50/60] gfs2: add validation checks for size of superblock Sasha Levin
2020-10-27  0:04   ` [Cluster-devel] " Sasha Levin
2020-10-27  0:04 ` [PATCH AUTOSEL 4.19 51/60] cifs: handle -EINTR in cifs_setattr Sasha Levin
2020-10-27  0:04 ` [PATCH AUTOSEL 4.19 52/60] arm64: dts: renesas: ulcb: add full-pwr-cycle-in-suspend into eMMC nodes Sasha Levin
2020-10-27  0:04 ` [PATCH AUTOSEL 4.19 53/60] ARM: dts: omap4: Fix sgx clock rate for 4430 Sasha Levin
2020-10-27  0:04 ` [PATCH AUTOSEL 4.19 54/60] memory: emif: Remove bogus debugfs error handling Sasha Levin
2020-10-27  0:04 ` [PATCH AUTOSEL 4.19 55/60] ARM: dts: s5pv210: remove DMA controller bus node name to fix dtschema warnings Sasha Levin
2020-10-27  0:04   ` Sasha Levin
2020-10-27  0:04 ` [PATCH AUTOSEL 4.19 56/60] ARM: dts: s5pv210: move PMU node out of clock controller Sasha Levin
2020-10-27  0:04   ` Sasha Levin
2020-10-27  0:04 ` [PATCH AUTOSEL 4.19 57/60] ARM: dts: s5pv210: remove dedicated 'audio-subsystem' node Sasha Levin
2020-10-27  0:04   ` Sasha Levin
2020-10-27  0:04 ` [PATCH AUTOSEL 4.19 58/60] nbd: make the config put is called before the notifying the waiter Sasha Levin
2020-10-27  0:04 ` [PATCH AUTOSEL 4.19 59/60] sgl_alloc_order: fix memory leak Sasha Levin
2020-10-27  0:04 ` [PATCH AUTOSEL 4.19 60/60] nvme-rdma: fix crash when connect rejected Sasha Levin
2020-10-27  0:04   ` Sasha Levin

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20201027000415.1026364-38-sashal@kernel.org \
    --to=sashal@kernel.org \
    --cc=davem@davemloft.net \
    --cc=khc@pm.waw.pl \
    --cc=linux-kernel@vger.kernel.org \
    --cc=netdev@vger.kernel.org \
    --cc=stable@vger.kernel.org \
    --cc=xie.he.0141@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.