Title: find_ass_ent() / ip_ass_table
If an ip packet is fragmented, ip_ass_table (the ip assemble table) holds the fragments until they are reassembled by reassemble(). Each of the 3 elements (which is an oddly small number) of ip_ass_table corresponds to a packet that has been fragmented and is of type ip_ass_t (see below). find_ass_ent() searches through ip_ass_table for fragments of the same packet and adds the fragment to this packet if found and starts a new packet otherwise. If ip_ass_table is full, the oldest fragmented packet is dropped and replaced by the new fragmented packet and an icmp packet is sent to the source of the dropped packet.
typedef struct ip_ass
acc_t *ia_frags: The first fragment in the linked list of fragments. These accessors hold the data contained in the fragments and are linked by the accessors' acc_ext_link field.
ipaddr_t ia_srcaddr, ia_dstaddr;
int ia_proto, ia_id;
int ia_min_ttl: Set to IP_MAX_TTL (#define'd as 255 in in.h). This value is in seconds and is the maximum time that a fragmented packet may be in ip_ass_table before the source is sent an icmp packet.
ip_port_t *ia_port: The ip port on which the packet arrived.
time_t ia_first_time: The time at which the first fragment of the packet is added.
ipaddr_t ia_srcaddr, ia_dstaddr: The source and destination ip address of the fragment.
int ia_proto: The protocol of the packet to which the fragment belongs. For example, if the packet is a udp packet, ia_proto will be 17. If the packet is a tcp packet, ia_proto will be 6.
ia_id: The value of the ih_id field for the ip header of the first packet sent out is determined by ip_init() and is equal to the number of clock ticks since reboot (i.e., the value returned by get_time) and is incremented for each packet sent out. This value is used to combine fragments at the receiving end if fragmentation has occurred. More specifically, if a packet is fragmented during transit, ia_id will be the same for all the fragments.