[Click] Question about cooperating elementclasses

Cliff Frey cliff at meraki.com
Wed Feb 16 16:14:09 EST 2011


Yeah, this sounds like a reasonable implementation to me.

Cliff

On Wed, Feb 16, 2011 at 1:00 PM, Philip Prindeville <
philipp_subx at redfish-solutions.com> wrote:

> Why not just keep a linked list of all the ARPQuerier instances that an
> ARPTable is associated with it, and have it iterate over the list?
>
> In the nominal case, that's going to be a single instance of ARPQuerier
> anyway, so there's no overhead there...
>
> And in my case, I was having to pump a packet either through Tee(n) or else
> RandomSwitch(n) to and deliver it to all or one load-balanced instances...
> which I'm guessing is of at least comparable overhead.
>
>
>
> On 2/16/11 12:46 PM, Cliff Frey wrote:
>
>> I would say that this is a bug by some definition, but it is a very tricky
>> one to solve.  Specifically, even if you did change the queueing to be in
>> arpquerier, you would still need a pointer back from arptable -> arpquerier
>> so that if an arp response came in on one querier that updated the arptable,
>> the arptable would have to wake up the other arpquerier which had a queued
>> packet.
>>
>> I think that most people can get around it by just using different
>> arptables for each arpquerier.
>>
>> Cliff
>>
>> On Tue, Feb 15, 2011 at 1:33 PM, Philip Prindeville <
>> philipp_subx at redfish-solutions.com <mailto:
>> philipp_subx at redfish-solutions.com>> wrote:
>>
>>    Thought about this some more, and it's going to be more of a challenge
>> than I thought.
>>
>>    Part of the problem is that the packets get queued up in the ARPTable,
>> and not in the ARPQuerier, so if you have multiple ARPQuerier instances
>> using the same ARPTable (we do... we're in a threaded/polled environment)
>> then the packet loses the association to the ARPQuerier (and the
>> ARPQuerier's output ports) when it gets queued.
>>
>>    For that matter, I'm not sure that ARPQuerier::handle_response() is
>> correct: all of the packets get put onto the same queue in the ARPTable, so
>> that when the queue gets drained they might not go out on the output ports
>> of the same instance of ARPQuerier that the came in on.
>>
>>    Example:
>>
>>    o1 :: ...
>>    o2 :: ...
>>    at :: ARPTable();
>>
>>    ... -> a1 :: ARPQuerier(TABLE at) -> o1;
>>    ... -> a2 :: ARPQuerier(TABLE at) -> o2;
>>
>>    now let's say that packet p1 comes in on a1, and packet p2 comes in on
>> a2.  Both are destined to x.x.x.x.
>>
>>    Then an ARP response comes back resolving x.x.x.x.
>>
>>    Both packets will be sent to o1, or o2, depending on whether the answer
>> is delivered to a1 or a2...
>>
>>    So packets might be "switched" from the a1...o1 path to o2, or vice
>> versa.
>>
>>    Is this a bug?
>>
>>    Should the queuing (and queue expiration) be happening in the
>> ARPQuerier class instead?
>>
>>    -Philip
>>
>>
>>    On 2/12/11 11:22 AM, Philip Prindeville wrote:
>>    > I wanted to make a change to ARPTable which would give it the ability
>> to invoke a hook back to ARPQuerier when it deletes queued up packages, but
>> wasn't sure if there's a clean way to do this.
>>    >
>>    > In C, I'd just set a pointer to a callback function, but this isn't
>> C.
>>    >
>>    > So what's the best way to do it?  Keep in mind that the ARPTable
>> might have been
>>    >
>>    > Also, it's the case that the same ARPTable instance might be shared
>> amongst several ARPQuerier instances (because we're in a multi-core
>> environment with several threads running on the same NIC).
>>    >
>>    > Oh, one other question about ARPTable vs. ARPQuerier interactions...
>>  if I have that same situation where I'm running multithreaded, and a
>> response packet gets delivered to one ARPQuerier, thereby updating the
>> ARPTable... will the queued up packets in each instance of the ARPQueriers
>> get updated and unblock the packets?
>>    >
>>    > Or are the queued packets actually held by the ARPTable (and
>> therefore in a single place)?
>>    >
>>    > Looking at how ARPQuerier::handle_ip() and
>> ARPQuerier::handle_response() interact, it looks like the packets are all
>> held by the ARPTable, and when the queue gets drained, all drained by the
>> same instance... so any affinity of individual packets to threads is lost.
>>    >
>>    > Packet *cached_packet;
>>    > arpt->insert(ipa, ena,&cached_packet);
>>    >
>>    > while (cached_packet) {
>>    >       Packet *next = cached_packet->next();
>>    >       handle_ip(cached_packet, true);
>>    >       cached_packet = next;
>>    > }
>>    >
>>    >
>>    > Correct?
>>    >
>>    > Thanks.
>>    >
>>    > -Philip
>>
>>    _______________________________________________
>>    click mailing list
>>    click at amsterdam.lcs.mit.edu <mailto:click at amsterdam.lcs.mit.edu>
>>
>>    https://amsterdam.lcs.mit.edu/mailman/listinfo/click
>>
>>
>>
>


More information about the click mailing list