[dpdk-dev,v6,1/9] librte_mbuf:the rte_mbuf structure changes

Message ID 1413881168-20239-2-git-send-email-jijiang.liu@intel.com (mailing list archive)
State Changes Requested, archived
Headers

Commit Message

Jijiang Liu Oct. 21, 2014, 8:46 a.m. UTC
  Remove the "reserved2" field and add the "packet_type" and the "inner_l2_l3_len" fields in the rte_mbuf structure.

The packet type field is used to indicate ordinary L2 packet format and also tunneling packet format such as IP in IP,
IP in GRE, MAC in GRE and MAC in UDP.

The inner L2 length and the inner L3 length are used for TX offloading of tunneling packet.
 
Signed-off-by: Jijiang Liu <jijiang.liu@intel.com>
Acked-by: Helin Zhang <helin.zhang@intel.com>
Acked-by: Jingjing Wu <jingjing.wu@intel.com>
---
 lib/librte_mbuf/rte_mbuf.h |   25 ++++++++++++++++++++++++-
 1 files changed, 24 insertions(+), 1 deletions(-)
  

Comments

Thomas Monjalon Oct. 21, 2014, 10:26 a.m. UTC | #1
Hi Jijiang,

2014-10-21 16:46, Jijiang Liu:
> Remove the "reserved2" field and add the "packet_type"

"Remove and add" can be said "Replace".

> and the "inner_l2_l3_len" fields in the rte_mbuf structure.

Please explain that you are using 2 bytes of the second cache line
for TX offloading of tunnels.

>  	/* remaining bytes are set on RX when pulling packet from descriptor */
>  	MARKER rx_descriptor_fields1;
> -	uint16_t reserved2;       /**< Unused field. Required for padding */
> +
> +	/**
> +	 * Packet type, which is used to indicate ordinary L2 packet format and
> +	 * also tunneled packet format such as IP in IP, IP in GRE, MAC in GRE
> +	 * and MAC in UDP.
> +	 */
> +	uint16_t packet_type;

Why not name it "l2_type"?
  
Jijiang Liu Oct. 21, 2014, 2:14 p.m. UTC | #2
> -----Original Message-----
> From: Thomas Monjalon [mailto:thomas.monjalon@6wind.com]
> Sent: Tuesday, October 21, 2014 6:26 PM
> To: Liu, Jijiang
> Cc: dev@dpdk.org
> Subject: Re: [dpdk-dev] [PATCH v6 1/9] librte_mbuf:the rte_mbuf structure
> changes
> 
> Hi Jijiang,
> 
> 2014-10-21 16:46, Jijiang Liu:
> > Remove the "reserved2" field and add the "packet_type"
> 
> "Remove and add" can be said "Replace".
> 
> > and the "inner_l2_l3_len" fields in the rte_mbuf structure.
> 
> Please explain that you are using 2 bytes of the second cache line for TX
> offloading of tunnels.
> 
> >  	/* remaining bytes are set on RX when pulling packet from descriptor
> */
> >  	MARKER rx_descriptor_fields1;
> > -	uint16_t reserved2;       /**< Unused field. Required for padding */
> > +
> > +	/**
> > +	 * Packet type, which is used to indicate ordinary L2 packet format
> and
> > +	 * also tunneled packet format such as IP in IP, IP in GRE, MAC in GRE
> > +	 * and MAC in UDP.
> > +	 */
> > +	uint16_t packet_type;
> 
> Why not name it "l2_type"?

In datasheet, this term is called packet type(s).
Personally , I think packet type is  more clear what meaning of this field is . ^_^

> --
> Thomas
  
Thomas Monjalon Oct. 22, 2014, 8:45 a.m. UTC | #3
2014-10-21 14:14, Liu, Jijiang:
> From: Thomas Monjalon [mailto:thomas.monjalon@6wind.com]
> > 2014-10-21 16:46, Jijiang Liu:
> > > -	uint16_t reserved2;       /**< Unused field. Required for padding */
> > > +
> > > +	/**
> > > +	 * Packet type, which is used to indicate ordinary L2 packet format and
> > > +	 * also tunneled packet format such as IP in IP, IP in GRE, MAC in GRE
> > > +	 * and MAC in UDP.
> > > +	 */
> > > +	uint16_t packet_type;
> > 
> > Why not name it "l2_type"?
> 
> In datasheet, this term is called packet type(s).

That's exactly the point I want you really understand!
This is a field in generic mbuf structure, so your datasheet has no value here.

> Personally , I think packet type is  more clear what meaning of this field is . ^_^

You cannot add an API field without knowing what will be its generic meaning.
Please think about it and describe its scope.

Thanks
  
Jijiang Liu Oct. 22, 2014, 8:53 a.m. UTC | #4
> -----Original Message-----
> From: Thomas Monjalon [mailto:thomas.monjalon@6wind.com]
> Sent: Wednesday, October 22, 2014 4:46 PM
> To: Liu, Jijiang
> Cc: dev@dpdk.org
> Subject: Re: [dpdk-dev] [PATCH v6 1/9] librte_mbuf:the rte_mbuf structure
> changes
> 
> 2014-10-21 14:14, Liu, Jijiang:
> > From: Thomas Monjalon [mailto:thomas.monjalon@6wind.com]
> > > 2014-10-21 16:46, Jijiang Liu:
> > > > -	uint16_t reserved2;       /**< Unused field. Required for padding */
> > > > +
> > > > +	/**
> > > > +	 * Packet type, which is used to indicate ordinary L2 packet format
> and
> > > > +	 * also tunneled packet format such as IP in IP, IP in GRE, MAC in GRE
> > > > +	 * and MAC in UDP.
> > > > +	 */
> > > > +	uint16_t packet_type;
> > >
> > > Why not name it "l2_type"?
> >
> > In datasheet, this term is called packet type(s).
> 
> That's exactly the point I want you really understand!
> This is a field in generic mbuf structure, so your datasheet has no value here.
> 
> > Personally , I think packet type is  more clear what meaning of this field is .
> ^_^
> 
> You cannot add an API field without knowing what will be its generic
> meaning.
> Please think about it and describe its scope.
 its generic meaning is that each UNIT  number stand for a kind of packet format。
I will add more description for this field.


> Thanks
> --
> Thomas
  
