Exemple #1
0
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);
    }
}