All of lore.kernel.org
 help / color / mirror / Atom feed
From: Bjorn Andersson <bjorn.andersson@linaro.org>
To: Alex Elder <elder@linaro.org>
Cc: subashab@codeaurora.org, stranche@codeaurora.org,
	davem@davemloft.net, kuba@kernel.org, sharathv@codeaurora.org,
	evgreen@chromium.org, cpratapa@codeaurora.org, elder@kernel.org,
	netdev@vger.kernel.org, linux-kernel@vger.kernel.org
Subject: Re: [PATCH net-next 4/6] net: qualcomm: rmnet: use field masks instead of C bit-fields
Date: Thu, 4 Mar 2021 22:50:14 -0600	[thread overview]
Message-ID: <YEG4hmm4azZkbPUw@builder.lan> (raw)
In-Reply-To: <20210304223431.15045-5-elder@linaro.org>

On Thu 04 Mar 16:34 CST 2021, Alex Elder wrote:

> The actual layout of bits defined in C bit-fields (e.g. int foo : 3)
> is implementation-defined.  Structures defined in <linux/if_rmnet.h>
> address this by specifying all bit-fields twice, to cover two
> possible layouts.
> 
> I think this pattern is repetitive and noisy, and I find the whole
> notion of compiler "bitfield endianness" to be non-intuitive.
> 
> Stop using C bit-fields for the command/data flag and the pad length
> fields in the rmnet_map structure.  Instead, define a single-byte
> flags field, and use the functions defined in <linux/bitfield.h>,
> along with field mask constants to extract or assign values within
> that field.
> 

Reviewed-by: Bjorn Andersson <bjorn.andersson@linaro.org>

Regards,
Bjorn