Zhang, Helin Oct. 23, 2014, 2:23 a.m. UTC | #5
Hi

> -----Original Message-----
> From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Thomas Monjalon
> Sent: Wednesday, October 22, 2014 4:46 PM
> To: Liu, Jijiang
> Cc: dev@dpdk.org
> Subject: Re: [dpdk-dev] [PATCH v6 1/9] librte_mbuf:the rte_mbuf structure
> changes
> 
> 2014-10-21 14:14, Liu, Jijiang:
> > From: Thomas Monjalon [mailto:thomas.monjalon@6wind.com]
> > > 2014-10-21 16:46, Jijiang Liu:
> > > > -	uint16_t reserved2;       /**< Unused field. Required for padding
> */
> > > > +
> > > > +	/**
> > > > +	 * Packet type, which is used to indicate ordinary L2 packet format
> and
> > > > +	 * also tunneled packet format such as IP in IP, IP in GRE, MAC in GRE
> > > > +	 * and MAC in UDP.
> > > > +	 */
> > > > +	uint16_t packet_type;
> > >
> > > Why not name it "l2_type"?
'packet_type' is for storing the hardware identified packet type upon different layers
of protocols (l2, l3, l4, ...).
It is quite useful for user application or middle layer software stacks, it can know
what the packet type is without checking the packet too much by software.
Actually ixgbe already has packet types (less than 10), which is transcoded into 'ol_flags'.
For i40e, the packet type can represent about 256 types of packet, 'ol_flags' does not
have enough bits for it anymore. So put the i40e packet types into mbuf would be better.
Also this field can be used for NON-Intel NICs, I think there must be the similar concepts
of other NICs. And 16 bits 'packet_type' has severl reserved bits for future and NON-Intel NICs.

> >
> > In datasheet, this term is called packet type(s).
> 
> That's exactly the point I want you really understand!
> This is a field in generic mbuf structure, so your datasheet has no value here.
> 
> > Personally , I think packet type is  more clear what meaning of this field is .
> ^_^
> 
> You cannot add an API field without knowing what will be its generic meaning.
> Please think about it and describe its scope.
> 
> Thanks
> --
> Thomas

Regards,
Helin
  
Thomas Monjalon Nov. 12, 2014, 1:26 p.m. UTC | #6
Hi guys,

We still have some problems with the mbuf changes introduced for VXLAN.
I want to raise the packet type issue here.

2014-10-23 02:23, Zhang, Helin:
> From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Thomas Monjalon
> > 2014-10-21 14:14, Liu, Jijiang:
> > > From: Thomas Monjalon [mailto:thomas.monjalon@6wind.com]
> > > > 2014-10-21 16:46, Jijiang Liu:
> > > > > -	uint16_t reserved2;       /**< Unused field. Required for padding */
> > > > > +
> > > > > +	/**
> > > > > +	 * Packet type, which is used to indicate ordinary L2 packet format and
> > > > > +	 * also tunneled packet format such as IP in IP, IP in GRE, MAC in GRE
> > > > > +	 * and MAC in UDP.
> > > > > +	 */
> > > > > +	uint16_t packet_type;
> > > >
> > > > Why not name it "l2_type"?
> 
> 'packet_type' is for storing the hardware identified packet type upon different layers
> of protocols (l2, l3, l4, ...).
> It is quite useful for user application or middle layer software stacks, it can know
> what the packet type is without checking the packet too much by software.
> Actually ixgbe already has packet types (less than 10), which is transcoded into 'ol_flags'.
> For i40e, the packet type can represent about 256 types of packet, 'ol_flags' does not
> have enough bits for it anymore. So put the i40e packet types into mbuf would be better.
> Also this field can be used for NON-Intel NICs, I think there must be the similar concepts
> of other NICs. And 16 bits 'packet_type' has severl reserved bits for future and NON-Intel NICs.

Thanks Helin, that's the best description of packet_type I've seen so far.
It's not so clear in the commit log:
	http://dpdk.org/browse/dpdk/commit/?id=73b7d59cf4f6faf

> > > In datasheet, this term is called packet type(s).
> > 
> > That's exactly the point I want you really understand!
> > This is a field in generic mbuf structure, so your datasheet has no value here.
> > 
> > > Personally , I think packet type is  more clear what meaning of this field is .
> > 
> > You cannot add an API field without knowing what will be its generic meaning.
> > Please think about it and describe its scope.

I integrated this patch with the VXLAN patchset in the hope that you'll
improve the situation afterwards.
This is the answer you recently gave to Olivier:
	http://dpdk.org/ml/archives/dev/2014-November/007599.html
"
	Regarding adding a packet_type in mbuf, we ever had a lot of discussions as follows:
	http://dpdk.org/ml/archives/dev/2014-October/007027.html
	http://dpdk.org/ml/archives/dev/2014-September/005240.html
	http://dpdk.org/ml/archives/dev/2014-September/005241.html
	http://dpdk.org/ml/archives/dev/2014-September/005274.html
"

To sum up the situation:
- We don't know what are the possible values of packet_type
- It's only filled by i40e, while other drivers use ol_flags
- There is no special value "unknown" which should be set by drivers
  not supporting this feature.
- Its only usage is to print a decimal value in app/test-pmd/rxonly.c

It's now clear that nobody cares about this part of the API.
So I'm going to remove packet_type from mbuf.
I don't want to keep something that we don't know how to use, that is
not consistent across drivers, and that overlap another API part (ol_flags).
  
