[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