int recv_address (int code, void *closure, struct sockaddr_in *dest, struct sockaddr_in *from, struct ip *ip, icmphdr_t * icmp, int datalen) { switch (code) { case PEV_RESPONSE: case PEV_DUPLICATE: print_address (code == PEV_DUPLICATE, closure, dest, from, ip, icmp, datalen); break; case PEV_NOECHO:; print_icmp_header (from, ip, icmp, datalen); } return 0; }
/* * Process a packet on the transport layer. * * @param recvsize: size of the captured data * @param packet: packet capture data target structure * @param raw: packet data at layer 4 entry */ bool process_transport_layer(size_t recvsize, struct packet* packet, byte* raw) { // switch over layer 4 protocol switch( packet->transport_layer_code ) { break;case PRO_ICMP: if( recvsize < sizeof(struct icmphdr) ) { printf("ERROR Received data indicates an ICMP header but it is incomplete\n"); return false; } extract_icmp_header( packet, raw ); print_icmp_header( packet ); break;case PRO_TCP: if( recvsize < sizeof(struct tcphdr) ) { printf("ERROR Received data indicates a TCP header but it is incomplete\n"); return false; } extract_tcp_header( packet, raw ); print_tcp_header( packet ); break;case PRO_UDP: if( recvsize < sizeof(struct udphdr) ) { printf("ERROR Received data indicates an UDP header but it is incomplete\n"); return false; } extract_udp_header( packet, raw ); print_udp_header( packet ); break;case UNKNOWN_TRANSPORT_PROTOCOL: printf("Unknown transport layer protocol.\n"); return false; } return true; }