Zhang, Helin Nov. 12, 2014, 2:31 p.m. UTC | #7
> -----Original Message-----
> From: Thomas Monjalon [mailto:thomas.monjalon@6wind.com]
> Sent: Wednesday, November 12, 2014 9:26 PM
> To: Liu, Jijiang
> Cc: Zhang, Helin; dev@dpdk.org; Richardson, Bruce
> Subject: Re: [dpdk-dev] [PATCH v6 1/9] librte_mbuf:the rte_mbuf structure
> changes
> 
> Hi guys,
> 
> We still have some problems with the mbuf changes introduced for VXLAN.
> I want to raise the packet type issue here.
> 
> 2014-10-23 02:23, Zhang, Helin:
> > From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Thomas Monjalon
> > > 2014-10-21 14:14, Liu, Jijiang:
> > > > From: Thomas Monjalon [mailto:thomas.monjalon@6wind.com]
> > > > > 2014-10-21 16:46, Jijiang Liu:
> > > > > > -	uint16_t reserved2;       /**< Unused field. Required for padding */
> > > > > > +
> > > > > > +	/**
> > > > > > +	 * Packet type, which is used to indicate ordinary L2 packet
> format and
> > > > > > +	 * also tunneled packet format such as IP in IP, IP in GRE, MAC in
> GRE
> > > > > > +	 * and MAC in UDP.
> > > > > > +	 */
> > > > > > +	uint16_t packet_type;
> > > > >
> > > > > Why not name it "l2_type"?
> >
> > 'packet_type' is for storing the hardware identified packet type upon
> > different layers of protocols (l2, l3, l4, ...).
> > It is quite useful for user application or middle layer software
> > stacks, it can know what the packet type is without checking the packet too
> much by software.
> > Actually ixgbe already has packet types (less than 10), which is transcoded into
> 'ol_flags'.
> > For i40e, the packet type can represent about 256 types of packet,
> > 'ol_flags' does not have enough bits for it anymore. So put the i40e packet
> types into mbuf would be better.
> > Also this field can be used for NON-Intel NICs, I think there must be
> > the similar concepts of other NICs. And 16 bits 'packet_type' has severl
> reserved bits for future and NON-Intel NICs.
> 
> Thanks Helin, that's the best description of packet_type I've seen so far.
> It's not so clear in the commit log:
> 	http://dpdk.org/browse/dpdk/commit/?id=73b7d59cf4f6faf
> 
> > > > In datasheet, this term is called packet type(s).
> > >
> > > That's exactly the point I want you really understand!
> > > This is a field in generic mbuf structure, so your datasheet has no value here.
> > >
> > > > Personally , I think packet type is  more clear what meaning of this field is .
> > >
> > > You cannot add an API field without knowing what will be its generic meaning.
> > > Please think about it and describe its scope.
> 
> I integrated this patch with the VXLAN patchset in the hope that you'll improve
> the situation afterwards.
> This is the answer you recently gave to Olivier:
> 	http://dpdk.org/ml/archives/dev/2014-November/007599.html
> "
> 	Regarding adding a packet_type in mbuf, we ever had a lot of discussions as
> follows:
> 	http://dpdk.org/ml/archives/dev/2014-October/007027.html
> 	http://dpdk.org/ml/archives/dev/2014-September/005240.html
> 	http://dpdk.org/ml/archives/dev/2014-September/005241.html
> 	http://dpdk.org/ml/archives/dev/2014-September/005274.html
> "
> 
> To sum up the situation:
> - We don't know what are the possible values of packet_type
> - It's only filled by i40e, while other drivers use ol_flags
> - There is no special value "unknown" which should be set by drivers
>   not supporting this feature.
> - Its only usage is to print a decimal value in app/test-pmd/rxonly.c
Though I haven't investigate this too much, my opinion is that we should
use packet_type in the future, and rework igb/ixgbe PMD to remove all
packet types in ol_flags and use packet_type instead.
Then example app can use the packet type directly. And all igb, ixgbe and
i40e packet_type are consistent. Sure we might need to define all packet
types in rte_ethdev.h or similar header files.

> 
> It's now clear that nobody cares about this part of the API.
> So I'm going to remove packet_type from mbuf.
> I don't want to keep something that we don't know how to use, that is not
> consistent across drivers, and that overlap another API part (ol_flags).
> 
> --
> Thomas

Regards,
Helin
  
Thomas Monjalon Nov. 12, 2014, 3:23 p.m. UTC | #8
2014-11-12 14:31, Zhang, Helin:
> > 2014-10-23 02:23, Zhang, Helin:
> > > From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Thomas Monjalon
> > > > 2014-10-21 14:14, Liu, Jijiang:
> > > > > From: Thomas Monjalon [mailto:thomas.monjalon@6wind.com]
> > > > > > 2014-10-21 16:46, Jijiang Liu:
> > > > > > > +	uint16_t packet_type;
> > > > > >
> > > > > > Why not name it "l2_type"?
> > >
> > > 'packet_type' is for storing the hardware identified packet type upon
> > > different layers of protocols (l2, l3, l4, ...).
> > > It is quite useful for user application or middle layer software
> > > stacks, it can know what the packet type is without checking the packet too
> > much by software.
> > > Actually ixgbe already has packet types (less than 10), which is transcoded into
> > 'ol_flags'.
> > > For i40e, the packet type can represent about 256 types of packet,
> > > 'ol_flags' does not have enough bits for it anymore. So put the i40e packet
> > types into mbuf would be better.
> > > Also this field can be used for NON-Intel NICs, I think there must be
> > > the similar concepts of other NICs. And 16 bits 'packet_type' has severl
> > reserved bits for future and NON-Intel NICs.
> > 
> > Thanks Helin, that's the best description of packet_type I've seen so far.
> > It's not so clear in the commit log:
> > 	http://dpdk.org/browse/dpdk/commit/?id=73b7d59cf4f6faf
> > 
> > > > > In datasheet, this term is called packet type(s).
> > > >
> > > > That's exactly the point I want you really understand!
> > > > This is a field in generic mbuf structure, so your datasheet has no value here.
> > > >
> > > > > Personally , I think packet type is  more clear what meaning of this field is .
> > > >
> > > > You cannot add an API field without knowing what will be its generic meaning.
> > > > Please think about it and describe its scope.
> > 
> > I integrated this patch with the VXLAN patchset in the hope that you'll improve
> > the situation afterwards.
> > This is the answer you recently gave to Olivier:
> > 	http://dpdk.org/ml/archives/dev/2014-November/007599.html
> > "
> > 	Regarding adding a packet_type in mbuf, we ever had a lot of discussions as
> > follows:
> > 	http://dpdk.org/ml/archives/dev/2014-October/007027.html
> > 	http://dpdk.org/ml/archives/dev/2014-September/005240.html
> > 	http://dpdk.org/ml/archives/dev/2014-September/005241.html
> > 	http://dpdk.org/ml/archives/dev/2014-September/005274.html
> > "
> > 
> > To sum up the situation:
> > - We don't know what are the possible values of packet_type
> > - It's only filled by i40e, while other drivers use ol_flags
> > - There is no special value "unknown" which should be set by drivers
> >   not supporting this feature.
> > - Its only usage is to print a decimal value in app/test-pmd/rxonly.c
> 
> Though I haven't investigate this too much, my opinion is that we should
> use packet_type in the future, and rework igb/ixgbe PMD to remove all
> packet types in ol_flags and use packet_type instead.
> Then example app can use the packet type directly. And all igb, ixgbe and
> i40e packet_type are consistent. Sure we might need to define all packet
> types in rte_ethdev.h or similar header files.