> Signed-off-by: Alex Elder <elder@linaro.org>
> ---
>  .../ethernet/qualcomm/rmnet/rmnet_handlers.c  |  5 ++--
>  .../ethernet/qualcomm/rmnet/rmnet_map_data.c  |  4 +++-
>  include/linux/if_rmnet.h                      | 23 ++++++++-----------
>  3 files changed, 16 insertions(+), 16 deletions(-)
> 
> diff --git a/drivers/net/ethernet/qualcomm/rmnet/rmnet_handlers.c b/drivers/net/ethernet/qualcomm/rmnet/rmnet_handlers.c
> index 2a6b2a609884c..30f8e2f02696b 100644
> --- a/drivers/net/ethernet/qualcomm/rmnet/rmnet_handlers.c
> +++ b/drivers/net/ethernet/qualcomm/rmnet/rmnet_handlers.c
> @@ -4,6 +4,7 @@
>   * RMNET Data ingress/egress handler
>   */
>  
> +#include <linux/bitfield.h>
>  #include <linux/netdevice.h>
>  #include <linux/netdev_features.h>
>  #include <linux/if_arp.h>
> @@ -61,7 +62,7 @@ __rmnet_map_ingress_handler(struct sk_buff *skb,
>  	u16 len, pad;
>  	u8 mux_id;
>  
> -	if (map_header->cd_bit) {
> +	if (u8_get_bits(map_header->flags, MAP_CMD_FMASK)) {
>  		/* Packet contains a MAP command (not data) */
>  		if (port->data_format & RMNET_FLAGS_INGRESS_MAP_COMMANDS)
>  			return rmnet_map_command(skb, port);
> @@ -70,7 +71,7 @@ __rmnet_map_ingress_handler(struct sk_buff *skb,
>  	}
>  
>  	mux_id = map_header->mux_id;
> -	pad = map_header->pad_len;
> +	pad = u8_get_bits(map_header->flags, MAP_PAD_LEN_FMASK);
>  	len = ntohs(map_header->pkt_len) - pad;
>  
>  	if (mux_id >= RMNET_MAX_LOGICAL_EP)
> diff --git a/drivers/net/ethernet/qualcomm/rmnet/rmnet_map_data.c b/drivers/net/ethernet/qualcomm/rmnet/rmnet_map_data.c
> index fd55269c2ce3c..3291f252d81b0 100644
> --- a/drivers/net/ethernet/qualcomm/rmnet/rmnet_map_data.c
> +++ b/drivers/net/ethernet/qualcomm/rmnet/rmnet_map_data.c
> @@ -4,6 +4,7 @@
>   * RMNET Data MAP protocol
>   */
>  
> +#include <linux/bitfield.h>
>  #include <linux/netdevice.h>
>  #include <linux/ip.h>
>  #include <linux/ipv6.h>
> @@ -299,7 +300,8 @@ struct rmnet_map_header *rmnet_map_add_map_header(struct sk_buff *skb,
>  
>  done:
>  	map_header->pkt_len = htons(map_datalen + padding);
> -	map_header->pad_len = padding & 0x3F;
> +	/* This is a data packet, so the CMD bit is 0 */
> +	map_header->flags = u8_encode_bits(padding, MAP_PAD_LEN_FMASK);
>  
>  	return map_header;
>  }
> diff --git a/include/linux/if_rmnet.h b/include/linux/if_rmnet.h
> index 8c7845baf3837..4824c6328a82c 100644
> --- a/include/linux/if_rmnet.h
> +++ b/include/linux/if_rmnet.h
> @@ -6,21 +6,18 @@
>  #define _LINUX_IF_RMNET_H_
>  
>  struct rmnet_map_header {
> -#if defined(__LITTLE_ENDIAN_BITFIELD)
> -	u8  pad_len:6;
> -	u8  reserved_bit:1;
> -	u8  cd_bit:1;
> -#elif defined (__BIG_ENDIAN_BITFIELD)
> -	u8  cd_bit:1;
> -	u8  reserved_bit:1;
> -	u8  pad_len:6;
> -#else
> -#error	"Please fix <asm/byteorder.h>"
> -#endif
> -	u8  mux_id;
> -	__be16 pkt_len;
> +	u8 flags;			/* MAP_*_FMASK */
> +	u8 mux_id;
> +	__be16 pkt_len;			/* Length of packet, including pad */
>  }  __aligned(1);
>  
> +/* rmnet_map_header flags field:
> + *  CMD:	1 = packet contains a MAP command; 0 = packet contains data
> + *  PAD_LEN:	number of pad bytes following packet data
> + */
> +#define MAP_CMD_FMASK			GENMASK(7, 7)
> +#define MAP_PAD_LEN_FMASK		GENMASK(5, 0)
> +
>  struct rmnet_map_dl_csum_trailer {
>  	u8  reserved1;
>  #if defined(__LITTLE_ENDIAN_BITFIELD)
> -- 
> 2.20.1
> 

  reply	other threads:[~2021-03-05  4:50 UTC|newest]

Thread overview: 22+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-03-04 22:34 [PATCH net-next 0/6] net: qualcomm: rmnet: stop using C bit-fields Alex Elder
2021-03-04 22:34 ` [PATCH net-next 1/6] net: qualcomm: rmnet: mark trailer field endianness Alex Elder
2021-03-05  4:03   ` Bjorn Andersson
2021-03-04 22:34 ` [PATCH net-next 2/6] net: qualcomm: rmnet: simplify some byte order logic Alex Elder
2021-03-05  4:07   ` Bjorn Andersson
2021-03-05 21:02     ` Alex Elder
2021-03-04 22:34 ` [PATCH net-next 3/6] net: qualcomm: rmnet: kill RMNET_MAP_GET_*() accessor macros Alex Elder
2021-03-05  4:16   ` Bjorn Andersson
2021-03-04 22:34 ` [PATCH net-next 4/6] net: qualcomm: rmnet: use field masks instead of C bit-fields Alex Elder
2021-03-05  4:50   ` Bjorn Andersson [this message]
2021-03-04 22:34 ` [PATCH net-next 5/6] net: qualcomm: rmnet: don't use C bit-fields in rmnet checksum trailer Alex Elder
2021-03-05  4:54   ` Bjorn Andersson
2021-03-04 22:34 ` [PATCH net-next 6/6] net: qualcomm: rmnet: don't use C bit-fields in rmnet checksum header Alex Elder
2021-03-05  5:26   ` Bjorn Andersson
2021-03-05 20:48     ` Alex Elder
2021-03-05  6:22   ` kernel test robot
2021-03-05  6:22     ` kernel test robot
2021-03-05 12:59     ` Alex Elder
2021-03-05 12:59       ` Alex Elder
2021-03-04 22:43 ` [PATCH net-next 0/6] net: qualcomm: rmnet: stop using C bit-fields Alex Elder
2021-03-05  3:44 ` subashab
2021-03-05  4:51   ` Alex Elder

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=YEG4hmm4azZkbPUw@builder.lan \
    --to=bjorn.andersson@linaro.org \
    --cc=cpratapa@codeaurora.org \
    --cc=davem@davemloft.net \
    --cc=elder@kernel.org \
    --cc=elder@linaro.org \
    --cc=evgreen@chromium.org \
    --cc=kuba@kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=netdev@vger.kernel.org \
    --cc=sharathv@codeaurora.org \
    --cc=stranche@codeaurora.org \
    --cc=subashab@codeaurora.org \
    /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.