[Click] SetCycle + CycleCountAccum

Xavier Grandmougin xavier.grandmougin at loria.fr
Wed Jun 2 16:13:32 EDT 2004


Hi all,

I'm running click-1.4pre1 as a kernel module of linux 2.4.21 on a 
Pentium III 450.
I'm trying to measure the end to end latency of my router. I've put a 
SetCycleCount just after each FromDevice elements.
It seems to work correctly if I put the CycleCountAccum anywhere before 
the ARPQuerier : I get a latency of a few µs (about 1 µs per element). 
But if I put it anywhere after, I get some huge values of hundreds 
seconds !?
What did I miss ?

Thanx
Xavier

PS: here is my config file

//----------------------------------------------------------------------/
// Click configuration file 3 : let the perfs be evaluated !
// 	Author : Xavier GRANDMOUGIN <xavier.grandmougin at libertysurf.fr>
//	Date of creation : 18/05/2004
//----------------------------------------------------------------------/


//
//     +---------+
//    /           \                                  /+-----------+\
//   |             |       +-----------+             |              |
//   |  VIDEO      |   **********   *************    |  VIDEO       |
//   |  SERVER     |===*  eth1  *   *    eth0   *=== |  CLIENT      |
//   |             |===*10.0.0.1*   *192.168.1.1*=== |************* |
//   |*************|   **********   *************    |*eth_client * |
//   |*eth_server *|       |  ROUTER   |             |*192.168.1.2* |
//   |* 10.0.0.2  *|       +-----------+             |************* |
//   \************/                                  \+------------+/
//    +----------+
//


//AddressInfo :  Define names for IP and ETHERNET addresses
//for future use in the script since it is more easy to
//handle name that numeric addresses
//              IP ADDRESS    IP NETWORK ADDRESS   ETHERNET ADDRESS
AddressInfo(
	eth0          192.168.1.1     192.168.1.0/24  00:04:75:d4:25:c2,
	eth1          10.0.0.1        10.0.0.0/8      00:c0:4f:32:8a:24,
	eth_client    192.168.1.2                     00:c0:4f:32:8a:46,
	eth_server    10.0.0.2                        00:c0:4f:9c:29:e7,
);



//------------------------------//
//                              //
//	Compound elements	//
//                              //
//------------------------------//


// Compound element : from_device_class
// Abstract : Make a copy of the packets from $device for the sniffer
// Input : none
// Output : packets from $device
elementclass from_device_class {
	$device |
	// Declarations
	from_device :: FromDevice($device);
	copy_for_sniffing :: Tee;
	// Connections
	from_device -> SetCycleCount -> copy_for_sniffing;
	copy_for_sniffing[1] -> ToHostSniffers($device);
	copy_for_sniffing[0] -> output;
}


// Compound element : to_device_class
// Abstract : Make a copy for the sniffer, and send them to $device
// Input : packets
// Ouput : none
elementclass to_device_class {
	$device |
	// Declarations
	to_device :: ToDevice($device);
	copy_for_sniffing :: PullTee;
	// Connections
	input -> copy_for_sniffing;
	copy_for_sniffing[1] -> ToHostSniffers($device);
	copy_for_sniffing[0] -> to_device;
}


// Compound element : IP routing
// Abstract : Route IP packets to the correct destination
// Input : IP packets
// Ouput : IP packets for eth0 in output 0, packets for eth1 in output 1
elementclass ip_routing_class {
	// Declaration
	ip_classifier :: IPClassifier(dst host eth_client,
				dst host eth_server,
				dst host eth0,
				dst host eth1,
				-);
	// Connections
	input -> CheckIPHeader -> GetIPAddress(16) -> ip_classifier;
	
	// IP packets for localhost
	ip_classifier[2] -> EtherEncap(0x0800, 1:1:1:1:1:1, eth0) -> ToHost;
	ip_classifier[3] -> EtherEncap(0x0800, 1:1:1:1:1:1, eth1) -> ToHost;

	// IP packets for graveyard
	ip_classifier[4] -> Discard;

	// IP packets for eth0
	ip_classifier[0] -> [0]output;
	// IP packets for eth1
	ip_classifier[1] -> [1]output;
}



//----------------------//
//                      //
//	Declarations	//
//                      //
//----------------------//

// Devices
from_client :: from_device_class(eth0);
from_server :: from_device_class(eth1);
to_client :: to_device_class(eth0);
to_server :: to_device_class(eth1);

queue0 :: Queue(5000);
queue1 :: Queue(5000);

classifier0 :: Classifier(	12/0806 20/0001,
				12/0806 20/0002,
				12/0800,
				-);
classifier1 :: Classifier(	12/0806 20/0001,
				12/0806 20/0002,
				12/0800,
				-);

// ARP
responder0 :: ARPResponder(eth0);
responder1 :: ARPResponder(eth1);
querier0 :: ARPQuerier(eth0);
querier1 :: ARPQuerier(eth1);

ip_packet :: Strip(14);
ip_routing :: ip_routing_class;

tee0 :: Tee;
tee1 :: Tee;



//----------------------//
//                      //
//	Connections	//
//                      //
//----------------------//

// Head
from_client -> classifier0;
from_server -> classifier1;

// Packet classification
//  ARP queries
classifier0[0] -> responder0;
classifier1[0] -> responder1;
//  ARP replies
classifier0[1] -> tee0;
	tee0[0] -> [1]querier0;
	tee0[1] -> ToHost;
classifier1[1] -> tee1;
	tee1[0] -> [1]querier1;
	tee1[1] -> ToHost;
//  IP
classifier0[2] -> ip_packet;
classifier1[2] -> ip_packet;
ip_packet -> ip_routing;
	ip_routing[0] -> [0]querier0;
	ip_routing[1] -> [0]querier1;
//  other
classifier0[3] -> Discard;
classifier1[3] -> Discard;

// Tail
responder0 -> queue0;
responder1 -> queue1;
querier0 -> CycleCountAccum -> queue0;
querier1 -> queue1;
queue0 -> to_client;
queue1 -> to_server;





More information about the click mailing list