Exact!

> > It's now clear that nobody cares about this part of the API.
> > So I'm going to remove packet_type from mbuf.
> > I don't want to keep something that we don't know how to use, that is not
> > consistent across drivers, and that overlap another API part (ol_flags).

Helin, I feel you perfectly understood the problem.
As the responsible of i40e, you can make a choice for 1.8 release:
- remove (incomplete) packet_type
- or complete it quickly

Thanks
  
Jijiang Liu Nov. 13, 2014, 3:17 a.m. UTC | #9
> -----Original Message-----
> From: Thomas Monjalon [mailto:thomas.monjalon@6wind.com]
> Sent: Wednesday, November 12, 2014 9:26 PM
> To: Liu, Jijiang
> Cc: Zhang, Helin; dev@dpdk.org; Richardson, Bruce
> Subject: Re: [dpdk-dev] [PATCH v6 1/9] librte_mbuf:the rte_mbuf structure
> changes
> 
> Hi guys,
> 
> We still have some problems with the mbuf changes introduced for VXLAN.
> I want to raise the packet type issue here.
> 
> 2014-10-23 02:23, Zhang, Helin:
> > From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Thomas Monjalon
> > > 2014-10-21 14:14, Liu, Jijiang:
> > > > From: Thomas Monjalon [mailto:thomas.monjalon@6wind.com]
> > > > > 2014-10-21 16:46, Jijiang Liu:
> > > > > > -	uint16_t reserved2;       /**< Unused field. Required for padding
> */
> > > > > > +
> > > > > > +	/**
> > > > > > +	 * Packet type, which is used to indicate ordinary L2 packet
> format and
> > > > > > +	 * also tunneled packet format such as IP in IP, IP in GRE, MAC in
> GRE
> > > > > > +	 * and MAC in UDP.
> > > > > > +	 */
> > > > > > +	uint16_t packet_type;
> > > > >
> > > > > Why not name it "l2_type"?
> >
> > 'packet_type' is for storing the hardware identified packet type upon
> > different layers of protocols (l2, l3, l4, ...).
> > It is quite useful for user application or middle layer software
> > stacks, it can know what the packet type is without checking the packet too
> much by software.
> > Actually ixgbe already has packet types (less than 10), which is transcoded into
> 'ol_flags'.
> > For i40e, the packet type can represent about 256 types of packet,
> > 'ol_flags' does not have enough bits for it anymore. So put the i40e packet types
> into mbuf would be better.
> > Also this field can be used for NON-Intel NICs, I think there must be
> > the similar concepts of other NICs. And 16 bits 'packet_type' has severl
> reserved bits for future and NON-Intel NICs.
> 
> Thanks Helin, that's the best description of packet_type I've seen so far.
> It's not so clear in the commit log:
> 	http://dpdk.org/browse/dpdk/commit/?id=73b7d59cf4f6faf
> 
> > > > In datasheet, this term is called packet type(s).
> > >
> > > That's exactly the point I want you really understand!
> > > This is a field in generic mbuf structure, so your datasheet has no value here.
> > >
> > > > Personally , I think packet type is  more clear what meaning of this field is .
> > >
> > > You cannot add an API field without knowing what will be its generic meaning.
> > > Please think about it and describe its scope.
> 
> I integrated this patch with the VXLAN patchset in the hope that you'll improve
> the situation afterwards.
> This is the answer you recently gave to Olivier:
> 	http://dpdk.org/ml/archives/dev/2014-November/007599.html
> "
> 	Regarding adding a packet_type in mbuf, we ever had a lot of discussions
> as follows:
> 	http://dpdk.org/ml/archives/dev/2014-October/007027.html
> 	http://dpdk.org/ml/archives/dev/2014-September/005240.html
> 	http://dpdk.org/ml/archives/dev/2014-September/005241.html
> 	http://dpdk.org/ml/archives/dev/2014-September/005274.html
> "
> 
> To sum up the situation:
> - We don't know what are the possible values of packet_type
> - It's only filled by i40e, while other drivers use ol_flags
> - There is no special value "unknown" which should be set by drivers
>   not supporting this feature.
> - Its only usage is to print a decimal value in app/test-pmd/rxonly.c
> 
> It's now clear that nobody cares about this part of the API.
> So I'm going to remove packet_type from mbuf.
> I don't want to keep something that we don't know how to use, that is not
> consistent across drivers, and that overlap another API part (ol_flags).

The packet type in 40e is very important for user, using packet type can help to speed up packet analysis/identification in their application, especially tunneling packet format.
Now I'm working on implementing packet type definition in rte_ethdev.h file and  translation table in i40e, which is almost done. 
The packet type  definition in in rte_ethdev.h file like below. 
/*
 * Ethernet packet type
 */
enum rte_eth_ptype {
        /* undefined packet type, means HW can't recognise it */
        RTE_PTYPE_UNDEF = 0,
...

        /* IPv4 --> GRE/Teredo/VXLAN --> MAC --> IPv4 */
        RTE_PTYPE_IPv4_GRENAT_MAC_IPv4FRAG_PAY3,
        RTE_PTYPE_IPv4_GRENAT_MAC_IPv4_PAY3,
        RTE_PTYPE_IPv4_GRENAT_MAC_IPv4_UDP_PAY4,
        RTE_PTYPE_IPv4_GRENAT_MAC_IPv4_TCP_PAY4,
        RTE_PTYPE_IPv4_GRENAT_MAC_IPv4_SCTP_PAY4,
        RTE_PTYPE_IPv4_GRENAT_MAC_IPv4_ICMP_PAY4,
 
