[Click] AGNOSTIC vs. PUSH/PULL

Jesse Brown jesse.r.brown at lmco.com
Tue Mar 2 13:22:06 EST 2010


Eddie:

Thank you for the feedback - Cliff's suggestion of a shared state 
element coupled with the description below solve my problem exactly.

Jesse

Eddie Kohler wrote:
> Jesse,
>
> We have very few elements that behave as you describe: N inputs and N 
> outputs, and all packets from input N are emitted on output N.  For 
> that reason I don't think it's worthwhile to change the default push() 
> and pull() behavior. simple_action() is after all meant to be simple.
>
> Your element sounds like it wants the following definition:
>
> elementclass Foo {
>   ...
>   const char *flow_code() const { return "#/#"; }
>   ...
>   void push(int port, Packet *p) {
>      if ((p = simple_action(p)))
>          output(port).push(p);
>   }
>   Packet *pull(int port) {
>      Packet *p = input(port).pull();
>      if (p)
>          p = simple_action(p);
>      return p;
>   }
> };
>
> Note the flow_code().  Without the flow_code(), Click will believe 
> that packets arriving on any port could be emitted on any port, and 
> you won't get the agnostic behavior you might expect.
>
> Eddie
>
>
> Jesse Brown wrote:
>> All:
>>
>> I am currently working on a router config that looks similar to the 
>> following:
>>
>>   elementclass Monitor {
>>      input ->
>>      ipc :: IPClassifier (tcp, udp, icmp, -);
>>      f :: Foo;
>>
>>      ipc[0] -> Print("tcp-in") -> [0]f[0] -> Print("tcp-out") -> output;
>>      ipc[1] -> Print("udp-in") -> [1]f[1] -> Print("udp-out") -> output;
>>      ipc[2] -> Print("icmp-in") -> [2]f[2] -> Print("icmp-out") -> 
>> output;
>>      ipc[3] -> Print("other-in") -> [3]f[3] -> Print("other-out") -> 
>> output;
>>   }
>>
>>   FromDevice(eth0, PROMISC true) ->
>>      ... ->
>>      Monitor ->
>>      ... ->
>>      Queue -> ToDevice(eth1);
>>
>>
>> This is obviously simplified but conveys my point, I think.
>> If I define Foo as
>>   const char *class_name() const    { return "Foo"; }
>>   const char *port_count() const    { return "-/-"; }
>>   const char *processing() const    { return AGNOSTIC; }
>>
>>   Packet *simple_action(Packet *);
>>
>> Then I will always get
>>
>>   icmp-in:   98 | 00151715 a8e50015 17163621 08004500 00540000 40004001
>>   tcp-out:   98 | 00151715 a8e50015 17163621 08004500 00540000 40004001
>>
>> Due to how Element::push behaves.
>>
>> In order to have a single copy of this element that can be located 
>> anywhere in a router I have to define Foo::simple_action, Foo::pull, 
>> and Foo::push. Is there a more standard way to get the behavior I am 
>> after? My desired result would look like:
>>
>>   icmp-in:   98 | 00151715 a8e50015 17163621 08004500 00540000 40004001
>>   icmp-out:   98 | 00151715 a8e50015 17163621 08004500 00540000 40004001
>>
>> in the above example.
>>
>> Also, is there a reason that both Element::push and Element::pull 
>> ignore the port by default? Would the attached patch break existing 
>> behavior?
>>
>> Thanks,
>>
>> Jesse
>>
>>
>> ------------------------------------------------------------------------
>>
>> _______________________________________________
>> click mailing list
>> click at amsterdam.lcs.mit.edu
>> https://amsterdam.lcs.mit.edu/mailman/listinfo/click
>




More information about the click mailing list