Packet loss with PollDevice

Yu Chen <[email protected]>
Newsgroups gmane.network.routing.click
Message-ID <[email protected]>
Hi all,

I am having an experiment with the following topology running on Deterlab. I 
am having a 4-core Xeon and modified e1000 driver running ore Xeon and modified 
e1000 driver running. The memory is 4GB.
                     
		     User1
                       |
	   User3-----Router------User4		
                       |
	             User2

User 1 is sending packet to User 2; User 3 is sending packets to User 4. 
The router only routes stuff with best effort. However, what I observed is 
very few losses, distributed on a small random set of rounds. What is 
surprising is that there are losses on one particular netcard when the sending 
rate is only 125,000 packets/second. The loss happens at the receiving phase.

Below is what I have tried:
1' I am using 4 threads, each corresponding to one pair of PollDevice and 
ToDevice. 
2' I have changed the queue length at the interface cards. I set txqueuelen=1 
for the senders to decrease the possible burstiness. By increasing the 
receiving queue length from 64 to 4096
(the maximum queue length), the loss rate decreases.
3' I tried to discard the packets on their arrival at the router. In this case, 
there is no observed loss.

I am kind of lost at the point. Any suggestions on what can be the possible 
reason and what I can try next?

Attached is my code.

Best Regards,
Yu 

Router:
----------------------------------------------------------------------- 
ddressInfo(router1-w1      10.0.1.1      00:15:17:5d:16:4a,      //eth2
user1-w1        10.0.1.2      00:15:17:5d:29:28,      //eth0
router1-w2      10.0.2.1      00:15:17:5d:16:48,      //eth0
user2-w2        10.0.2.2      00:15:17:57:ce:14,      //eth0
router1-w3      10.0.3.1      00:15:17:5d:16:4b,      //eth3
user3-w3        10.0.3.2      00:15:17:5d:27:e8,      //eth0
router1-w4      10.0.4.1      00:15:17:5d:16:49,      //eth1
user4-w4        10.0.4.2      00:15:17:5d:2a:3c,      //eth0
);

c1 :: Classifier(12/0806 20/0001,
                 12/0806 20/0002,
                 12/0800,
                 -);
c2 :: Classifier(12/0806 20/0001,
                 12/0806 20/0002,
                 12/0800,
                 -);
c3 :: Classifier(12/0806 20/0001,
                 12/0806 20/0002,
                 12/0800,
                 -);
c4 :: Classifier(12/0806 20/0001,
                 12/0806 20/0002,
                 12/0800,
                 -);

q0 :: Discard;
// Idle -> ToDevice(eth1);
// Idle -> ToDevice(eth3);
// Idle -> ToDevice(eth2);
// Idle -> ToDevice(eth0);
q1 :: CPUQueue(1000000) -> EtherEncap(0x0800, router1-w1, user1-w1) -> td1 :: ToDevice(eth2);
q2 :: CPUQueue(1000000) -> EtherEncap(0x0800, router1-w2, user2-w2) -> td3 :: ToDevice(eth0);
q3 :: CPUQueue(1000000) -> EtherEncap(0x0800, router1-w3, user3-w3) -> td2 :: ToDevice(eth3);
q4 :: CPUQueue(1000000) -> EtherEncap(0x0800, router1-w4, user4-w4) -> td0 :: ToDevice(eth1);

rt :: LookupIPRouteMP(10.0.1.0/32 0, 10.0.1.1/32 0, 10.0.1.255/32 0,
                     10.0.2.0/32 0, 10.0.2.1/32 0, 10.0.2.255/32 0,
                     10.0.3.0/32 0, 10.0.3.1/32 0, 10.0.3.255/32 0,
                     10.0.4.0/32 0, 10.0.4.1/32 0, 10.0.4.255/32 0,
                     10.0.1.0/24 1, 10.0.2.0/24 2, 10.0.3.0/24 3,
                     10.0.4.0/24 4, 0.0.0.0/0 0);
rt[0] -> Discard;
rt[1] -> q1;
rt[2] -> q2;
rt[3] -> q3;
rt[4] -> q4;

pd1 :: PollDevice(eth2) -> c1;
c1[0] -> q0;
c1[1] -> q0;
c1[2] -> DropBroadcasts -> Strip(14) -> GetIPAddress(16) -> rt;
c1[3] -> Discard;

pd3 :: PollDevice(eth0) -> c2;
c2[0] -> q0;
c2[1] -> q0;
c2[2] -> DropBroadcasts -> Strip(14) -> GetIPAddress(16) -> rt;
c2[3] -> Discard;

pd2 :: PollDevice(eth3) -> c3;
c3[0] -> q0;
c3[1] -> q0;
c3[2] -> DropBroadcasts -> Strip(14) -> GetIPAddress(16) -> rt;
c3[3] -> Discard;

pd0 :: PollDevice(eth1) -> c4;
c4[0] -> q0;
c4[1] -> q0;
c4[2] -> DropBroadcasts -> Strip(14) -> GetIPAddress(16) -> rt;
c4[3] -> Discard;

StaticThreadSched(pd2 0, td0 0, pd0 1, td2 1, pd3 2, td1 2, pd1 3, td3 3);

User:
//
AddressInfo(router1-w1      10.0.1.1      00:15:17:5d:16:4a,      //eth2
user1-w1        10.0.1.2      00:15:17:5d:29:28,      //eth0
router1-w2      10.0.2.1      00:15:17:5d:16:48,      //eth0
user2-w2        10.0.2.2      00:15:17:57:ce:14,      //eth0
router1-w3      10.0.3.1      00:15:17:5d:16:4b,      //eth3
user3-w3        10.0.3.2      00:15:17:5d:27:e8,      //eth0
router1-w4      10.0.4.1      00:15:17:5d:16:49,      //eth1
user4-w4        10.0.4.2      00:15:17:5d:2a:3c,      //eth0
);
//Send
udp :: FastUDPSource(RATE 400000, LIMIT 20000000, LENGTH 78,
		     SRCETH user1-w1, SRCIP user1-w1, SPORT 1,
		     DSTETH router1-w1, DSTIP user2-w2, DPORT 1,
		     CHECKSUM false, INTERVAL 0, ACTIVE false)
	-> ToDevice(eth0);

s :: Script(TYPE ACTIVE, write ctr.reset, write udp.active false, 
	    wait 1, wait 9, write udp.active true);
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.