X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=src%2Fnat%2Fgnunet-helper-nat-client-windows.c;h=47fbc0b86583f027687ab9a6cc2f5802bf6c1c3c;hb=57aab79c1d1b7036018eca127501632e85c4b37b;hp=0717eecfe12b9c5c93f504daea920701fa3334a5;hpb=11a2d8cd5b619a0fea63e766585c6ec4687a0707;p=oweals%2Fgnunet.git diff --git a/src/nat/gnunet-helper-nat-client-windows.c b/src/nat/gnunet-helper-nat-client-windows.c index 0717eecfe..47fbc0b86 100644 --- a/src/nat/gnunet-helper-nat-client-windows.c +++ b/src/nat/gnunet-helper-nat-client-windows.c @@ -43,6 +43,7 @@ */ #define _GNU_SOURCE +#define FD_SETSIZE 1024 #include #include #include @@ -193,19 +194,14 @@ static uint16_t port; * @return 1 on success */ static int -inet_pton (int af, - const char *cp, - struct in_addr *buf) +inet_pton (int af, const char *cp, struct in_addr *buf) { - buf->s_addr = inet_addr(cp); + buf->s_addr = inet_addr (cp); if (buf->s_addr == INADDR_NONE) - { - fprintf(stderr, - "Error %d handling address %s", - WSAGetLastError(), - cp); - return 0; - } + { + fprintf (stderr, "Error %d handling address %s", WSAGetLastError (), cp); + return 0; + } return 1; } @@ -218,17 +214,16 @@ inet_pton (int af, * @return the CRC 16. */ static uint16_t -calc_checksum(const uint16_t *data, - unsigned int bytes) +calc_checksum (const uint16_t * data, unsigned int bytes) { uint32_t sum; unsigned int i; sum = 0; - for (i=0;i> 16); - sum = htons(0xffff - sum); + sum = htons (0xffff - sum); return sum; } @@ -240,12 +235,11 @@ calc_checksum(const uint16_t *data, * @param other target address */ static void -send_icmp_udp (const struct in_addr *my_ip, - const struct in_addr *other) +send_icmp_udp (const struct in_addr *my_ip, const struct in_addr *other) { - char packet[sizeof(struct ip_header) * 2 + - sizeof(struct icmp_ttl_exceeded_header) + - sizeof(struct udp_header)]; + char packet[sizeof (struct ip_header) * 2 + + sizeof (struct icmp_ttl_exceeded_header) + + sizeof (struct udp_header)]; struct ip_header ip_pkt; struct icmp_ttl_exceeded_header icmp_pkt; struct udp_header udp_pkt; @@ -257,86 +251,74 @@ send_icmp_udp (const struct in_addr *my_ip, off = 0; ip_pkt.vers_ihl = 0x45; ip_pkt.tos = 0; - ip_pkt.pkt_len = htons(sizeof (packet)); - ip_pkt.id = htons(256); + ip_pkt.pkt_len = htons (sizeof (packet)); + ip_pkt.id = htons (256); ip_pkt.flags_frag_offset = 0; ip_pkt.ttl = 128; ip_pkt.proto = IPPROTO_ICMP; ip_pkt.checksum = 0; ip_pkt.src_ip = my_ip->s_addr; ip_pkt.dst_ip = other->s_addr; - ip_pkt.checksum = htons(calc_checksum((uint16_t*)&ip_pkt, - sizeof (struct ip_header))); - memcpy(&packet[off], - &ip_pkt, - sizeof(struct ip_header)); - off += sizeof(struct ip_header); + ip_pkt.checksum = + htons (calc_checksum ((uint16_t *) & ip_pkt, sizeof (struct ip_header))); + memcpy (&packet[off], &ip_pkt, sizeof (struct ip_header)); + off += sizeof (struct ip_header); icmp_pkt.type = ICMP_TIME_EXCEEDED; icmp_pkt.code = 0; icmp_pkt.checksum = 0; icmp_pkt.unused = 0; - memcpy(&packet[off], - &icmp_pkt, - sizeof(struct icmp_ttl_exceeded_header)); - off += sizeof(struct icmp_ttl_exceeded_header); + memcpy (&packet[off], &icmp_pkt, sizeof (struct icmp_ttl_exceeded_header)); + off += sizeof (struct icmp_ttl_exceeded_header); /* ip header of the presumably 'lost' udp packet */ ip_pkt.vers_ihl = 0x45; ip_pkt.tos = 0; - ip_pkt.pkt_len = htons(sizeof (struct ip_header) + - sizeof (struct udp_header)); - ip_pkt.id = htons(0); + ip_pkt.pkt_len = + htons (sizeof (struct ip_header) + sizeof (struct udp_header)); + ip_pkt.id = htons (0); ip_pkt.flags_frag_offset = 0; ip_pkt.ttl = 128; ip_pkt.proto = IPPROTO_UDP; ip_pkt.checksum = 0; ip_pkt.src_ip = other->s_addr; ip_pkt.dst_ip = dummy.s_addr; - ip_pkt.checksum = htons(calc_checksum((uint16_t*)&ip_pkt, - sizeof (struct ip_header))); - memcpy(&packet[off], - &ip_pkt, - sizeof(struct ip_header)); - off += sizeof(struct ip_header); + ip_pkt.checksum = + htons (calc_checksum ((uint16_t *) & ip_pkt, sizeof (struct ip_header))); + memcpy (&packet[off], &ip_pkt, sizeof (struct ip_header)); + off += sizeof (struct ip_header); /* build UDP header */ - udp_pkt.src_port = htons(NAT_TRAV_PORT); - udp_pkt.dst_port = htons(NAT_TRAV_PORT); + udp_pkt.src_port = htons (NAT_TRAV_PORT); + udp_pkt.dst_port = htons (NAT_TRAV_PORT); udp_pkt.length = htons (port); udp_pkt.crc = 0; - memcpy(&packet[off], - &udp_pkt, - sizeof(struct udp_header)); - off += sizeof(struct udp_header); + memcpy (&packet[off], &udp_pkt, sizeof (struct udp_header)); + off += sizeof (struct udp_header); /* no go back to calculate ICMP packet checksum */ - icmp_pkt.checksum = htons(calc_checksum((uint16_t*)&packet[off], - sizeof (struct icmp_ttl_exceeded_header) + - sizeof (struct ip_header) + - sizeof (struct udp_header))); - memcpy (&packet[sizeof (struct ip_header)], - &icmp_pkt, - sizeof (struct icmp_ttl_exceeded_header)); + icmp_pkt.checksum = + htons (calc_checksum + ((uint16_t *) & packet[off], + sizeof (struct icmp_ttl_exceeded_header) + + sizeof (struct ip_header) + sizeof (struct udp_header))); + memcpy (&packet[sizeof (struct ip_header)], &icmp_pkt, + sizeof (struct icmp_ttl_exceeded_header)); memset (&dst, 0, sizeof (dst)); dst.sin_family = AF_INET; dst.sin_addr = *other; - err = sendto(rawsock, - packet, - sizeof (packet), 0, - (struct sockaddr*)&dst, - sizeof(dst)); + err = + sendto (rawsock, packet, sizeof (packet), 0, (struct sockaddr *) &dst, + sizeof (dst)); if (err < 0) - { - fprintf(stderr, - "sendto failed: %s\n", strerror(errno)); - } + { + fprintf (stderr, "sendto failed: %s\n", strerror (errno)); + } else if (sizeof (packet) != (size_t) err) - { - fprintf(stderr, - "Error: partial send of ICMP message\n"); - } + { + fprintf (stderr, "Error: partial send of ICMP message\n"); + } } @@ -347,16 +329,15 @@ send_icmp_udp (const struct in_addr *my_ip, * @param other target address */ static void -send_icmp (const struct in_addr *my_ip, - const struct in_addr *other) +send_icmp (const struct in_addr *my_ip, const struct in_addr *other) { struct ip_header ip_pkt; struct icmp_ttl_exceeded_header icmp_ttl; struct icmp_echo_header icmp_echo; struct sockaddr_in dst; char packet[sizeof (struct ip_header) * 2 + - sizeof (struct icmp_ttl_exceeded_header) + - sizeof(struct icmp_echo_header)]; + sizeof (struct icmp_ttl_exceeded_header) + + sizeof (struct icmp_echo_header)]; size_t off; int err; @@ -365,88 +346,77 @@ send_icmp (const struct in_addr *my_ip, ip_pkt.vers_ihl = 0x45; ip_pkt.tos = 0; ip_pkt.pkt_len = htons (sizeof (packet)); - ip_pkt.id = htons(256); + ip_pkt.id = htons (256); ip_pkt.flags_frag_offset = 0; ip_pkt.ttl = IPDEFTTL; ip_pkt.proto = IPPROTO_ICMP; ip_pkt.checksum = 0; ip_pkt.src_ip = my_ip->s_addr; ip_pkt.dst_ip = other->s_addr; - ip_pkt.checksum = htons(calc_checksum((uint16_t*)&ip_pkt, - sizeof (struct ip_header))); - memcpy (&packet[off], - &ip_pkt, - sizeof (struct ip_header)); + ip_pkt.checksum = + htons (calc_checksum ((uint16_t *) & ip_pkt, sizeof (struct ip_header))); + memcpy (&packet[off], &ip_pkt, sizeof (struct ip_header)); off += sizeof (ip_pkt); /* icmp reply: time exceeded */ icmp_ttl.type = ICMP_TIME_EXCEEDED; icmp_ttl.code = 0; icmp_ttl.checksum = 0; - icmp_ttl.unused = 0; - memcpy (&packet[off], - &icmp_ttl, - sizeof (struct icmp_ttl_exceeded_header)); + icmp_ttl.unused = 0; + memcpy (&packet[off], &icmp_ttl, sizeof (struct icmp_ttl_exceeded_header)); off += sizeof (struct icmp_ttl_exceeded_header); /* ip header of the presumably 'lost' udp packet */ ip_pkt.vers_ihl = 0x45; ip_pkt.tos = 0; - ip_pkt.pkt_len = htons(sizeof (struct ip_header) + sizeof (struct icmp_echo_header)); + ip_pkt.pkt_len = + htons (sizeof (struct ip_header) + sizeof (struct icmp_echo_header)); ip_pkt.id = htons (256); ip_pkt.flags_frag_offset = 0; - ip_pkt.ttl = 1; /* real TTL would be 1 on a time exceeded packet */ + ip_pkt.ttl = 1; /* real TTL would be 1 on a time exceeded packet */ ip_pkt.proto = IPPROTO_ICMP; ip_pkt.src_ip = other->s_addr; ip_pkt.dst_ip = dummy.s_addr; ip_pkt.checksum = 0; - ip_pkt.checksum = htons(calc_checksum((uint16_t*)&ip_pkt, - sizeof (struct ip_header))); - memcpy (&packet[off], - &ip_pkt, - sizeof (struct ip_header)); + ip_pkt.checksum = + htons (calc_checksum ((uint16_t *) & ip_pkt, sizeof (struct ip_header))); + memcpy (&packet[off], &ip_pkt, sizeof (struct ip_header)); off += sizeof (struct ip_header); icmp_echo.type = ICMP_ECHO; icmp_echo.code = 0; - icmp_echo.reserved = htonl(port); + icmp_echo.reserved = htonl (port); icmp_echo.checksum = 0; - icmp_echo.checksum = htons(calc_checksum((uint16_t*) &icmp_echo, - sizeof (struct icmp_echo_header))); - memcpy (&packet[off], - &icmp_echo, - sizeof(struct icmp_echo_header)); + icmp_echo.checksum = + htons (calc_checksum + ((uint16_t *) & icmp_echo, sizeof (struct icmp_echo_header))); + memcpy (&packet[off], &icmp_echo, sizeof (struct icmp_echo_header)); /* no go back to calculate ICMP packet checksum */ off = sizeof (struct ip_header); - icmp_ttl.checksum = htons(calc_checksum((uint16_t*) &packet[off], - sizeof (struct icmp_ttl_exceeded_header) + - sizeof (struct ip_header) + - sizeof (struct icmp_echo_header))); - memcpy (&packet[off], - &icmp_ttl, - sizeof (struct icmp_ttl_exceeded_header)); + icmp_ttl.checksum = + htons (calc_checksum + ((uint16_t *) & packet[off], + sizeof (struct icmp_ttl_exceeded_header) + + sizeof (struct ip_header) + sizeof (struct icmp_echo_header))); + memcpy (&packet[off], &icmp_ttl, sizeof (struct icmp_ttl_exceeded_header)); memset (&dst, 0, sizeof (dst)); dst.sin_family = AF_INET; dst.sin_addr = *other; - err = sendto(rawsock, - packet, - sizeof (packet), 0, - (struct sockaddr*)&dst, - sizeof(dst)); + err = + sendto (rawsock, packet, sizeof (packet), 0, (struct sockaddr *) &dst, + sizeof (dst)); if (err < 0) - { - fprintf(stderr, - "sendto failed: %s\n", strerror(errno)); - } + { + fprintf (stderr, "sendto failed: %s\n", strerror (errno)); + } else if (sizeof (packet) != (size_t) err) - { - fprintf(stderr, - "Error: partial send of ICMP message\n"); - } + { + fprintf (stderr, "Error: partial send of ICMP message\n"); + } } @@ -459,34 +429,30 @@ static SOCKET make_raw_socket () { DWORD bOptVal = TRUE; - int bOptLen = sizeof(bOptVal); + int bOptLen = sizeof (bOptVal); SOCKET ret; ret = socket (AF_INET, SOCK_RAW, IPPROTO_RAW); if (INVALID_SOCKET == ret) - { - fprintf (stderr, - "Error opening RAW socket: %s\n", - strerror (errno)); - return INVALID_SOCKET; - } - if (0 != setsockopt(ret, SOL_SOCKET, SO_BROADCAST, (char*)&bOptVal, bOptLen)) - { - fprintf(stderr, - "Error setting SO_BROADCAST to ON: %s\n", - strerror (errno)); - closesocket(rawsock); - return INVALID_SOCKET; - } - - if (0 != setsockopt(ret, IPPROTO_IP, IP_HDRINCL, (char*)&bOptVal, bOptLen)) - { - fprintf(stderr, - "Error setting IP_HDRINCL to ON: %s\n", - strerror (errno)); - closesocket(rawsock); - return INVALID_SOCKET; - } + { + fprintf (stderr, "Error opening RAW socket: %s\n", strerror (errno)); + return INVALID_SOCKET; + } + if (0 != + setsockopt (ret, SOL_SOCKET, SO_BROADCAST, (char *) &bOptVal, bOptLen)) + { + fprintf (stderr, "Error setting SO_BROADCAST to ON: %s\n", + strerror (errno)); + closesocket (rawsock); + return INVALID_SOCKET; + } + + if (0 != setsockopt (ret, IPPROTO_IP, IP_HDRINCL, (char *) &bOptVal, bOptLen)) + { + fprintf (stderr, "Error setting IP_HDRINCL to ON: %s\n", strerror (errno)); + closesocket (rawsock); + return INVALID_SOCKET; + } return ret; } @@ -501,47 +467,38 @@ main (int argc, char *const *argv) unsigned int p; if (argc != 4) - { - fprintf (stderr, - "This program must be started with our IP, the targets external IP, and our port as arguments.\n"); - return 1; - } - if ( (1 != inet_pton (AF_INET, argv[1], &external)) || - (1 != inet_pton (AF_INET, argv[2], &target)) ) - { - fprintf (stderr, - "Error parsing IPv4 address: %s\n", - strerror (errno)); - return 1; - } - if ( (1 != sscanf (argv[3], "%u", &p) ) || - (0 == p) || - (0xFFFF < p) ) - { - fprintf (stderr, - "Error parsing port value `%s'\n", - argv[3]); - return 1; - } + { + fprintf (stderr, + "This program must be started with our IP, the targets external IP, and our port as arguments.\n"); + return 1; + } + if ((1 != inet_pton (AF_INET, argv[1], &external)) || + (1 != inet_pton (AF_INET, argv[2], &target))) + { + fprintf (stderr, "Error parsing IPv4 address: %s\n", strerror (errno)); + return 1; + } + if ((1 != sscanf (argv[3], "%u", &p)) || (0 == p) || (0xFFFF < p)) + { + fprintf (stderr, "Error parsing port value `%s'\n", argv[3]); + return 1; + } port = (uint16_t) p; if (0 != WSAStartup (MAKEWORD (2, 1), &wsaData)) - { - fprintf (stderr, "Failed to find Winsock 2.1 or better.\n"); - return 2; - } + { + fprintf (stderr, "Failed to find Winsock 2.1 or better.\n"); + return 2; + } if (1 != inet_pton (AF_INET, DUMMY_IP, &dummy)) - { - fprintf (stderr, - "Internal error converting dummy IP to binary.\n"); - return 2; - } - if (-1 == (rawsock = make_raw_socket())) + { + fprintf (stderr, "Internal error converting dummy IP to binary.\n"); + return 2; + } + if (-1 == (rawsock = make_raw_socket ())) return 3; - send_icmp (&external, - &target); - send_icmp_udp (&external, - &target); + send_icmp (&external, &target); + send_icmp_udp (&external, &target); closesocket (rawsock); WSACleanup (); return 0;