Beispiel #1
0
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);
}
Beispiel #2
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;
}