July 2007
Intermediate to advanced
332 pages
10h 4m
English
The filter class gateway (Example 11-47), in this simple example, only checks for FTP applications. If it is an FTP command, it looks at the application payload that would contain a command port somewhere. (In this packet trace input, all the rest of the packet has been thrown away.) The ALG modifies the mapped_ports_table to anticipate receiving FTP packets for this command port.
Example 11-47. Filter to check for specific (FTP) applications
class gateway : public tbb::filter { const ip_t outgoing_ip; const nic_t outgoing_nic; // port => address, // where port={router mapped port | home device port} // and // address = {home device port | pair(IP, router mapped port)} mapped_ports_table& mapped_ports; public: gateway (ip_t& _outgoing_ip, nic_t& _outgoing_nic, mapped_ports_table& _mapped_ports) : outgoing_ip(_outgoing_ip), outgoing_nic(_outgoing_nic), mapped_ports(_mapped_ports), filter (true /* is_serial*/) { } void* operator() (void* item) { packet_trace* packet = static_cast<packet_trace*> (item); if (packet->packetDestPort == FTPcmdPort) { // outbound packet sends FTP command // packetPayloadApp contains data port – // save it in ports table add_new_mapping (packet->packetSrcIp, packet->packetPayloadApp, packet->packetSrcPort); packet->packetSrcIp = outgoing_ip; packet->packetPayloadApp = packet->packetSrcPort; } return packet; } port_t& add_new_mapping (ip_t& ip, port_t& port, port_t& new_port) { port_number* mapped_port = new port_number (port); ...