[Click] OutputChooser
Dagang
DAGANG.LI at student.kuleuven.ac.be
Tue Apr 20 14:59:34 EDT 2004
Hello clickall,
I am a new user of click (1.3pre1). Now I am trying to make some new
elements myself. I need an element that has the simple functionality of
pushing incoming packets onto just one of its outputs(based on the value
of a variable), therefore I call it OutputChooser. It is based on Tee.
I copied the source of Tee into OutputChooser, only changing the name.
It compiled and worked just like a Tee. Fine. Then I made some
modification on the push() method, as shown below:
---Tee.cc--------------
void
Tee::push(int, Packet *p)
{
int n = noutputs();
for (int i = 0; i < n - 1; i++)
if (Packet *q = p->clone())
output(i).push(q);
output(n - 1).push(p);
}
------------------------
---OutputChooser.cc-----
void
OutputChooser::push(int, Packet *p)
{
output(1).push(p);
}
------------------------
I used this new element in a configuration working in kernel mode as
shown below:
// MN.click
----------------------------------
AddressInfo(
mobnod 10.0.0.200 10.0.0.0/24,
gatway 10.0.0.4 10.0.0.0/24,
dev1 00:B0:D0:3A:39:31,
dev2 00:05:5D:E2:09:A5
);
dev :: FromDevice(eth0)
-> cl_mn :: Classifier(12/0800 23/01, //icmp
12/0800 23/11, //udp
-);
cl_mn[1] -> Strip(14)
-> CheckIPHeader
-> GetIPAddress(16)
-> ipcl_mn :: IPClassifier(src udp port 434, -);
cl_mn[2] -> oc_sta1 :: Tee(4); // other packets
cl_mn[0] -> oc_sta1;
ipcl_mn[0] -> EtherEncap(0x0800, 1:1:1:1:1:1, 2:2:2:2:2:2) -> oc_sta1;
// registration reply
ipcl_mn[1] -> EtherEncap(0x0800, 1:1:1:1:1:1, 2:2:2:2:2:2)
-> oc_sta1; // other udp packets
// When status is not clear
oc_sta1[0] -> Print(uclr) -> Discard; //status unclear
oc_sta1[3] -> Print(pend) -> Discard; //registration pending
// When at home, employ ARP
// 0. ARP Query
// 1. ARP Response
// 2. Other
oc_sta1[1] -> Print(home)
-> cl_home :: Classifier(12/0806 20/0001,
12/0806 20/0002,
-);
cl_home[0] -> ARPResponder(mobnod:ip dev1)
-> tod :: Queue(2000) -> ToDevice(eth0);
cl_home[1] -> oc_arpq2 :: Tee(2);
cl_home[2] -> ToHost(fake);
// When not at home, discard all ARP queries
// 0. ARP packets
// 1. Other
oc_sta1[2] -> Discard;
// packets going outwards
FromHost (fake, mobnod)
-> fromhost_cl :: Classifier(12/0806, 12/0800, -);
fromhost_cl[0] -> ARPResponder(0.0.0.0/0 1:1:1:1:1:1) -> ToHost(fake);
fromhost_cl[1] -> oc_sta2 :: OutputChooser(4); // IP
fromhost_cl[2] -> Discard; // othe packets
oc_sta2[0] -> Discard; // not clear
oc_sta2[3] -> Discard; // registation pending
oc_sta2[1] // at home
-> Strip(14)
-> CheckIPHeader
-> GetIPAddress(16)
-> rt1 :: LinearIPLookup(10.0.0.200/32 0,
10.0.0.0/32 0,
10.0.0.255/32 0,
255.255.255.255/32 0,
10.0.0/24 1,
0/0 gatway:ip 1);
rt1[0] ->EtherEncap(0x0800, 1:1:1:1:1:1, 2:2:2:2:2:2) -> ToHost(fake);
rt1[1] -> arpq1 :: ARPQuerier(mobnod:ip, dev1:eth)
-> tod;//dev;
oc_arpq2[0] -> [1]arpq1;
oc_arpq2[1] -> Discard;
oc_sta2[2] -> Discard; //away
----------------
Now comes the wierd thing: It works fine for ping, ssh, telnet, but when
I try to use a brower to visit a heavy-loaded webpage,
www.tomshardware.com for instance, the brower stalls, and I can reach no
where since then, even for ping. Re'click-install', nework back, reload
webpage, network gone...
If I change OutputChoose back to Tee, everyting's ok.
I really have no idea so I write everything down. The .click
configuration might looks bizzard, because I comment off a lot of unused
thing to make it simpler. Any suggestion would be highly appreciated.
Best regards,
Dagang
More information about the click
mailing list