[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