コード例 #1
0
ファイル: udp6.c プロジェクト: ZerxXxes/ip-sla-responder
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;
}
コード例 #2
0
ファイル: rewrite.c プロジェクト: vinsworldcom/pcaps
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
        }
    }
}