        /* IPv4 --> GRE/Teredo/VXLAN --> MAC --> IPv6 */
        RTE_PTYPE_IPv4_GRENAT_MAC_IPv6FRAG_PAY3
        RTE_PTYPE_IPv4_GRENAT_MAC_IPv6_PAY3,
        RTE_PTYPE_IPv4_GRENAT_MAC_IPv6_UDP_PAY4,
        RTE_PTYPE_IPv4_GRENAT_MAC_IPv6_TCP_PAY4,
        RTE_PTYPE_IPv4_GRENAT_MAC_IPv6_SCTP_PAY4,
        RTE_PTYPE_IPv4_GRENAT_MAC_IPv6_ICMP_PAY4,
 
        /* IPv4 --> GRE/Teredo/VXLAN --> MAC/VLAN */
        RTE_PTYPE_IPv4_GRENAT_MACVLAN_PAY3,
... 
}

Yes, we don't use packet type in many places now, which doesn't mean we don't use it  in the future( when supporting another tunneling packet).

It is ok for me if you want to remove the packet_type filed in mbuf,  but we will send a separate patch set for introducing packet type in the future, which includes 1g/10/40g PMD changes.

> --
> Thomas
  
Thomas Monjalon Nov. 13, 2014, 8:53 a.m. UTC | #10
2014-11-13 03:17, Liu, Jijiang:
> From: Thomas Monjalon [mailto:thomas.monjalon@6wind.com]
> > 2014-10-23 02:23, Zhang, Helin:
> > > From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Thomas Monjalon
> > > > 2014-10-21 14:14, Liu, Jijiang:
> > > > > From: Thomas Monjalon [mailto:thomas.monjalon@6wind.com]
> > > > > > 2014-10-21 16:46, Jijiang Liu:
> > > > > > > +	uint16_t packet_type;
> > > > > >
> > > > > > Why not name it "l2_type"?
> > >
> > > 'packet_type' is for storing the hardware identified packet type upon
> > > different layers of protocols (l2, l3, l4, ...).
> > > It is quite useful for user application or middle layer software
> > > stacks, it can know what the packet type is without checking the packet too
> > much by software.
> > > Actually ixgbe already has packet types (less than 10), which is transcoded into
> > 'ol_flags'.
> > > For i40e, the packet type can represent about 256 types of packet,
> > > 'ol_flags' does not have enough bits for it anymore. So put the i40e packet types
> > into mbuf would be better.
> > > Also this field can be used for NON-Intel NICs, I think there must be
> > > the similar concepts of other NICs. And 16 bits 'packet_type' has severl
> > reserved bits for future and NON-Intel NICs.
> > 
> > Thanks Helin, that's the best description of packet_type I've seen so far.
> > It's not so clear in the commit log:
> > 	http://dpdk.org/browse/dpdk/commit/?id=73b7d59cf4f6faf
> > 
> > > > > In datasheet, this term is called packet type(s).
> > > >
> > > > That's exactly the point I want you really understand!
> > > > This is a field in generic mbuf structure, so your datasheet has no value here.
> > > >
> > > > > Personally , I think packet type is  more clear what meaning of this field is .
> > > >
> > > > You cannot add an API field without knowing what will be its generic meaning.
> > > > Please think about it and describe its scope.
> > 
> > I integrated this patch with the VXLAN patchset in the hope that you'll improve
> > the situation afterwards.
> > This is the answer you recently gave to Olivier:
> > 	http://dpdk.org/ml/archives/dev/2014-November/007599.html
> > "
> > 	Regarding adding a packet_type in mbuf, we ever had a lot of discussions
> > as follows:
> > 	http://dpdk.org/ml/archives/dev/2014-October/007027.html
> > 	http://dpdk.org/ml/archives/dev/2014-September/005240.html
> > 	http://dpdk.org/ml/archives/dev/2014-September/005241.html
> > 	http://dpdk.org/ml/archives/dev/2014-September/005274.html
> > "
> > 
> > To sum up the situation:
> > - We don't know what are the possible values of packet_type
> > - It's only filled by i40e, while other drivers use ol_flags
> > - There is no special value "unknown" which should be set by drivers
> >   not supporting this feature.
> > - Its only usage is to print a decimal value in app/test-pmd/rxonly.c
> > 
> > It's now clear that nobody cares about this part of the API.
> > So I'm going to remove packet_type from mbuf.
> > I don't want to keep something that we don't know how to use, that is not
> > consistent across drivers, and that overlap another API part (ol_flags).
> 
> The packet type in 40e is very important for user, using packet type can
> help to speed up packet analysis/identification in their application,
> especially tunneling packet format.
> Now I'm working on implementing packet type definition in rte_ethdev.h
> file and  translation table in i40e, which is almost done. 
> The packet type  definition in in rte_ethdev.h file like below. 
> /*
>  * Ethernet packet type
>  */
> enum rte_eth_ptype {
>         /* undefined packet type, means HW can't recognise it */
>         RTE_PTYPE_UNDEF = 0,
> ...
> 
>         /* IPv4 --> GRE/Teredo/VXLAN --> MAC --> IPv4 */
>         RTE_PTYPE_IPv4_GRENAT_MAC_IPv4FRAG_PAY3,
>         RTE_PTYPE_IPv4_GRENAT_MAC_IPv4_PAY3,
>         RTE_PTYPE_IPv4_GRENAT_MAC_IPv4_UDP_PAY4,
>         RTE_PTYPE_IPv4_GRENAT_MAC_IPv4_TCP_PAY4,
>         RTE_PTYPE_IPv4_GRENAT_MAC_IPv4_SCTP_PAY4,
>         RTE_PTYPE_IPv4_GRENAT_MAC_IPv4_ICMP_PAY4,
>  
>         /* IPv4 --> GRE/Teredo/VXLAN --> MAC --> IPv6 */
>         RTE_PTYPE_IPv4_GRENAT_MAC_IPv6FRAG_PAY3
>         RTE_PTYPE_IPv4_GRENAT_MAC_IPv6_PAY3,
>         RTE_PTYPE_IPv4_GRENAT_MAC_IPv6_UDP_PAY4,
>         RTE_PTYPE_IPv4_GRENAT_MAC_IPv6_TCP_PAY4,
>         RTE_PTYPE_IPv4_GRENAT_MAC_IPv6_SCTP_PAY4,
>         RTE_PTYPE_IPv4_GRENAT_MAC_IPv6_ICMP_PAY4,
>  
>         /* IPv4 --> GRE/Teredo/VXLAN --> MAC/VLAN */
>         RTE_PTYPE_IPv4_GRENAT_MACVLAN_PAY3,
> ... 
> }

