[dpdk-dev] [PATCH v2] net: adjust the header length parse size

Stephen Hemminger stephen at networkplumber.org
Sat Sep 5 18:56:27 CEST 2020


On Sat,  5 Sep 2020 11:06:46 +0800
Haiyue Wang <haiyue.wang at intel.com> wrote:

> Align to the rte_mbuf's design about Tx header length data size for the
> header length parse result.
> 	struct {
> 		uint64_t   l2_len:7;             /*    88: 0  8 */
> 		uint64_t   l3_len:9;             /*    88: 7  8 */
> 		uint64_t   l4_len:8;             /*    88:16  8 */
> 		uint64_t   tso_segsz:16;         /*    88:24  8 */
> 		uint64_t   outer_l3_len:9;       /*    88:40  8 */
> 		uint64_t   outer_l2_len:7;       /*    88:49  8 */
> 	};
> 
> Now the IPv6 can support bigger extension header.
> 
> The below is the structure hole analysis result:
> 
> Before:
> struct rte_net_hdr_lens {
>         uint8_t                    l2_len;               /*     0     1 */
>         uint8_t                    l3_len;               /*     1     1 */
>         uint8_t                    l4_len;               /*     2     1 */
>         uint8_t                    tunnel_len;           /*     3     1 */
>         uint8_t                    inner_l2_len;         /*     4     1 */
>         uint8_t                    inner_l3_len;         /*     5     1 */
>         uint8_t                    inner_l4_len;         /*     6     1 */
> 
>         /* size: 7, cachelines: 1, members: 7 */
>         /* last cacheline: 7 bytes */
> };
> 
> Now:
> struct rte_net_hdr_lens {
>         uint64_t                   l2_len:7;             /*     0: 0  8 */
>         uint64_t                   l3_len:9;             /*     0: 7  8 */
>         uint64_t                   l4_len:8;             /*     0:16  8 */
>         uint64_t                   tunnel_len:8;         /*     0:24  8 */
>         uint64_t                   inner_l2_len:7;       /*     0:32  8 */
>         uint64_t                   inner_l3_len:9;       /*     0:39  8 */
>         uint64_t                   inner_l4_len:8;       /*     0:48  8 */
> 
>         /* size: 8, cachelines: 1, members: 7 */
>         /* bit_padding: 8 bits */
>         /* last cacheline: 8 bytes */
> };
> 
> Signed-off-by: Haiyue Wang <haiyue.wang at intel.com>

Bitfields are slow to access, compiler has to do mask/shift operations.
And there is no requirement that structure be the same size.

There is no requirement that fields be ordered the same as
the protocol header. Also tunnel length might get big.
Why not:

struct rte_net_hdr_lens {
	uint8_t l2_len;
	uint8_t inner_l2_len;
	uint16_t l3_len;
	uint16_t inner_l3_len;
	uint16_t tunnel_len;
	uint8_t l4_len;
	uint8_t inner_l4_len;
};




More information about the dev mailing list