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(); } }
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(); } }