OK, it seems well abstracted.
I think the last part of these names (PAY3/PAY4) is useless.

When this patch for API and i40e will be ready?
I'd prefer fixing the API instead of removing it.

> Yes, we don't use packet type in many places now, which doesn't mean
> we don't use it  in the future (when supporting another tunneling packet).
> 
> It is ok for me if you want to remove the packet_type filed in mbuf,
> but we will send a separate patch set for introducing packet type in
> the future, which includes 1g/10/40g PMD changes.

When the patches for igb/ixgbe will be ready?

Thanks
  
Jijiang Liu Nov. 13, 2014, 11:24 a.m. UTC | #11
Hi, 

> -----Original Message-----
> From: Thomas Monjalon [mailto:thomas.monjalon@6wind.com]
> Sent: Thursday, November 13, 2014 4:53 PM
> To: Liu, Jijiang
> Cc: Zhang, Helin; dev@dpdk.org; Richardson, Bruce
> Subject: Re: [dpdk-dev] [PATCH v6 1/9] librte_mbuf:the rte_mbuf structure
> changes
> 
> 2014-11-13 03:17, Liu, Jijiang:
> > From: Thomas Monjalon [mailto:thomas.monjalon@6wind.com]
> > > 2014-10-23 02:23, Zhang, Helin:
> > > > From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Thomas
> > > > Monjalon
> > > > > 2014-10-21 14:14, Liu, Jijiang:
> > > > > > From: Thomas Monjalon [mailto:thomas.monjalon@6wind.com]
> > > > > > > 2014-10-21 16:46, Jijiang Liu:
> > > > > > > > +	uint16_t packet_type;
> > > > > > >
> > > > > > > Why not name it "l2_type"?
> > > >
> > > > 'packet_type' is for storing the hardware identified packet type
> > > > upon different layers of protocols (l2, l3, l4, ...).
> > > > It is quite useful for user application or middle layer software
> > > > stacks, it can know what the packet type is without checking the
> > > > packet too
> > > much by software.
> > > > Actually ixgbe already has packet types (less than 10), which is
> > > > transcoded into
> > > 'ol_flags'.
> > > > For i40e, the packet type can represent about 256 types of packet,
> > > > 'ol_flags' does not have enough bits for it anymore. So put the
> > > > i40e packet types
> > > into mbuf would be better.
> > > > Also this field can be used for NON-Intel NICs, I think there must
> > > > be the similar concepts of other NICs. And 16 bits 'packet_type'
> > > > has severl
> > > reserved bits for future and NON-Intel NICs.
> > >
> > > Thanks Helin, that's the best description of packet_type I've seen so far.
> > > It's not so clear in the commit log:
> > > 	http://dpdk.org/browse/dpdk/commit/?id=73b7d59cf4f6faf
> > >
> > > > > > In datasheet, this term is called packet type(s).
> > > > >
> > > > > That's exactly the point I want you really understand!
> > > > > This is a field in generic mbuf structure, so your datasheet has no value
> here.
> > > > >
> > > > > > Personally , I think packet type is  more clear what meaning of this field
> is .
> > > > >
> > > > > You cannot add an API field without knowing what will be its generic
> meaning.
> > > > > Please think about it and describe its scope.
> > >
> > > I integrated this patch with the VXLAN patchset in the hope that
> > > you'll improve the situation afterwards.
> > > This is the answer you recently gave to Olivier:
> > > 	http://dpdk.org/ml/archives/dev/2014-November/007599.html
> > > "
> > > 	Regarding adding a packet_type in mbuf, we ever had a lot of
> > > discussions as follows:
> > > 	http://dpdk.org/ml/archives/dev/2014-October/007027.html
> > > 	http://dpdk.org/ml/archives/dev/2014-September/005240.html
> > > 	http://dpdk.org/ml/archives/dev/2014-September/005241.html
> > > 	http://dpdk.org/ml/archives/dev/2014-September/005274.html
> > > "
> > >
> > > To sum up the situation:
> > > - We don't know what are the possible values of packet_type
> > > - It's only filled by i40e, while other drivers use ol_flags
> > > - There is no special value "unknown" which should be set by drivers
> > >   not supporting this feature.
> > > - Its only usage is to print a decimal value in
> > > app/test-pmd/rxonly.c
> > >
> > > It's now clear that nobody cares about this part of the API.
> > > So I'm going to remove packet_type from mbuf.
> > > I don't want to keep something that we don't know how to use, that
> > > is not consistent across drivers, and that overlap another API part (ol_flags).
> >
> > The packet type in 40e is very important for user, using packet type
> > can help to speed up packet analysis/identification in their
> > application, especially tunneling packet format.
> > Now I'm working on implementing packet type definition in rte_ethdev.h
> > file and  translation table in i40e, which is almost done.
> > The packet type  definition in in rte_ethdev.h file like below.
> > /*
> >  * Ethernet packet type
> >  */
> > enum rte_eth_ptype {
> >         /* undefined packet type, means HW can't recognise it */
> >         RTE_PTYPE_UNDEF = 0,
> > ...
> >
> >         /* IPv4 --> GRE/Teredo/VXLAN --> MAC --> IPv4 */
> >         RTE_PTYPE_IPv4_GRENAT_MAC_IPv4FRAG_PAY3,
> >         RTE_PTYPE_IPv4_GRENAT_MAC_IPv4_PAY3,
> >         RTE_PTYPE_IPv4_GRENAT_MAC_IPv4_UDP_PAY4,
> >         RTE_PTYPE_IPv4_GRENAT_MAC_IPv4_TCP_PAY4,
> >         RTE_PTYPE_IPv4_GRENAT_MAC_IPv4_SCTP_PAY4,
> >         RTE_PTYPE_IPv4_GRENAT_MAC_IPv4_ICMP_PAY4,
> >
> >         /* IPv4 --> GRE/Teredo/VXLAN --> MAC --> IPv6 */
> >         RTE_PTYPE_IPv4_GRENAT_MAC_IPv6FRAG_PAY3
> >         RTE_PTYPE_IPv4_GRENAT_MAC_IPv6_PAY3,
> >         RTE_PTYPE_IPv4_GRENAT_MAC_IPv6_UDP_PAY4,
> >         RTE_PTYPE_IPv4_GRENAT_MAC_IPv6_TCP_PAY4,
> >         RTE_PTYPE_IPv4_GRENAT_MAC_IPv6_SCTP_PAY4,
> >         RTE_PTYPE_IPv4_GRENAT_MAC_IPv6_ICMP_PAY4,
> >
> >         /* IPv4 --> GRE/Teredo/VXLAN --> MAC/VLAN */
> >         RTE_PTYPE_IPv4_GRENAT_MACVLAN_PAY3,
> > ...
> > }
> 
> OK, it seems well abstracted.
> I think the last part of these names (PAY3/PAY4) is useless.
> 
> When this patch for API and i40e will be ready?
> I'd prefer fixing the API instead of removing it.

