int AnalyzeIpv6(u_char *data,int size) { u_char *ptr; int lest; struct ip6_hdr *ip6; int len; ptr=data; lest=size; if(lest<sizeof(struct ip6_hdr)){ fprintf(stderr,"lest(%d)<sizeof(struct ip6_hdr)\n",lest); return(-1); } ip6=(struct ip6_hdr *)ptr; ptr+=sizeof(struct ip6_hdr); lest-=sizeof(struct ip6_hdr); if(fil[5] == 1){ PrintIp6Header(ip6,stdout); } if(ip6->ip6_nxt==IPPROTO_ICMPV6){ len=ntohs(ip6->ip6_plen); if(checkIP6DATAchecksum(ip6,ptr,len)==0){ fprintf(stderr,"bad icmp6 checksum\n"); return(-1); } AnalyzeIcmp6(ptr,lest); } else if(ip6->ip6_nxt==IPPROTO_TCP){ len=ntohs(ip6->ip6_plen); if(checkIP6DATAchecksum(ip6,ptr,len)==0){ fprintf(stderr,"bad tcp6 checksum\n"); return(-1); } AnalyzeTcp(ptr,lest); } else if(ip6->ip6_nxt==IPPROTO_UDP){ len=ntohs(ip6->ip6_plen); if(checkIP6DATAchecksum(ip6,ptr,len)==0){ fprintf(stderr,"bad udp6 checksum\n"); return(-1); } AnalyzeUdp(ptr,lest); } return(0); }
int AnalyzeIpv6(u_char *data, int size) { u_char *ptr = NULL; int lest = 0; struct ip6_hdr *ip6 = NULL; int len = 0; ptr = data; lest = size; if (lest < sizeof(struct ip6_hdr)) { ExitWithTooLittleLengthError("ip6_hdr", lest); } ip6 = (struct ip6_hdr *) ptr; ptr += sizeof(struct ip6_hdr); lest += sizeof(struct ip6_hdr); PrintIp6Header(ip6, stdout); if (ip6->ip6_nxt == IPPROTO_ICMPV6) { len = ntohs(ip6->ip6_plen); if (checkIP6DATAchecksum(ip6, ptr, len) == 0) { ExitWithBadChecksumError("icmp6"); } AnalyzeIcmp6(ptr, lest); } else if (ip6->ip6_nxt == IPPROTO_TCP) { // next header len =ntohs(ip6->ip6_plen); // payload length if (checkIPDATAchecksum(ip6, ptr, len) == 0) { ExitWithBadChecksumError("tcp6"); } AnalyzeTcp(ptr, lest); } else if (ip6->ip6_nxt == IPPROTO_UDP) { len = ntohs(ip6->ip6_plen); if (checkIP6DATAchecksum(ip6, ptr, len) == 0) { ExitWithBadChecksumError("udp6"); } AnalyzeUdp(ptr, lest); } return 0; }