drivers/net/wwan/mhi_wwan_mbim.c | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-)
Use DEFINE_RAW_FLEX() to avoid a -Wflex-array-member-not-at-end warning.
Remove fixed-size array struct usb_cdc_ncm_dpe16 dpe16[2]; from struct
mbim_tx_hdr, so that flex-array member struct mbim_tx_hdr::ndp16.dpe16[]
ends last in this structure.
Compensate for this by using the DEFINE_RAW_FLEX() helper to declare the
on-stack struct instance that contains struct usb_cdc_ncm_ndp16 as a
member. Adjust the rest of the code, accordingly.
So, with these changes fix the following warning:
drivers/net/wwan/mhi_wwan_mbim.c:81:34: warning: structure containing a flexible array member is not at the end of another structure [-Wflex-array-member-not-at-end]
Signed-off-by: Gustavo A. R. Silva <gustavoars@kernel.org>
---
drivers/net/wwan/mhi_wwan_mbim.c | 14 ++++++--------
1 file changed, 6 insertions(+), 8 deletions(-)
diff --git a/drivers/net/wwan/mhi_wwan_mbim.c b/drivers/net/wwan/mhi_wwan_mbim.c
index c814fbd756a1..dd60e335ed8a 100644
--- a/drivers/net/wwan/mhi_wwan_mbim.c
+++ b/drivers/net/wwan/mhi_wwan_mbim.c
@@ -79,7 +79,6 @@ struct mhi_mbim_context {
struct mbim_tx_hdr {
struct usb_cdc_ncm_nth16 nth16;
struct usb_cdc_ncm_ndp16 ndp16;
- struct usb_cdc_ncm_dpe16 dpe16[2];
} __packed;
static struct mhi_mbim_link *mhi_mbim_get_link_rcu(struct mhi_mbim_context *mbim,
@@ -107,20 +106,20 @@ static int mhi_mbim_get_link_mux_id(struct mhi_controller *cntrl)
static struct sk_buff *mbim_tx_fixup(struct sk_buff *skb, unsigned int session,
u16 tx_seq)
{
+ DEFINE_RAW_FLEX(struct mbim_tx_hdr, mbim_hdr, ndp16.dpe16, 2);
unsigned int dgram_size = skb->len;
struct usb_cdc_ncm_nth16 *nth16;
struct usb_cdc_ncm_ndp16 *ndp16;
- struct mbim_tx_hdr *mbim_hdr;
/* Only one NDP is sent, containing the IP packet (no aggregation) */
/* Ensure we have enough headroom for crafting MBIM header */
- if (skb_cow_head(skb, sizeof(struct mbim_tx_hdr))) {
+ if (skb_cow_head(skb, __struct_size(mbim_hdr))) {
dev_kfree_skb_any(skb);
return NULL;
}
- mbim_hdr = skb_push(skb, sizeof(struct mbim_tx_hdr));
+ mbim_hdr = skb_push(skb, __struct_size(mbim_hdr));
/* Fill NTB header */
nth16 = &mbim_hdr->nth16;
@@ -133,12 +132,11 @@ static struct sk_buff *mbim_tx_fixup(struct sk_buff *skb, unsigned int session,
/* Fill the unique NDP */
ndp16 = &mbim_hdr->ndp16;
ndp16->dwSignature = cpu_to_le32(USB_CDC_MBIM_NDP16_IPS_SIGN | (session << 24));
- ndp16->wLength = cpu_to_le16(sizeof(struct usb_cdc_ncm_ndp16)
- + sizeof(struct usb_cdc_ncm_dpe16) * 2);
+ ndp16->wLength = cpu_to_le16(struct_size(ndp16, dpe16, 2));
ndp16->wNextNdpIndex = 0;
/* Datagram follows the mbim header */
- ndp16->dpe16[0].wDatagramIndex = cpu_to_le16(sizeof(struct mbim_tx_hdr));
+ ndp16->dpe16[0].wDatagramIndex = cpu_to_le16(__struct_size(mbim_hdr));
ndp16->dpe16[0].wDatagramLength = cpu_to_le16(dgram_size);
/* null termination */
@@ -584,7 +582,7 @@ static void mhi_mbim_setup(struct net_device *ndev)
{
ndev->header_ops = NULL; /* No header */
ndev->type = ARPHRD_RAWIP;
- ndev->needed_headroom = sizeof(struct mbim_tx_hdr);
+ ndev->needed_headroom = struct_size_t(struct mbim_tx_hdr, ndp16.dpe16, 2);
ndev->hard_header_len = 0;
ndev->addr_len = 0;
ndev->flags = IFF_POINTOPOINT | IFF_NOARP;
--
2.43.0
On Tue, Nov 25, 2025 at 5:20 AM Gustavo A. R. Silva
<gustavoars@kernel.org> wrote:
>
> Use DEFINE_RAW_FLEX() to avoid a -Wflex-array-member-not-at-end warning.
>
> Remove fixed-size array struct usb_cdc_ncm_dpe16 dpe16[2]; from struct
> mbim_tx_hdr, so that flex-array member struct mbim_tx_hdr::ndp16.dpe16[]
> ends last in this structure.
>
> Compensate for this by using the DEFINE_RAW_FLEX() helper to declare the
> on-stack struct instance that contains struct usb_cdc_ncm_ndp16 as a
> member. Adjust the rest of the code, accordingly.
>
> So, with these changes fix the following warning:
>
> drivers/net/wwan/mhi_wwan_mbim.c:81:34: warning: structure containing a flexible array member is not at the end of another structure [-Wflex-array-member-not-at-end]
>
> Signed-off-by: Gustavo A. R. Silva <gustavoars@kernel.org>
Reviewed-by: Loic Poulain <loic.poulain@oss.qualcomm.com>
> ---
> drivers/net/wwan/mhi_wwan_mbim.c | 14 ++++++--------
> 1 file changed, 6 insertions(+), 8 deletions(-)
>
> diff --git a/drivers/net/wwan/mhi_wwan_mbim.c b/drivers/net/wwan/mhi_wwan_mbim.c
> index c814fbd756a1..dd60e335ed8a 100644
> --- a/drivers/net/wwan/mhi_wwan_mbim.c
> +++ b/drivers/net/wwan/mhi_wwan_mbim.c
> @@ -79,7 +79,6 @@ struct mhi_mbim_context {
> struct mbim_tx_hdr {
> struct usb_cdc_ncm_nth16 nth16;
> struct usb_cdc_ncm_ndp16 ndp16;
> - struct usb_cdc_ncm_dpe16 dpe16[2];
> } __packed;
>
> static struct mhi_mbim_link *mhi_mbim_get_link_rcu(struct mhi_mbim_context *mbim,
> @@ -107,20 +106,20 @@ static int mhi_mbim_get_link_mux_id(struct mhi_controller *cntrl)
> static struct sk_buff *mbim_tx_fixup(struct sk_buff *skb, unsigned int session,
> u16 tx_seq)
> {
> + DEFINE_RAW_FLEX(struct mbim_tx_hdr, mbim_hdr, ndp16.dpe16, 2);
> unsigned int dgram_size = skb->len;
> struct usb_cdc_ncm_nth16 *nth16;
> struct usb_cdc_ncm_ndp16 *ndp16;
> - struct mbim_tx_hdr *mbim_hdr;
>
> /* Only one NDP is sent, containing the IP packet (no aggregation) */
>
> /* Ensure we have enough headroom for crafting MBIM header */
> - if (skb_cow_head(skb, sizeof(struct mbim_tx_hdr))) {
> + if (skb_cow_head(skb, __struct_size(mbim_hdr))) {
> dev_kfree_skb_any(skb);
> return NULL;
> }
>
> - mbim_hdr = skb_push(skb, sizeof(struct mbim_tx_hdr));
> + mbim_hdr = skb_push(skb, __struct_size(mbim_hdr));
>
> /* Fill NTB header */
> nth16 = &mbim_hdr->nth16;
> @@ -133,12 +132,11 @@ static struct sk_buff *mbim_tx_fixup(struct sk_buff *skb, unsigned int session,
> /* Fill the unique NDP */
> ndp16 = &mbim_hdr->ndp16;
> ndp16->dwSignature = cpu_to_le32(USB_CDC_MBIM_NDP16_IPS_SIGN | (session << 24));
> - ndp16->wLength = cpu_to_le16(sizeof(struct usb_cdc_ncm_ndp16)
> - + sizeof(struct usb_cdc_ncm_dpe16) * 2);
> + ndp16->wLength = cpu_to_le16(struct_size(ndp16, dpe16, 2));
> ndp16->wNextNdpIndex = 0;
>
> /* Datagram follows the mbim header */
> - ndp16->dpe16[0].wDatagramIndex = cpu_to_le16(sizeof(struct mbim_tx_hdr));
> + ndp16->dpe16[0].wDatagramIndex = cpu_to_le16(__struct_size(mbim_hdr));
> ndp16->dpe16[0].wDatagramLength = cpu_to_le16(dgram_size);
>
> /* null termination */
> @@ -584,7 +582,7 @@ static void mhi_mbim_setup(struct net_device *ndev)
> {
> ndev->header_ops = NULL; /* No header */
> ndev->type = ARPHRD_RAWIP;
> - ndev->needed_headroom = sizeof(struct mbim_tx_hdr);
> + ndev->needed_headroom = struct_size_t(struct mbim_tx_hdr, ndp16.dpe16, 2);
> ndev->hard_header_len = 0;
> ndev->addr_len = 0;
> ndev->flags = IFF_POINTOPOINT | IFF_NOARP;
> --
> 2.43.0
>
© 2016 - 2025 Red Hat, Inc.