If needed, next week, I can send a patch for this.

> > Yes, we don't use packet type in many places now, which doesn't mean
> > we don't use it  in the future (when supporting another tunneling packet).
> >
> > It is ok for me if you want to remove the packet_type filed in mbuf,
> > but we will send a separate patch set for introducing packet type in
> > the future, which includes 1g/10/40g PMD changes.
> 
> When the patches for igb/ixgbe will be ready?
We need some time to investigate this for igb/ixgbe, probably some example codes and test application codes need to changed. 
You can assume that it cannot be done in DPDK1.8.

So here are my three suggestions:

1. keep packet_type in mbuf and wait for all the igb/ixgb/i40e changes done in DPDK2.0. Now, I don't send a separate  patch set for it. 
2. keep  packet_type in mbuf, I just send i40e patch set for this in DPDK1.8. In DPDK2.0, we will send a patch set  for igb/ixgbe.
3. It can be removed now,  and we will send a separate patch set for introducing packet type in the future.

> Thanks
> --
> Thomas
  
Thomas Monjalon Nov. 13, 2014, 11:35 a.m. UTC | #12
2014-11-13 11:24, Liu, Jijiang:
> From: Thomas Monjalon [mailto:thomas.monjalon@6wind.com]
> > 2014-11-13 03:17, Liu, Jijiang:
> > > From: Thomas Monjalon [mailto:thomas.monjalon@6wind.com]
> > > > 2014-10-23 02:23, Zhang, Helin:
> > > > > From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Thomas
> > > > > Monjalon
> > > > > > 2014-10-21 14:14, Liu, Jijiang:
> > > > > > > From: Thomas Monjalon [mailto:thomas.monjalon@6wind.com]
> > > > > > > > 2014-10-21 16:46, Jijiang Liu:
> > > > > > > > > +	uint16_t packet_type;
> > > > > > > >
> > > > > > > > Why not name it "l2_type"?
> > > > >
> > > > > 'packet_type' is for storing the hardware identified packet type
> > > > > upon different layers of protocols (l2, l3, l4, ...).
> > > > > It is quite useful for user application or middle layer software
> > > > > stacks, it can know what the packet type is without checking the
> > > > > packet too
> > > > much by software.
> > > > > Actually ixgbe already has packet types (less than 10), which is
> > > > > transcoded into
> > > > 'ol_flags'.
> > > > > For i40e, the packet type can represent about 256 types of packet,
> > > > > 'ol_flags' does not have enough bits for it anymore. So put the
> > > > > i40e packet types
> > > > into mbuf would be better.
> > > > > Also this field can be used for NON-Intel NICs, I think there must
> > > > > be the similar concepts of other NICs. And 16 bits 'packet_type'
> > > > > has severl
> > > > reserved bits for future and NON-Intel NICs.
> > > >
> > > > Thanks Helin, that's the best description of packet_type I've seen so far.
> > > > It's not so clear in the commit log:
> > > > 	http://dpdk.org/browse/dpdk/commit/?id=73b7d59cf4f6faf
> > > >
> > > > > > > In datasheet, this term is called packet type(s).
> > > > > >
> > > > > > That's exactly the point I want you really understand!
> > > > > > This is a field in generic mbuf structure, so your datasheet has no value here.
> > > > > >
> > > > > > > Personally , I think packet type is  more clear what meaning of this field is .
> > > > > >
> > > > > > You cannot add an API field without knowing what will be its generic meaning.
> > > > > > Please think about it and describe its scope.
> > > >
> > > > I integrated this patch with the VXLAN patchset in the hope that
> > > > you'll improve the situation afterwards.
> > > > This is the answer you recently gave to Olivier:
> > > > 	http://dpdk.org/ml/archives/dev/2014-November/007599.html
> > > > "
> > > > 	Regarding adding a packet_type in mbuf, we ever had a lot of
> > > > discussions as follows:
> > > > 	http://dpdk.org/ml/archives/dev/2014-October/007027.html
> > > > 	http://dpdk.org/ml/archives/dev/2014-September/005240.html
> > > > 	http://dpdk.org/ml/archives/dev/2014-September/005241.html
> > > > 	http://dpdk.org/ml/archives/dev/2014-September/005274.html
> > > > "
> > > >
> > > > To sum up the situation:
> > > > - We don't know what are the possible values of packet_type
> > > > - It's only filled by i40e, while other drivers use ol_flags
> > > > - There is no special value "unknown" which should be set by drivers
> > > >   not supporting this feature.
> > > > - Its only usage is to print a decimal value in
> > > > app/test-pmd/rxonly.c
> > > >
> > > > It's now clear that nobody cares about this part of the API.
> > > > So I'm going to remove packet_type from mbuf.
> > > > I don't want to keep something that we don't know how to use, that
> > > > is not consistent across drivers, and that overlap another API part (ol_flags).
> > >
> > > The packet type in 40e is very important for user, using packet type
> > > can help to speed up packet analysis/identification in their
> > > application, especially tunneling packet format.
> > > Now I'm working on implementing packet type definition in rte_ethdev.h
> > > file and  translation table in i40e, which is almost done.
> > > The packet type  definition in in rte_ethdev.h file like below.
> > > /*
> > >  * Ethernet packet type
> > >  */
> > > enum rte_eth_ptype {
> > >         /* undefined packet type, means HW can't recognise it */
> > >         RTE_PTYPE_UNDEF = 0,
> > > ...
> > >
> > >         /* IPv4 --> GRE/Teredo/VXLAN --> MAC --> IPv4 */
> > >         RTE_PTYPE_IPv4_GRENAT_MAC_IPv4FRAG_PAY3,
> > >         RTE_PTYPE_IPv4_GRENAT_MAC_IPv4_PAY3,
> > >         RTE_PTYPE_IPv4_GRENAT_MAC_IPv4_UDP_PAY4,
> > >         RTE_PTYPE_IPv4_GRENAT_MAC_IPv4_TCP_PAY4,
> > >         RTE_PTYPE_IPv4_GRENAT_MAC_IPv4_SCTP_PAY4,
> > >         RTE_PTYPE_IPv4_GRENAT_MAC_IPv4_ICMP_PAY4,
> > >
> > >         /* IPv4 --> GRE/Teredo/VXLAN --> MAC --> IPv6 */
> > >         RTE_PTYPE_IPv4_GRENAT_MAC_IPv6FRAG_PAY3
> > >         RTE_PTYPE_IPv4_GRENAT_MAC_IPv6_PAY3,
> > >         RTE_PTYPE_IPv4_GRENAT_MAC_IPv6_UDP_PAY4,
> > >         RTE_PTYPE_IPv4_GRENAT_MAC_IPv6_TCP_PAY4,
> > >         RTE_PTYPE_IPv4_GRENAT_MAC_IPv6_SCTP_PAY4,
> > >         RTE_PTYPE_IPv4_GRENAT_MAC_IPv6_ICMP_PAY4,
> > >
> > >         /* IPv4 --> GRE/Teredo/VXLAN --> MAC/VLAN */
> > >         RTE_PTYPE_IPv4_GRENAT_MACVLAN_PAY3,
> > > ...
> > > }
> > 
> > OK, it seems well abstracted.
> > I think the last part of these names (PAY3/PAY4) is useless.
> > 
> > When this patch for API and i40e will be ready?
> > I'd prefer fixing the API instead of removing it.
> 
> If needed, next week, I can send a patch for this.
> 
> > > Yes, we don't use packet type in many places now, which doesn't mean
> > > we don't use it  in the future (when supporting another tunneling packet).
> > >
> > > It is ok for me if you want to remove the packet_type filed in mbuf,
> > > but we will send a separate patch set for introducing packet type in
> > > the future, which includes 1g/10/40g PMD changes.
> > 
> > When the patches for igb/ixgbe will be ready?
> 
> We need some time to investigate this for igb/ixgbe, probably some
> example codes and test application codes need to changed. 
> You can assume that it cannot be done in DPDK1.8.
> 
> So here are my three suggestions:
> 
> 1. keep packet_type in mbuf and wait for all the igb/ixgb/i40e changes
> done in DPDK2.0. Now, I don't send a separate  patch set for it. 
> 2. keep  packet_type in mbuf, I just send i40e patch set for this in
> DPDK1.8. In DPDK2.0, we will send a patch set  for igb/ixgbe.
> 3. It can be removed now,  and we will send a separate patch set for
> introducing packet type in the future.

