void dp_parse_ip (struct dp_handle * handle, const dp_header * header, const u_char * packet) { const struct ip * ip = (struct ip *) packet; if (DP_DEBUG) { fprintf(stdout, "Looking at packet with length %ud\n", header->len); } u_char * payload = (u_char *) packet + sizeof (struct ip); if (handle->callback[dp_packet_ip] != NULL) { int done = (handle->callback[dp_packet_ip]) (handle->userdata, header, packet); if (done) return; } switch (ip->ip_p) { case (6): dp_parse_tcp (handle, header, payload); break; default: // TODO: maybe support for non-tcp IP packets break; } }
void dp_parse_ip6(struct dp_handle *handle, const dp_header *header, const u_char *packet) { const struct ip6_hdr *ip6 = (struct ip6_hdr *)packet; u_char *payload = (u_char *)packet + sizeof(struct ip6_hdr); if (handle->callback[dp_packet_ip6] != NULL) { int done = (handle->callback[dp_packet_ip6])(handle->userdata, header, packet); if (done) return; } switch ((ip6->ip6_ctlun).ip6_un1.ip6_un1_nxt) { case IPPROTO_TCP: dp_parse_tcp(handle, header, payload); break; default: // TODO: maybe support for non-tcp ipv6 packets break; } }