From mboxrd@z Thu Jan 1 00:00:00 1970 From: Stephen Hemminger Subject: Re: Passing VLAN traffic via l2fwd Date: Thu, 23 Jan 2014 13:43:56 -0800 Message-ID: <20140123134356.522e822a@nehalam.linuxnetplumber.net> References: Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit Cc: "dev-VfR2kkLFssw@public.gmane.org" To: James Yu Return-path: In-Reply-To: List-Id: patches and discussions about DPDK List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces-VfR2kkLFssw@public.gmane.org Sender: "dev" On Thu, 23 Jan 2014 11:27:14 -0800 James Yu wrote: > Hi Daniel, > > Untagged traffic could be looped back. I am doing a one-directional loop > back. In the Frame tabe of the StreamBlock editor, I did the following > stream1: > destination address: MAC address of the receiving port of the guest > VM. (obtained from the debug print out when l2fwd is started, or ifconfig > before l2fwd is started) > stream2: > destination address: MAC address of the sending port of the guest VM > (obtained from the debug print out when l2fwd is started, or ifconfig > before l2fwd is started) > > > The only thing I add is to tag both the SR-IOV VF ports on the host with > the same tag using ip command and add that tag number as the VID to the > Spirent streams. After that that traffic can reach l2fwd which reported > forwarded the packets on the periodic printout. However the packets did not > reach the Spirent. > > Also it is exercising rte_ixgbevf_pmd codes as indicated during starting > l2fwd. > > EAL: Master core 0 is ready (tid=b77ab7d0) > > EAL: Core 1 is ready (tid=adffeb70) > > EAL: probe driver: 8086:100e rte_em_pmd > > EAL: probe driver: 8086:100e rte_em_pmd > > *EAL: probe driver: 8086:10ed rte_ixgbevf_pmd* > I wonder do I have to change any codes in the DPDK library or call certain > routines to setup the VLAN in the DPDK stack during starting the l2fwd ? > > > Were you able to send VLAN traffic from your iXia and looped back to your > iXia ? > > > Thanks > > James > > > > > On Thu, Jan 23, 2014 at 12:45 AM, Daniel Kaminsky < > daniel.kaminsky-bIuJOMs36akdlAAv9/cgxFaTQe2KTcn/@public.gmane.org> wrote: > > > Hi James, > > > > Did you try a non-tagged traffic? I suspect this is the limitation of the > > l2fwd or the requirements of Spirent. From my experience with Ixia, the L2 > > forward device must implement the ARP protocol (at least a subset of it). > > > > Also, notice that the l2fwd example sets the destination MAC address to > > "02:00:00:00:00:xx" which the Spirent might doesn't like. > > > > Daniel > > > > > > On Thu, Jan 23, 2014 at 7:08 AM, James Yu wrote: > > > >> I could not pass tagged traffic through the l2fwd program running inside a > >> CentOS VM. The l2fwd program reported sending out all the packets received > >> from one port to the other port. But the outside Spirent tester could not > >> receive a packet at all. I am wondering maybe the tagged packets are > >> dropped somewhere in the rte_em_pmd or in the DPDK library. Anyone knows > >> how to pass/send VLAN traffic through the DPDK ? > >> > >> With tagged SR-IOV ports, Spirent and guest VM CentOS could ping each > >> other > >> without using DPDK. Once I used DPDK 1.3.1r2, I encountered issues with > >> sending out tagged packets out of DPDK to the host. > >> > >> I have done the following: > >> > >> On RHEL6.1 host > >> 1. setup the VLAN using "ip link set eth2 vf 0 vlan 3" for port 1 and "ip > >> link set eth3 vf 0 vlan 3" for port 2 > >> [root@cent64x64-137189 ~]# ip link show eth2 > >> 96: eth2: mtu 1500 qdisc mq state UP > >> qlen > >> 1000 > >> link/ether 90:e2:ba:2e:af:f0 brd ff:ff:ff:ff:ff:ff > >> vf 0 MAC 52:54:00:f9:9a:90, vlan 3 > >> [root@cent64x64-137189 ~]# ip link show eth3 > >> 98: eth3: mtu 1500 qdisc mq state UP > >> qlen > >> 1000 > >> link/ether 90:e2:ba:2e:af:f1 brd ff:ff:ff:ff:ff:ff > >> vf 0 MAC 52:54:00:30:37:98, vlan 3 > >> > >> 2. virsh configure SR-IOV hostdev > >> > >> > >> > >>
>> function='0x0'/> > >> > >>
>> function='0x0'/> > >> > >> > >> > >> > >>
>> function='0x1'/> > >> > >>
>> function='0x0'/> > >> > >> > >> [root@cent64x64-137189 ~]# lspci |grep Eth > >> 1a:00.0 Ethernet controller: Intel Corporation 82599EB 10-Gigabit SFI/SFP+ > >> Network Connection (rev 01) > >> 1a:00.1 Ethernet controller: Intel Corporation 82599EB 10-Gigabit SFI/SFP+ > >> Network Connection (rev 01) > >> 1a:10.0 Ethernet controller: Intel Corporation 82599 Ethernet Controller > >> Virtual Function (rev 01) > >> 1a:10.1 Ethernet controller: Intel Corporation 82599 Ethernet Controller > >> Virtual Function (rev 01) > >> > >> > >> On guest VM > >> 1. check all the ports are started up and check their corresponding port > >> type. Use the two SR-IOV ports with device type as ixgbevf for l2fwd > >> [root@VirtualADX ~]# lspci |grep Eth > >> 00:03.0 Ethernet controller: Intel Corporation 82540EM Gigabit Ethernet > >> Controller (rev 03) > >> 00:07.0 Ethernet controller: Intel Corporation 82540EM Gigabit Ethernet > >> Controller (rev 03) > >> 00:08.0 Ethernet controller: Intel Corporation 82599 Ethernet Controller > >> Virtual Function (rev 01) > >> 00:09.0 Ethernet controller: Intel Corporation 82599 Ethernet Controller > >> Virtual Function (rev 01) > >> 00:0a.0 Ethernet controller: Intel Corporation 82540EM Gigabit Ethernet > >> Controller (rev 03) > >> > >> 2. run this command: > >> /root/l2fwd -c 3 -n 1 -b 000:00:03.0 -b 000:00:07.0 -b > >> 000:00:0a.0 -- -q 1 -p 3 > >> > >> Although the l2fwd forwards all received tagged packets, the Spirent > >> tester did not receive any packet at all. > >> > > > > The VLAN offload bit in the mbuf is different for TX and RX. Probably would work with something like this: diff --git a/examples/l2fwd/main.c b/examples/l2fwd/main.c index 05ef330..70dbf85 100644 --- a/examples/l2fwd/main.c +++ b/examples/l2fwd/main.c @@ -289,6 +289,9 @@ l2fwd_simple_forward(struct rte_mbuf *m, unsigned portid) /* src addr */ ether_addr_copy(&l2fwd_ports_eth_addr[dst_port], ð->s_addr); + if (m->ol_flags & PKT_RX_VLAN_PKT) + m->ol_flags |= PKT_TX_VLAN_PKT; + l2fwd_send_packet(m, (uint8_t) dst_port); }