Option 2 please :)
My main concerns are:
- clearly document it
- have hardware abstraction

Thanks
  

Patch

diff --git a/lib/librte_mbuf/rte_mbuf.h b/lib/librte_mbuf/rte_mbuf.h
index ddadc21..98951a6 100644
--- a/lib/librte_mbuf/rte_mbuf.h
+++ b/lib/librte_mbuf/rte_mbuf.h
@@ -163,7 +163,14 @@  struct rte_mbuf {
 
 	/* remaining bytes are set on RX when pulling packet from descriptor */
 	MARKER rx_descriptor_fields1;
-	uint16_t reserved2;       /**< Unused field. Required for padding */
+
+	/**
+	 * Packet type, which is used to indicate ordinary L2 packet format and
+	 * also tunneled packet format such as IP in IP, IP in GRE, MAC in GRE
+	 * and MAC in UDP.
+	 */
+	uint16_t packet_type;
+
 	uint16_t data_len;        /**< Amount of data in segment buffer. */
 	uint32_t pkt_len;         /**< Total pkt len: sum of all segments. */
 	uint16_t vlan_tci;        /**< VLAN Tag Control Identifier (CPU order) */
@@ -196,6 +203,18 @@  struct rte_mbuf {
 			uint16_t l2_len:7;      /**< L2 (MAC) Header Length. */
 		};
 	};
+
+	/* fields for TX offloading of tunnels */
+	union {
+		uint16_t inner_l2_l3_len;
+		/**< combined inner l2/l3 lengths as single var */
+		struct {
+			uint16_t inner_l3_len:9;
+			/**< inner L3 (IP) Header Length. */
+			uint16_t inner_l2_len:7;
+			/**< inner L2 (MAC) Header Length. */
+		};
+	};
 } __rte_cache_aligned;
 
 /**
@@ -546,11 +565,13 @@  static inline void rte_pktmbuf_reset(struct rte_mbuf *m)
 	m->next = NULL;
 	m->pkt_len = 0;
 	m->l2_l3_len = 0;
+	m->inner_l2_l3_len = 0;
 	m->vlan_tci = 0;
 	m->nb_segs = 1;
 	m->port = 0xff;
 
 	m->ol_flags = 0;
+	m->packet_type = 0;
 	m->data_off = (RTE_PKTMBUF_HEADROOM <= m->buf_len) ?
 			RTE_PKTMBUF_HEADROOM : m->buf_len;
 
@@ -614,12 +635,14 @@  static inline void rte_pktmbuf_attach(struct rte_mbuf *mi, struct rte_mbuf *md)
 	mi->port = md->port;
 	mi->vlan_tci = md->vlan_tci;
 	mi->l2_l3_len = md->l2_l3_len;
+	mi->inner_l2_l3_len = md->inner_l2_l3_len;
 	mi->hash = md->hash;
 
 	mi->next = NULL;
 	mi->pkt_len = mi->data_len;
 	mi->nb_segs = 1;
 	mi->ol_flags = md->ol_flags;
+	mi->packet_type = md->packet_type;
 
 	__rte_mbuf_sanity_check(mi, 1);
 	__rte_mbuf_sanity_check(md, 0);