int process_udp6(u_char *buffer, size_t length, struct config_s *config, size_t ip6_start) { uint16_t tmp; if (process_cisco6(buffer, length, config, ip6_start) && process_echo6(buffer, length, config, ip6_start)) return -1; tmp = *(uint16_t*)(buffer + UDP6_O_DSTPORT); *(uint16_t*)(buffer + UDP6_O_DSTPORT) = *(uint16_t*)(buffer + UDP6_O_SRCPORT); *(uint16_t*)(buffer + UDP6_O_SRCPORT) = tmp; *(uint16_t*)(buffer+UDP6_O_CHECKSUM) = 0; tcp6_checksum(buffer+IP6_O_SADDR, buffer+IP6_O_DADDR, 0x11, buffer+UDP6_START, ntohs(*(uint16_t*)(buffer+UDP6_O_LEN)), (uint16_t*)(buffer+UDP6_O_CHECKSUM)); if (*(uint16_t*)(buffer+UDP6_O_CHECKSUM) == 0) *(uint16_t*)(buffer+UDP6_O_CHECKSUM) = 0xffff; return 0; }
void rewriteIpv6( char* argv, int len, char* ipv6 ) { PETH_HDR ether; PIP6_HDR ip6; PTCP_HDR tcp; PUDP_HDR udp; PICMP6_HDR icmp6; int ulen; ether = (PETH_HDR)argv; // IPv6 if ( ntohs( ether->ether_type ) == ETHER_TYPE_IP6 ) { #ifdef DEBUG printf("rewrite.c - IPv6 rewrite\n"); #endif if ( checkPacketNotLen( len, ( ETHER_HDRLEN + IP6_HDRLEN ) ) ) return; ip6 = (PIP6_HDR)(argv + ETHER_HDRLEN); inet_pton( AF_INET6, ipv6, &(ip6->ip6_src) ); // TCP checksum if ( ip6->ip6_nxt == IPPROTO_TCP ) { ulen = len - ETHER_HDRLEN - IP6_HDRLEN; if ( checkPacketNotLen( len, ( ETHER_HDRLEN + IP6_HDRLEN + TCP_HDRLEN ) ) ) return; tcp = (PTCP_HDR)(argv + ETHER_HDRLEN + IP6_HDRLEN ); tcp->tcp_checksum = 0; tcp->tcp_checksum = tcp6_checksum( tcp, ulen, ip6->ip6_src, ip6->ip6_dst ); #ifdef DEBUG printf("rewrite.c - TCPv6 checksum recalculated = %x\n", ntohs( tcp->tcp_checksum ) ); #endif } // UDP checksum if ( ip6->ip6_nxt == IPPROTO_UDP ) { ulen = len - ETHER_HDRLEN - IP6_HDRLEN; if ( checkPacketNotLen( len, ( ETHER_HDRLEN + IP6_HDRLEN + UDP_HDRLEN ) ) ) return; udp = (PUDP_HDR)(argv + ETHER_HDRLEN + IP6_HDRLEN ); udp->udp_checksum = 0; udp->udp_checksum = udp6_checksum( udp, ulen, ip6->ip6_src, ip6->ip6_dst ); #ifdef DEBUG printf("rewrite.c - UDPv6 checksum recalculated = %x\n", ntohs( udp->udp_checksum ) ); #endif } // ICMPv6 checksum if ( ip6->ip6_nxt == IPPROTO_ICMPV6 ) { ulen = len - ETHER_HDRLEN - IP6_HDRLEN; if ( checkPacketNotLen( len, ( ETHER_HDRLEN + IP6_HDRLEN + ICMP6_HDRLEN ) ) ) return; icmp6 = (PICMP6_HDR)(argv + ETHER_HDRLEN + IP6_HDRLEN ); icmp6->icmp6_checksum = 0; icmp6->icmp6_checksum = icmp6_checksum( icmp6, ulen, ip6->ip6_src, ip6->ip6_dst ); #ifdef DEBUG printf("rewrite.c - ICMPv6 checksum recalculated = %x\n", ntohs( icmp6->icmp6_checksum ) ); #endif } } }