Skip to content

Commit 218b772

Browse files
yuanzhaominggregkh
authored andcommitted
net: mctp: fix don't require received header reserved bits to be zero
[ Upstream commit a663bac ] >From the MCTP Base specification (DSP0236 v1.2.1), the first byte of the MCTP header contains a 4 bit reserved field, and 4 bit version. On our current receive path, we require those 4 reserved bits to be zero, but the 9500-8i card is non-conformant, and may set these reserved bits. DSP0236 states that the reserved bits must be written as zero, and ignored when read. While the device might not conform to the former, we should accept these message to conform to the latter. Relax our check on the MCTP version byte to allow non-zero bits in the reserved field. Fixes: 889b7da ("mctp: Add initial routing framework") Signed-off-by: Yuan Zhaoming <yuanzm2@lenovo.com> Cc: stable@vger.kernel.org Acked-by: Jeremy Kerr <jk@codeconstruct.com.au> Link: https://patch.msgid.link/20260417141340.5306-1-yuanzhaoming901030@126.com Signed-off-by: Jakub Kicinski <kuba@kernel.org> [ Context ] Signed-off-by: Sasha Levin <sashal@kernel.org> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
1 parent 6a2d627 commit 218b772

2 files changed

Lines changed: 9 additions & 2 deletions

File tree

include/net/mctp.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,9 @@ struct mctp_hdr {
2626
#define MCTP_VER_MIN 1
2727
#define MCTP_VER_MAX 1
2828

29+
/* Definitions for ver field */
30+
#define MCTP_HDR_VER_MASK GENMASK(3, 0)
31+
2932
/* Definitions for flags_seq_tag field */
3033
#define MCTP_HDR_FLAG_SOM BIT(7)
3134
#define MCTP_HDR_FLAG_EOM BIT(6)

net/mctp/route.c

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -335,6 +335,7 @@ static int mctp_route_input(struct mctp_route *route, struct sk_buff *skb)
335335
unsigned long f;
336336
u8 tag, flags;
337337
int rc;
338+
u8 ver;
338339

339340
msk = NULL;
340341
rc = -EINVAL;
@@ -357,7 +358,8 @@ static int mctp_route_input(struct mctp_route *route, struct sk_buff *skb)
357358
mh = mctp_hdr(skb);
358359
skb_pull(skb, sizeof(struct mctp_hdr));
359360

360-
if (mh->ver != 1)
361+
ver = mh->ver & MCTP_HDR_VER_MASK;
362+
if (ver < MCTP_VER_MIN || ver > MCTP_VER_MAX)
361363
goto out;
362364

363365
flags = mh->flags_seq_tag & (MCTP_HDR_FLAG_SOM | MCTP_HDR_FLAG_EOM);
@@ -1124,6 +1126,7 @@ static int mctp_pkttype_receive(struct sk_buff *skb, struct net_device *dev,
11241126
struct mctp_skb_cb *cb;
11251127
struct mctp_route *rt;
11261128
struct mctp_hdr *mh;
1129+
u8 ver;
11271130

11281131
rcu_read_lock();
11291132
mdev = __mctp_dev_get(dev);
@@ -1141,7 +1144,8 @@ static int mctp_pkttype_receive(struct sk_buff *skb, struct net_device *dev,
11411144

11421145
/* We have enough for a header; decode and route */
11431146
mh = mctp_hdr(skb);
1144-
if (mh->ver < MCTP_VER_MIN || mh->ver > MCTP_VER_MAX)
1147+
ver = mh->ver & MCTP_HDR_VER_MASK;
1148+
if (ver < MCTP_VER_MIN || ver > MCTP_VER_MAX)
11451149
goto err_drop;
11461150

11471151
/* source must be valid unicast or null; drop reserved ranges and

0 commit comments

Comments
 (0)