StreamIdentifier StreamIdentifier::make_identifier(const PDU& packet) {
    uint16_t source_port;
    uint16_t dest_port;
    // Extract source and dest ports
    if (const TCP* tcp = packet.find_pdu<TCP>()) {
        source_port = tcp->sport();
        dest_port = tcp->dport();
    }
    else if (const UDP* udp = packet.find_pdu<UDP>()) {
        source_port = udp->sport();
        dest_port = udp->dport();
    }
    else {
        throw invalid_packet();
    }
    // Extract layer 3 and build the identifier
    if (const IP* ip = packet.find_pdu<IP>()) {
        return StreamIdentifier(serialize(ip->src_addr()), source_port,
                                serialize(ip->dst_addr()), dest_port);
    }
    else if (const IPv6* ip = packet.find_pdu<IPv6>()) {
        return StreamIdentifier(serialize(ip->src_addr()), source_port,
                                serialize(ip->dst_addr()), dest_port);
    }
    else {
        throw invalid_packet();
    }
}
Beispiel #2
0
StreamFollower::stream_id StreamFollower::make_stream_id(const PDU& packet) {
    const TCP* tcp = packet.find_pdu<TCP>();
    if (!tcp) {
        throw invalid_packet();
    }
    if (const IP* ip = packet.find_pdu<IP>()) {
        return stream_id(stream_id::serialize(ip->src_addr()), tcp->sport(),
                         stream_id::serialize(ip->dst_addr()), tcp->dport());
    }
    else if (const IPv6* ip = packet.find_pdu<IPv6>()) {
        return stream_id(stream_id::serialize(ip->src_addr()), tcp->sport(),
                         stream_id::serialize(ip->dst_addr()), tcp->dport());
    }
    else {
        throw invalid_packet();
    }
}