Hi Vipin, I missed your point: You claim that TAP should work regardless of any pi.proto values. Can you confirm that for ALL kernels versions (past and future)?
> -----Original Message----- > From: Ophir Munk > Sent: Saturday, April 21, 2018 12:49 AM > To: Varghese, Vipin <vipin.vargh...@intel.com>; dev@dpdk.org; > pascal.ma...@6wind.com; Yigit, Ferruh <ferruh.yi...@intel.com>; Thomas > Monjalon <tho...@monjalon.net>; Olga Shern <ol...@mellanox.com>; > Shahaf Shuler <shah...@mellanox.com> > Subject: RE: [dpdk-dev] [PATCH 1/2] net/tap: add tun support > > Hi Vipin, > > Please find comments inline. > > > -----Original Message----- > > From: Varghese, Vipin [mailto:vipin.vargh...@intel.com] > > Sent: Friday, April 13, 2018 6:18 AM > > To: Ophir Munk <ophi...@mellanox.com>; dev@dpdk.org; > > pascal.ma...@6wind.com; Yigit, Ferruh <ferruh.yi...@intel.com>; Thomas > > Monjalon <tho...@monjalon.net>; Olga Shern <ol...@mellanox.com>; > > Shahaf Shuler <shah...@mellanox.com> > > Subject: RE: [dpdk-dev] [PATCH 1/2] net/tap: add tun support > > > > Hi Ophir, > > > > Please find my answers inline to the queries. > > > > > -----Original Message----- > > > From: Ophir Munk [mailto:ophi...@mellanox.com] > > > Sent: Thursday, April 12, 2018 5:19 PM > > > To: Varghese, Vipin <vipin.vargh...@intel.com>; dev@dpdk.org; > > > pascal.ma...@6wind.com; Yigit, Ferruh <ferruh.yi...@intel.com>; > > > Thomas Monjalon <tho...@monjalon.net>; Olga Shern > > > <ol...@mellanox.com>; Shahaf Shuler <shah...@mellanox.com> > > > Subject: RE: [dpdk-dev] [PATCH 1/2] net/tap: add tun support > > > > > > Hi Vipin, > > > This patch (adding TUN to TAP) has been Acked and accepted in > > > next-net branch. > > > I have some questions regarding the implementation (please find below). > > > > > > > -----Original Message----- > > > > From: dev [mailto:dev-boun...@dpdk.org] On Behalf Of Vipin > > > > Varghese > > > > Sent: Tuesday, April 03, 2018 12:38 AM > > > > To: dev@dpdk.org; pascal.ma...@6wind.com; ferruh.yi...@intel.com > > > > Cc: Vipin Varghese <vipin.vargh...@intel.com> > > > > Subject: [dpdk-dev] [PATCH 1/2] net/tap: add tun support > > > > > > > > The change adds functional TUN PMD logic to the existing TAP PMD. > > > > TUN PMD can be initialized with 'net_tunX' where 'X' represents > > > > unique > > id. > > > > PMD supports argument interface, while MAC address and remote are > > > > not supported. > > > > > > > > > > [...] > > > > > > > > > > > + /* > > > > + * TUN and TAP are created with IFF_NO_PI disabled. > > > > + * For TUN PMD this mandatory as fields are used by > > > > + * Kernel tun.c to determine whether its IP or non IP > > > > + * packets. > > > > + * > > > > + * The logic fetches the first byte of data from mbuf. > > > > + * compares whether its v4 or v6. If none matches > > > > default > > > > + * value 0x00 is taken for protocol field. > > > > + */ > > > > + char *buff_data = rte_pktmbuf_mtod(seg, void *); > > > > + j = (*buff_data & 0xf0); > > > > + if (j & (0x40 | 0x60)) > > > > + pi.proto = (j == 0x40) ? 0x0008 : 0xdd86; > > > > + > > > > > > 1. Accessing the first byte here assumes it is the first IP header > > > byte (layer 3) which is correct for TUN. > > > For TAP however the first byte belongs to Ethernet destination > > > address (layer 2). > > > Please explain how this logic will work for TAP. > > > > Based on linux code base '/driver/net/tap.c' and '/driver/net/tun.c' > > from 3.13. to 4.16, > > > > Please find my observation below > > 1. File: tun.c, function: tun_get_user, check for 'tun->flags & > > TUN_TYPE_MASK' is done and if non ip is taken counter 'rx_dropped' is > > updated. > > 2. File: tap.c, there are no checks for 'tap->flags' for IFF_NO_PI in > > rx data path. Counter 'rx_dropped' is updated in 'tap_handle_frame'. > > > > I understand that in kernel implementation there is no check for tap->flags in > file tap.c, however I think there is a bug in dpdk rte_eth_tap.c file. > Please find below an example which demonstrates this claim. > > > Please find my reasoning below > > 1. First approach was to have separate function for tap and tun TX and RX. > > But this will introduce code duplication, hence reworked the code as > above. > > I agree. Avoiding code duplication is a good approach. > > > 2. During my internal testing assigning dummy value for protocol field > > in TAP packets, did not show a difference in behaviour. May be there > > are some specific cases this failing. > > > > If there difference in behaviour, can please share the same? > > > > Please consider the following example: > I am running testpmd with a TAP device, --forward-mode=csum. > I am injecting a TCP packet, which is forwarded back (mac addresses > swapped) to the sender. > Using gdb I set a breakpoint at pmd_tx_burst() in file rte_eth_tap.c > > Looking at the following code inside pmd_tx_burst(): > > 527 char *buff_data = rte_pktmbuf_mtod(seg, void *); > 528 j = (*buff_data & 0xf0); > 529 pi.proto = (j == 0x40) ? 0x0008 : > 530 (j == 0x60) ? 0xdd86 : 0x00; > > I am printing the first 20 bytes of buff_data in line 527: > > (gdb) p/x *(unsigned char *)buff_data@20 > $3 = {0x0, 0x25, 0x88, 0x10, 0x66, 0x2, 0xf4, 0x52, 0x14, 0x7a, 0x59, 0x81, > 0x8, 0x0, 0x45, 0x0, 0x4, 0xdf, 0x0, 0x1} > > The gdb printout refers to: > 6 bytes of destination MAC address: 0x0, 0x25, 0x88, 0x10, 0x66, 0x2 > 6 bytes of source MAC address: 0xf4, 0x52, 0x14, 0x7a, 0x59, 0x81 > 2 bytes of Ethernet type: 0x8, 0x0 - (IPv4) IP header starting with 0x45, ... > which is the byte (0x45) that "j" should have looked at > > In the case of TAP - buff_data starts with the destination MAC address of the > sender (0x0, ...). > The code in line 528 expects that buff_data would start with an IP header > protocol (e.g. 0x45), but it is not the case for TAP. > In my case j=0x0 (line 528) which is harmless (as it ends up with setting > pi.proto=0x00, which is correct for TAP). > However, if the sender had an Intel NIC - the destination MAC address could > have started with: > $3 = {0x40, 0x25, 0xC2, ... > Or- > $3 = {0x64, 0xD4, 0xDA, ... > > as 4025C2 and 64D4DA are reserved prefixes for Intel Ethernet MAC > addresses, see: http://www.coffer.com/mac_find/?string=intel > > In this case pi.proto could end up with 0x0008 or 0xdd86 instead of 0x0 as > expected for TAP. > > I hope that this example clarifies the bug I am referring to. > > > > > > > 2. If the first TUN byte contains 0x2X (which is neither IPv4 nor > > > IPv6) it will end up by setting ip.proto as 0xdd86. > > > Please explain how this logic will work for non-IP packets in TUN > > > > I see your point. You are correct about this. Thanks for pointing out, > > may I send correction for this as > > > > """ > > - if (j & (0x40 | 0x60)) > > - pi.proto = (j == 0x40) ? 0x0008 : 0xdd86; > > + pi.proto = (j == 0x40) ? 0x0008 : > > + (j == 0x60) ? 0xdd86 : > > + 0x00; > > """