Hey Philip,

Thanks for your patience...

It is certainly possible that ARPQuerier should do the queueing instead of 
ARPTable.

The "logic" for for the current behavior is as follows: ARP responses are 
sensitive to a given NIC, so if multiple ARPQueriers share an ARPTable, it's 
OK that all queued packets are emitted from *WHICHEVER* ARPQuerier happens to 
receive the response.

I don't completely buy this "logic".  But could you explain more about your 
application, to help me understand the ideal final behavior?  Why do you want 
to share ARPTables?  Is this a sort of a RouterBricks thing, where you have 
multiple ARPQueriers on different threads, writing to multiple output queues 
on THE SAME output NIC?

Eddie


On 02/12/2011 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
> [email protected]
> https://amsterdam.lcs.mit.edu/mailman/listinfo/click
_______________________________________________
click mailing list
[email protected]
https://amsterdam.lcs.mit.edu/mailman/listinfo/click

Reply via email to