void IPv4Stream::add_fragment(IP *ip) { fragments_type::iterator it = fragments.begin(); uint16_t offset = extract_offset(ip); while(it != fragments.end() && offset > it->offset()) { ++it; } // No duplicates plx if(it != fragments.end() && it->offset() == offset) return; fragments.insert(it, IPv4Fragment(ip->inner_pdu(), offset)); received_size += ip->inner_pdu()->size(); if(!extract_more_frag(ip)) { total_size = offset + ip->inner_pdu()->size(); received_end = true; } if(offset == 0) transport_proto = ip->protocol(); }
void IPv4Stream::add_fragment(IP* ip) { const uint16_t offset = extract_offset(ip); fragments_type::iterator it = fragments_.begin(); while (it != fragments_.end() && offset > it->offset()) { ++it; } // No duplicates plx if (it != fragments_.end() && it->offset() == offset) { return; } fragments_.insert(it, IPv4Fragment(ip->inner_pdu(), offset)); received_size_ += ip->inner_pdu()->size(); // If the MF flag is off if ((ip->flags() & IP::MORE_FRAGMENTS) == 0) { total_size_ = offset + ip->inner_pdu()->size(); received_end_ = true; } if (offset == 0) { // Release the inner PDU, store this first fragment and restore the inner PDU PDU* inner_pdu = ip->release_inner_pdu(); first_fragment_ = *ip; ip->inner_pdu(inner_pdu); } }