[dpdk-dev] [PATCH] ixgbe: fix buffer overrun bug in non-bulk alloc mode setup

Thomas Monjalon thomas.monjalon at 6wind.com
Fri Mar 20 22:45:50 CET 2015


2015-03-20 06:50, Jiajia, SunX:
> Tested-by: Jiajia, SunX <sunx.jiajia at intel.com>
> - Tested Commit: fe4810a01e57645ad92577d628f562791408ce21

This commit id is related to a PDF doc change.

> - OS: Fedora20 3.11.10-301.fc20.x86_64
> - GCC: gcc version 4.8.3
> - CPU: Intel(R) Xeon(R) CPU E5-2680 v2 @ 2.80GHz
> - NIC: Intel Corporation 82599ES 10-Gigabit SFI/SFP+ Network Connection [8086:10fb]
> - Target x86_64-native-linuxapp-gcc
> - Total 22 cases, 22 passed, 0 failed

It seems this test is related to bonding, not ixgbe buffer overrun in
non-bulk alloc mode.

> TOPO:
> * Connections ports between tester/ixia and DUT
>   - TESTER(Or IXIA)-------DUT
>   - portA------------------port0
>   - portB------------------port1
>   - portC------------------port2
>   - portD------------------port3
> 
> Test Setup#1 for Functional test
> ================================
> 
> Tester has 4 ports(portA--portD), and DUT has 4 ports(port0--port3), then connect portA to port0, portB to port1, portC to port2, portD to port3. 
> 
> 
> 
> - Case: Basic bonding--Create bonded devices and slaves
>   Description: 
> 		Use Setup#1.
> 		Create bonded device and add some ports as salve of bonded device,
>             Then removed slaves or added slaves or change the bonding primary slave
>             Or change bonding mode and so on.
>   Expected test result:
>             Verify the basic functions are normal.
> 
> - Case: Basic bonding--MAC Address Test
>   Description: 
> 		Use Setup#1.
> 		Create bonded device and add some ports as slaves of bonded device,
>             Check that the changes of  the bonded device and slave MAC
>   Expected test result:
>             Verify the behavior of bonded device and slave according to the mode.
> 
> - Case: Basic bonding--Device Promiscuous Mode Test
>   Description: 
> 		Use Setup#1.
> 		Create bonded device and add some ports as slaves of bonded device,
>             Set promiscuous mode on or off, then send packets to the bonded device
>             Or slaves.
>   Expected test result:
>             Verify the RX/TX status of bonded device and slaves according to the mode.
> 
> - Case: Mode 0(Round Robin) TX/RX test
>   Description: 
> 		Use Setup#1.
> 		Create bonded device with mode 0 and add 3 ports as slaves of bonded device,
>             Forward packets between bonded device and unbounded device, start to forward,
>             And send packets to unbound device or slaves.
>   Expected test result:
>             Verify the RX/TX status of bonded device and slaves in mode 0.
> 
> - Case: Mode 0(Round Robin) Bring one slave link down
>   Description: 
> 		Use Setup#1.
> 		Create bonded device with mode 0 and add 3 ports as slaves of bonded device,
>             Forward packets between bonded device and unbounded device, start to forward,
>             Bring the link on either port 0, 1 or 2 down. And send packets to unbound 
>             device or slaves.
>   Expected test result:
>             Verify the RX/TX status of bonded device and slaves in mode 0.
> 
> - Case: Mode 0(Round Robin) Bring all slave links down
>   Description: 
> 		Use Setup#1.
> 		Create bonded device with mode 0 and add 3 ports as slaves of bonded device,
>             Forward packets between bonded device and unbounded device, start to forward,
>             Bring the links down on all bonded ports. And send packets to unbound 
>             device or slaves.
>   Expected test result:
>             Verify the RX/TX status of bonded device and slaves in mode 0.
> 
> - Case: Mode 1(Active Backup) TX/RX Test
>   Description: 
> 		Use Setup#1.
> 		Create bonded device with mode 1 and add 3 ports as slaves of bonded device,
>             Forward packets between bonded device and unbounded device, start to forward,
>             And send packets to unbound device or slaves.
>   Expected test result:
>             Verify the RX/TX status of bonded device and slaves in mode 1.
> 
> - Case: Mode 1(Active Backup) Change active slave, RX/TX test
>   Description: 
> 		Use Setup#1.
> 		Continuing from previous test case.Change the active slave port from port0 
>             to port1.Verify that the bonded device's MAC has changed to slave1's MAC.
> 
>             testpmd> set bonding primary 1 4 
> 
>            Repeat the transmission and reception(TX/RX) test verify that data is now 
>            transmitted and received through the new active slave and no longer through
>            port0
>   Expected test result:
>             Verify the RX/TX status of bonded device and slaves in mode 1.
> 
> - Case: Mode 1(Active Backup) Link up/down active eth dev
>   Description: 
> 		Use Setup#1.
> 
>            Bring link between port A and port0 down. If tester is ixia, can use 
>            IxExplorer to set the "Simulate Cable Disconnect" at the port property.  
>            Verify that the active slave has been changed from port0. Repeat the 
>            transmission and reception test verify that data is now transmitted and
>            received through the new active slave and no longer through port0
> 
>            Bring port0 to link down at the remote end.Verify the active slave has been changed from port0.
>            send 100 packets to port3.
> 
>            testpmd> show port stats 4----(Verify port3 have 100 rx packets,meanwhile
>           port4 have 100 tx packets,the current primary port have 100 tx packets,and port0
>           doesn`t have any packet)
>   Expected test result:
>             Verify the RX/TX status of bonded device and slaves in mode 1. 
> 
> - Case: Mode 1(Active Backup) Bring all slave links down
>   Description: 
> 		Use Setup#1.
>             Bring all slave ports of bonded port down.
>             Verify that bonded callback for link down is called and no active slaves. 
>             Verify that data cannot be sent or received through bonded port. Send 100 packets 
>             to port3 and verify that bonded port can't TX 100 packets.
> 
>             Bring port 0-2 to link down at the remote end. Verify port4 has been link down and has no active slave.
>             Send 100 rx packets to port3. 
> 
>          testpmd> show port stats 4----(Verify port3 have 100 rx packets,meanwhile 
>                                         port4 doesn`t have any packet)
>   Expected test result:
>             Verify the RX/TX status of bonded device and slaves in mode 1.
> 
> - Case: Mode 2(Balance XOR) TX Load Balance test
>   Description: 
> 		Use Setup#1.
>             Bonded port will activate each slave eth dev based on the following hash function:
> 
>              ((dst_mac XOR src_mac) % (number of slave ports))
> 
>             Send 300 packets from IXIA port D to non-bonded port(port3),and verify these packets 
>             will be forwarded to bonded device. The bonded device will transimit these packets to all slaves.
>             Verify that each slave receive correct number of packets according to the policy. The total number
>             of packets which received by slave should be equal as 300 packets. 
> 
>             Create 3 streams in the IXIA,which streams source MAC are 00:00:03:00:0F:00,
>             00:00:03:00:0F:01,00:00:03:00:0F:02 respectively (make sure generate different value by
>             the policy ((dst_mac XOR src_mac) % (number of slave ports)) ) and dest MAC all is 
>             90:E2:BA:4A:54:80(this value should been your unbonded port address). Respectively
>             send 100 packets to port3 by the 3 streams.
> 
>             testpmd> show port stats all----(Verify port3 have 300 rx packets,
>             port4 have 300 tx packets,and port 0-2 have 100 tx packets respectively)
> 
>   Expected test result:
>             Verify the RX/TX status of bonded device and slaves in mode 2.
> 
> - Case: Mode 2(Balance XOR) TX Load Balance Link down
>   Description: 
> 		Use Setup#1.
> 		ring link down of one slave.
>             Send 300 packets from non-bonded port(port3), and verify these 
> 		packets will be forwarded to bonded device. 
>             Verify that each active slave receive correct number of packets
>             (according to the mode policy), and the down slave will not receive packets.
> 		Link down slave 0 at the remote end.Create 3 streams in the IXIA like case13.
> 		Then respectively send 100 packets to port3 by the 3 streams.
> 
>   Expected test result:
>             Verify the RX/TX status of bonded device and slaves in mode 2.
> 
> - Case: Mode 2(Balance XOR) Bring all slave links down
>   Description: 
> 		Use Setup#1.
> 		Bring all slave links down.
> 		Verify that bonded callback for link down is called.
> 		Verify no packet can be sent.
> 
> 		Bring all slaves to link down at the remote end.Create 
> 		3 streams in the IXIA like case13.Then respectively send 100 packets 
> 		to port3 by the 3 streams.
> 
> 		testpmd> show port info 4----(Verify bonding port has been linked down)
>    	      testpmd> show port stats all----(Verify port3 have 300 rx packets,meanwhile
> 							 port 0,1,2 and 4 don`t have any packet)
>   Expected test result:
>             Verify the RX/TX status of bonded device and slaves in mode 2.
> 
> 
> - Case: Mode 2(Balance XOR) Layer 3+4 forwarding 	
>   Description: 
> 		Use Setup#1.
> 		Use "xmit_hash_policy()" to change to this forwarding mode
> 		Create a stream of traffic which will exercise all slave ports using the transmit policy 
> 
>    		 ((SRC_PORT XOR DST_PORT) XOR ((SRC_IP XOR DST_IP) AND 0xffff) % # of Slaves
> 
> 		Transmit data through bonded device, verify TX packet count for each slave port is as expected
> 
> 		Create 3 streams on a port which is mapped with unbonded port 3 at the IXIA end.
> 	      And set different IP by the transmit policy.Then send 100 packets on each stream.
> 
>            testpmd> show port stats all----(Verify port3 have 300 rx packets,
> 				meanwhile port4 have 300 rx packets, port 0-2 have 100 tx packets respectively)
> 
> 		Add Vlan tag in the previouse 3 streams. Everthing else remains the same. 
> 		Then send 100 packets on each stream. Verify the packet statics is the same as above.  
> 
>    	      testpmd> show port stats all----(Verify port3  
> 		have 300 rx packets,meanwhile port4 have 300 rx packets,port 0-2 have 100 tx packets respecitvely)
>   Expected test result:
>             Verify the RX/TX status of bonded device and slaves in mode 2.
> 
> - Case: Mode 2(Balance XOR) RX test
>   Description: 
> 		Use Setup#1.
> 		Send 100 packets to each bonded slaves(port0,1,2)
> 		Verify that each slave receives 100 packets and the bonded device receive a total 300 packets.
> 		Verify that the bonded device forwards 300 packets to the non-bonded port(port4).
> 
> 		Send 100 packets to port0,1,2 respectively.
> 
>     		testpmd> show port stats all----(Verify port0,1,2 have 100 tx packets respectively 
> 				and port4 have 300 rx packets,and port3 have 300 tx packets)
> 
>   Expected test result:
>             Verify the RX/TX status of bonded device and slaves in mode 2.
> 
> - Case: Mode 3(Broadcast) TX/RX Test
>   Description: 
> 		Use Setup#1.
> 		Add ports 0-2 as slave devices to the bonded port 4. Make all slaves
> 	      to be active slaves on bonded device. 
> 
>             RX: Send a packet stream(100 packets) from port A on the traffic
> 		    generator to be forwarded through the bonded port4 to port3.
> 		    Verify the sum of the packets transmitted from the traffic generator
> 		    portA is equal the total received packets on port0, port4 and portD(Traffic generator).
> 
>                testpmd> show port stats all---(Verify port0 receive 100 packets, 
> 				and port4 receive 100 packets, and port3 transmit 100 packets)
> 
>            TX: Send a packet stream(100 packets) from portD on the traffic generator 
>                to be forwarded through port3 to the bonded port4. Verify the sum of 
>                the packets(100packets) transmitted from the traffic generator port is equal the total 
>                received packets on port4, portA and transmitted to port0.
>     
>           testpmd> show port stats all---(Verify port3 RX 100 packets, 
>                     and port0,1,2 TX 100 packets,port4 has 300 TX packets)
>   Expected test result:
>             Verify the RX/TX status of bonded device and slaves in mode 3.
> 
> 
> - Case: Mode 3(Broadcast) Bring one slave link down
>   Description: 
> 		Use Setup#1.
> 		Bring one slave port link down. Send 100 packets through portD to port3,
> 	      then port3 forwards to bondede device(port4), verify that the bonded device 
> 		and other slaves TX the correct number of packets(100 packets for each port).
>   Expected test result:
>             Verify the RX/TX status of bonded device and slaves in mode 3.
> 
> - Case: Mode 3(Broadcast) Bring all slave links down
>   Description: 
> 		Use Setup#1.
> 		Bring all slave ports of bonded port down
> 		Verify that bonded callback for link down is called
> 		Verify that data cannot be sent or received through bonded port.
>   Expected test result:
>             Verify the RX/TX status of bonded device and slaves in mode 3.
> 
> - Case: Mode 5(Transmit load balance) basic test  
> ============================================================================
> 
> Use Setup#1
> 
> Create bonded device. Add first slave - port 0. Verify default bonded device has default mode 5. 
> Verify bonded device MAC address is that of primary slave. Add another slaves port 1 and 2 to 
> the bonded device. Verify that their MAC are different.
> 
> Bring the primary slave down. Verify if bonding interface reconfigured itself. The next port 
> (in this scenario port 1) should became a primary one but the MAC should not be changed - should 
> still be the MAC of port 0.
> 
> Bring a slave of bonding device down. Verify if bonding interface reconfigured itself.
> 
> Bring the portA, portB and portC down. Verify the bonded device will link down.
> 
> Set bonded device promiscuous mode to be off. Verify only the promiscuous state of primary 
> interface will be off.
> 
> 
> - Case: Mode 5(Transmit load balance)  TX/RX test 
> ============================================================================
> 
> Use Setup#1
> 
> Create a bonded device(port4 in this scenario). Add port 0-2 as slaves of bonding port4. Make 
> packets to transmit between port3 and port4. Then start to forward streams.
> 
> TX: Prepare a packet stream which will send packets in 5 minutes. Send this stream from portD 
> to port3. Verify that port3 will receive all packets---no missed packets and no error packets. 
> Port 0-2 transmitting packets will be represented as packet0, packet1 and packet2 respectively 
> and their average packets will be represented as mean.  Then verify port 0-2 will meet the situation:
> mean = (packet0 + packet1 + packet2)/3, packet0, packet1 and packet2 will be higher than 90% of mean 
> and lower than 110% of mean. Then the test of port0, port1 and port2 balancing are finished positive.
> 
> RX: A continuation of TX testing setup. Prepare 3 packet streams and each stream has 100 packets.
>  Respectively, send these streams from portA, portB and portC. Verify only the primary slave port0 will 
> receive 100 packets, and port3 will transmit 100 packets.
> 
> 
> - Case: Mode 5(Transmit load balance)  Bring one slave link down
>  ============================================================================
> 
> Use Setup#1
> 
> Create a bonded device(port4 in this scenario). Add port0, port1 and port2 as slaves of bonding port4.
>  Make packets to transmit between port3 and port4. Then start to forward streams.
> 
> TX: Prepare a packet stream which will send packets in 5 minutes. Bringing port0 link down in the remote 
> end. Send this stream from portD to port3. After the time of 5 minutes is out, verify that port3 will receive
>  all packets---no missed packets and no error packets. Port 1-2 transmitting packets will be represented as 
> packet1 and packet2 respectively and their average packets will be represented as mean. Then verify port1 and 
> port2 will meet the situation:
> mean = (packet1 + packet2)/2, packet1 and packet2 will be higher than 90% of mean and lower than 110% of mean. 
> Then the test of port1 and port2 balancing are finished positive.
> 
> RX: Prepare 3 packet streams and each stream has 100 packets. Respectively, send these streams from portA, portB 
> and portC. Verify the primary port(port0 this scenario) will receive 100 packets, and port1 and port2 will receive
>  nothing, and port3 will transmit 100 packets.
> 
> 
> - Case: Mode 5(Transmit load balance)  Bring all slaves link down 
> =============================================================================
> 
> Use Setup#1
> 
> First, set the same setup as case 30. Second, bring all slaves link down.
> 
> TX: Prepare 1 packet stream which will have 300 packets. Send this stream from portD to port3. Verify port0, 
> port1 and port2 will transmit nothing.
> 
> RX: Prepare 3 packet streams and each stream has 100 packets. Respectively, send these streams from portA,
> portB and portC. Verify port0, port1 and port2 will receive nothing.
> 
> > -----Original Message-----
> > From: dev [mailto:dev-bounces at dpdk.org] On Behalf Of Pawel Wodkowski
> > Sent: Friday, March 20, 2015 12:09 AM
> > To: dev at dpdk.org
> > Cc: Wodkowski, PawelX
> > Subject: [dpdk-dev] [PATCH] ixgbe: fix buffer overrun bug in non-bulk
> > alloc mode setup
> > 
> > From: Pawel Wodkowski <pawelx.wdkowski at intel.com>
> > 
> > When bulk alloc is enabled at compile time but preconditions for
> > it are not met at runtime the ixgbe_reset_rx_queue() function
> > overrides rxq->sw_ring not allocated elements.
> > 
> > Fixes: 01fa1d6 ("ixgbe: unify Rx setup")
> > Signed-off-by: Pawel Wodkowski <pawelx.wodkowski at intel.com>
> > ---
> >  lib/librte_pmd_ixgbe/ixgbe_rxtx.c | 4 ++--
> >  1 file changed, 2 insertions(+), 2 deletions(-)
> > 
> > diff --git a/lib/librte_pmd_ixgbe/ixgbe_rxtx.c
> > b/lib/librte_pmd_ixgbe/ixgbe_rxtx.c
> > index 42f0aa5..dddc12f 100644
> > --- a/lib/librte_pmd_ixgbe/ixgbe_rxtx.c
> > +++ b/lib/librte_pmd_ixgbe/ixgbe_rxtx.c
> > @@ -2111,8 +2111,8 @@ ixgbe_reset_rx_queue(struct ixgbe_hw *hw, struct
> > ixgbe_rx_queue *rxq)
> >  	 * entries is always allocated
> >  	 */
> >  	memset(&rxq->fake_mbuf, 0x0, sizeof(rxq->fake_mbuf));
> > -	for (i = 0; i < RTE_PMD_IXGBE_RX_MAX_BURST; ++i) {
> > -		rxq->sw_ring[rxq->nb_rx_desc + i].mbuf = &rxq->fake_mbuf;
> > +	for (i = rxq->nb_rx_desc; i < len; ++i) {
> > +		rxq->sw_ring[i].mbuf = &rxq->fake_mbuf;
> >  	}
> > 
> >  	rxq->rx_nb_avail = 0;
> > --
> > 1.9.1
> 




More information about the dev mailing list