[Click] arpquerier.{hh|cc}
David Fusté
f2308030 at est.fib.upc.edu
Sat May 21 07:28:55 EDT 2005
Hi,
I need to understand perfectly how the arpquerier element works.
I know there is an "ARPEntry* _map[256]" to save ip-eth translations and
packets not even translateds...
I know there is a lock to protect access to the map...
I know there is a timeout to check, poll, ... old map entries...
And in short, I know how it works well.
However, I have two specific doubts in relation to its implementation:
1. Why is the _lock variable necessary?
I know that it is necessary to acquire and release write/read permission
before write/read the map, but it is necessary?
Each instance of arpquerier has its own map, so, there is no
interference between different instances of arpquerier.
So, is it to protect the case in that click runs in multithreading and
the two elements that can call the push function (the two input ports)
make it at the same time?
2. In "ARPQuerier::handle_ip(Packet* p)" function, more or less, there
are three cases:
a) the destination ip address of packet p is in the map and the
corresponding ARPEntry is ok (has the correct translation).
b) the destination ip address of packet p is in the map but the
corresponding ARPEntry is not ok.
c) the destination ip address of packet p is not in the map.
In case c), handle_ip will make a new ARPEntry and will send the
corresponding ARPRequest with send_query_for(...).
In case b), handle_ip will add the packet to the corresponding ARPEntry
and will send a send_query_for(...).
And in case a), there are two possibilities depending on the polling
flag of the corresponding ARPEntry:
a.1) polling==0 => handle_ip will add the ethernet header to the packet
and will send the packet.
a.2) polling==1 => handle_ip will add the ethernet header to the packet,
will send the packet and moreover will send the corresponding ARPRequest
with send_query_for(...).
Is the case a.2) that I don't understand:
Why if polling==1, handle_ip will send a send_query_for(...)? The map
has the translation, why ask for it?
I know that the expire_hook function (scheduled by a Timer) is the
responsible of set polling=1 when an ARPEntry is "old".
But why polling and not deleting?
Or, is like a margin of security? Is to avoid lose ARPEntries when the
corresponding node is even in the network? Is it necessary?
Do you understand me?
Thank you very very much!
More information about the click
mailing list