void do_ip(void *p) { struct iphdr *ip = p; g.packet_ip++; if(g.print_flag_ip) print_ip(ip); void *data = ip; data += ip->ihl << 2; switch(ip->protocol) { case IPPROTO_TCP: do_tcp(data); break; case IPPROTO_UDP: do_udp(data); break; case IPPROTO_ICMP: do_icmp(data); break; case IPPROTO_IGMP: do_igmp(data); break; } }
void do_ip( char * data ) { global.packet_ip ++; struct iphdr *pip; pip = ( struct iphdr * ) data; /* pip = point to ip layer */ if( global.print_flag_ip ) print_ip( pip ); char * pdata = data + pip->ihl * 4; switch( pip->protocol ){ case IPPROTO_ICMP: do_icmp( pdata ); break; case IPPROTO_IGMP: do_igmp( pdata ); break; case IPPROTO_TCP: do_tcp( pdata ); break; case IPPROTO_UDP: do_udp( pdata ); break; default: printf("IP: 未知其上层协议.\n"); break; } }