aboutsummaryrefslogtreecommitdiff
path: root/src/transport/gnunet-nat-server-windows.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/transport/gnunet-nat-server-windows.c')
-rw-r--r--src/transport/gnunet-nat-server-windows.c144
1 files changed, 72 insertions, 72 deletions
diff --git a/src/transport/gnunet-nat-server-windows.c b/src/transport/gnunet-nat-server-windows.c
index 11c63aa9d..f882641e9 100644
--- a/src/transport/gnunet-nat-server-windows.c
+++ b/src/transport/gnunet-nat-server-windows.c
@@ -82,64 +82,64 @@
82/** 82/**
83 * IPv4 header. 83 * IPv4 header.
84 */ 84 */
85struct ip_header 85struct ip_header
86{ 86{
87 87
88 /** 88 /**
89 * Version (4 bits) + Internet header length (4 bits) 89 * Version (4 bits) + Internet header length (4 bits)
90 */ 90 */
91 uint8_t vers_ihl; 91 uint8_t vers_ihl;
92 92
93 /** 93 /**
94 * Type of service 94 * Type of service
95 */ 95 */
96 uint8_t tos; 96 uint8_t tos;
97 97
98 /** 98 /**
99 * Total length 99 * Total length
100 */ 100 */
101 uint16_t pkt_len; 101 uint16_t pkt_len;
102 102
103 /** 103 /**
104 * Identification 104 * Identification
105 */ 105 */
106 uint16_t id; 106 uint16_t id;
107 107
108 /** 108 /**
109 * Flags (3 bits) + Fragment offset (13 bits) 109 * Flags (3 bits) + Fragment offset (13 bits)
110 */ 110 */
111 uint16_t flags_frag_offset; 111 uint16_t flags_frag_offset;
112 112
113 /** 113 /**
114 * Time to live 114 * Time to live
115 */ 115 */
116 uint8_t ttl; 116 uint8_t ttl;
117 117
118 /** 118 /**
119 * Protocol 119 * Protocol
120 */ 120 */
121 uint8_t proto; 121 uint8_t proto;
122 122
123 /** 123 /**
124 * Header checksum 124 * Header checksum
125 */ 125 */
126 uint16_t checksum; 126 uint16_t checksum;
127 127
128 /** 128 /**
129 * Source address 129 * Source address
130 */ 130 */
131 uint32_t src_ip; 131 uint32_t src_ip;
132 132
133 /** 133 /**
134 * Destination address 134 * Destination address
135 */ 135 */
136 uint32_t dst_ip; 136 uint32_t dst_ip;
137}; 137};
138 138
139/** 139/**
140 * Format of ICMP packet. 140 * Format of ICMP packet.
141 */ 141 */
142struct icmp_ttl_exceeded_header 142struct icmp_ttl_exceeded_header
143{ 143{
144 uint8_t type; 144 uint8_t type;
145 145
@@ -205,16 +205,16 @@ static struct in_addr dummy;
205 * @param bytes number of bytes in data (must be multiple of 2) 205 * @param bytes number of bytes in data (must be multiple of 2)
206 * @return the CRC 16. 206 * @return the CRC 16.
207 */ 207 */
208static uint16_t 208static uint16_t
209calc_checksum(const uint16_t *data, 209calc_checksum(const uint16_t *data,
210 unsigned int bytes) 210 unsigned int bytes)
211{ 211{
212 uint32_t sum; 212 uint32_t sum;
213 unsigned int i; 213 unsigned int i;
214 214
215 sum = 0; 215 sum = 0;
216 for (i=0;i<bytes/2;i++) 216 for (i=0;i<bytes/2;i++)
217 sum += data[i]; 217 sum += data[i];
218 sum = (sum & 0xffff) + (sum >> 16); 218 sum = (sum & 0xffff) + (sum >> 16);
219 sum = htons(0xffff - sum); 219 sum = htons(0xffff - sum);
220 return sum; 220 return sum;
@@ -229,17 +229,17 @@ calc_checksum(const uint16_t *data,
229 * @param buf where to write the address result 229 * @param buf where to write the address result
230 * @return 1 on success 230 * @return 1 on success
231 */ 231 */
232static int 232static int
233inet_pton (int af, 233inet_pton (int af,
234 const char *cp, 234 const char *cp,
235 struct in_addr *buf) 235 struct in_addr *buf)
236{ 236{
237 buf->s_addr = inet_addr(cp); 237 buf->s_addr = inet_addr(cp);
238 if (buf->s_addr == INADDR_NONE) 238 if (buf->s_addr == INADDR_NONE)
239 { 239 {
240 fprintf(stderr, 240 fprintf(stderr,
241 "Error %d handling address %s", 241 "Error %d handling address %s",
242 WSAGetLastError(), 242 WSAGetLastError(),
243 cp); 243 cp);
244 return 0; 244 return 0;
245 } 245 }
@@ -275,8 +275,8 @@ send_icmp_echo (const struct in_addr *my_ip)
275 ip_pkt.dst_ip = dummy.s_addr; 275 ip_pkt.dst_ip = dummy.s_addr;
276 ip_pkt.checksum = htons(calc_checksum((uint16_t*)&ip_pkt, 276 ip_pkt.checksum = htons(calc_checksum((uint16_t*)&ip_pkt,
277 sizeof (struct ip_header))); 277 sizeof (struct ip_header)));
278 memcpy (&packet[off], 278 memcpy (&packet[off],
279 &ip_pkt, 279 &ip_pkt,
280 sizeof (struct ip_header)); 280 sizeof (struct ip_header));
281 off += sizeof (struct ip_header); 281 off += sizeof (struct ip_header);
282 282
@@ -284,28 +284,28 @@ send_icmp_echo (const struct in_addr *my_ip)
284 icmp_echo.code = 0; 284 icmp_echo.code = 0;
285 icmp_echo.reserved = 0; 285 icmp_echo.reserved = 0;
286 icmp_echo.checksum = 0; 286 icmp_echo.checksum = 0;
287 icmp_echo.checksum = htons(calc_checksum((uint16_t*) &icmp_echo, 287 icmp_echo.checksum = htons(calc_checksum((uint16_t*) &icmp_echo,
288 sizeof (struct icmp_echo_header))); 288 sizeof (struct icmp_echo_header)));
289 memcpy (&packet[off], 289 memcpy (&packet[off],
290 &icmp_echo, 290 &icmp_echo,
291 sizeof (struct icmp_echo_header)); 291 sizeof (struct icmp_echo_header));
292 off += sizeof (struct icmp_echo_header); 292 off += sizeof (struct icmp_echo_header);
293 293
294 memset (&dst, 0, sizeof (dst)); 294 memset (&dst, 0, sizeof (dst));
295 dst.sin_family = AF_INET; 295 dst.sin_family = AF_INET;
296 dst.sin_addr = dummy; 296 dst.sin_addr = dummy;
297 err = sendto(rawsock, 297 err = sendto(rawsock,
298 packet, off, 0, 298 packet, off, 0,
299 (struct sockaddr*)&dst, 299 (struct sockaddr*)&dst,
300 sizeof(dst)); 300 sizeof(dst));
301 if (err < 0) 301 if (err < 0)
302 { 302 {
303#if VERBOSE 303#if VERBOSE
304 fprintf(stderr, 304 fprintf(stderr,
305 "sendto failed: %s\n", strerror(errno)); 305 "sendto failed: %s\n", strerror(errno));
306#endif 306#endif
307 } 307 }
308 else if (err != off) 308 else if (err != off)
309 { 309 {
310 fprintf(stderr, 310 fprintf(stderr,
311 "Error: partial send of ICMP message\n"); 311 "Error: partial send of ICMP message\n");
@@ -321,23 +321,23 @@ send_udp ()
321{ 321{
322 struct sockaddr_in dst; 322 struct sockaddr_in dst;
323 ssize_t err; 323 ssize_t err;
324 324
325 memset (&dst, 0, sizeof (dst)); 325 memset (&dst, 0, sizeof (dst));
326 dst.sin_family = AF_INET; 326 dst.sin_family = AF_INET;
327 dst.sin_addr = dummy; 327 dst.sin_addr = dummy;
328 dst.sin_port = htons (NAT_TRAV_PORT); 328 dst.sin_port = htons (NAT_TRAV_PORT);
329 err = sendto(udpsock, 329 err = sendto(udpsock,
330 NULL, 0, 0, 330 NULL, 0, 0,
331 (struct sockaddr*)&dst, 331 (struct sockaddr*)&dst,
332 sizeof(dst)); 332 sizeof(dst));
333 if (err < 0) 333 if (err < 0)
334 { 334 {
335#if VERBOSE 335#if VERBOSE
336 fprintf(stderr, 336 fprintf(stderr,
337 "sendto failed: %s\n", strerror(errno)); 337 "sendto failed: %s\n", strerror(errno));
338#endif 338#endif
339 } 339 }
340 else if (0 != err) 340 else if (0 != err)
341 { 341 {
342 fprintf(stderr, 342 fprintf(stderr,
343 "Error: partial send of ICMP message\n"); 343 "Error: partial send of ICMP message\n");
@@ -368,7 +368,7 @@ process_icmp_response ()
368 fprintf (stderr, 368 fprintf (stderr,
369 "Error reading raw socket: %s\n", 369 "Error reading raw socket: %s\n",
370 strerror (errno)); 370 strerror (errno));
371 return; 371 return;
372 } 372 }
373 have_port = 0; 373 have_port = 0;
374#if VERBOSE 374#if VERBOSE
@@ -383,17 +383,17 @@ process_icmp_response ()
383 } 383 }
384 off = 0; 384 off = 0;
385 memcpy (&ip_pkt, 385 memcpy (&ip_pkt,
386 &buf[off], 386 &buf[off],
387 sizeof (struct ip_header)); 387 sizeof (struct ip_header));
388 off += sizeof (struct ip_header); 388 off += sizeof (struct ip_header);
389 memcpy(&source_ip, 389 memcpy(&source_ip,
390 &ip_pkt.src_ip, 390 &ip_pkt.src_ip,
391 sizeof (source_ip)); 391 sizeof (source_ip));
392 memcpy (&icmp_ttl, 392 memcpy (&icmp_ttl,
393 &buf[off], 393 &buf[off],
394 sizeof (struct icmp_ttl_exceeded_header)); 394 sizeof (struct icmp_ttl_exceeded_header));
395 off += sizeof (struct icmp_ttl_exceeded_header); 395 off += sizeof (struct icmp_ttl_exceeded_header);
396 if ( (ICMP_TIME_EXCEEDED != icmp_ttl.type) || 396 if ( (ICMP_TIME_EXCEEDED != icmp_ttl.type) ||
397 (0 != icmp_ttl.code) ) 397 (0 != icmp_ttl.code) )
398 { 398 {
399 /* different type than what we want */ 399 /* different type than what we want */
@@ -401,15 +401,15 @@ process_icmp_response ()
401 } 401 }
402 /* skip 2nd IP header */ 402 /* skip 2nd IP header */
403 memcpy (&ip_pkt, 403 memcpy (&ip_pkt,
404 &buf[off], 404 &buf[off],
405 sizeof (struct ip_header)); 405 sizeof (struct ip_header));
406 off += sizeof (struct ip_header); 406 off += sizeof (struct ip_header);
407 407
408 switch (ip_pkt.proto) 408 switch (ip_pkt.proto)
409 { 409 {
410 case IPPROTO_ICMP: 410 case IPPROTO_ICMP:
411 if (have != (sizeof (struct ip_header) * 2 + 411 if (have != (sizeof (struct ip_header) * 2 +
412 sizeof (struct icmp_ttl_exceeded_header) + 412 sizeof (struct icmp_ttl_exceeded_header) +
413 sizeof (struct icmp_echo_header)) ) 413 sizeof (struct icmp_echo_header)) )
414 { 414 {
415 /* malformed */ 415 /* malformed */
@@ -422,8 +422,8 @@ process_icmp_response ()
422 port = (uint16_t) ntohl (icmp_echo.reserved); 422 port = (uint16_t) ntohl (icmp_echo.reserved);
423 break; 423 break;
424 case IPPROTO_UDP: 424 case IPPROTO_UDP:
425 if (have != (sizeof (struct ip_header) * 2 + 425 if (have != (sizeof (struct ip_header) * 2 +
426 sizeof (struct icmp_ttl_exceeded_header) + 426 sizeof (struct icmp_ttl_exceeded_header) +
427 sizeof (struct udp_header)) ) 427 sizeof (struct udp_header)) )
428 { 428 {
429 /* malformed */ 429 /* malformed */
@@ -435,16 +435,16 @@ process_icmp_response ()
435 sizeof (struct udp_header)); 435 sizeof (struct udp_header));
436 port = ntohs (udp_pkt.length); 436 port = ntohs (udp_pkt.length);
437 break; 437 break;
438 default: 438 default:
439 /* different type than what we want */ 439 /* different type than what we want */
440 return; 440 return;
441 } 441 }
442 442
443 ssize = sizeof(buf); 443 ssize = sizeof(buf);
444 WSAAddressToString((LPSOCKADDR)&source_ip, 444 WSAAddressToString((LPSOCKADDR)&source_ip,
445 sizeof(source_ip), 445 sizeof(source_ip),
446 NULL, 446 NULL,
447 buf, 447 buf,
448 &ssize); 448 &ssize);
449 if (port == 0) 449 if (port == 0)
450 fprintf (stdout, 450 fprintf (stdout,
@@ -476,7 +476,7 @@ make_icmp_socket ()
476 "Error opening RAW socket: %s\n", 476 "Error opening RAW socket: %s\n",
477 strerror (errno)); 477 strerror (errno));
478 return INVALID_SOCKET; 478 return INVALID_SOCKET;
479 } 479 }
480 return ret; 480 return ret;
481} 481}
482 482
@@ -501,23 +501,23 @@ make_raw_socket ()
501 return INVALID_SOCKET; 501 return INVALID_SOCKET;
502 } 502 }
503 503
504 if (0 != setsockopt(rawsock, 504 if (0 != setsockopt(rawsock,
505 SOL_SOCKET, 505 SOL_SOCKET,
506 SO_BROADCAST, 506 SO_BROADCAST,
507 (char*)&bOptVal, bOptLen)) 507 (char*)&bOptVal, bOptLen))
508 { 508 {
509 fprintf(stderr, 509 fprintf(stderr,
510 "Error setting SO_BROADCAST to ON: %s\n", 510 "Error setting SO_BROADCAST to ON: %s\n",
511 strerror (errno)); 511 strerror (errno));
512 closesocket(rawsock); 512 closesocket(rawsock);
513 return INVALID_SOCKET; 513 return INVALID_SOCKET;
514 } 514 }
515 if (0 != setsockopt(rawsock, 515 if (0 != setsockopt(rawsock,
516 IPPROTO_IP, 516 IPPROTO_IP,
517 IP_HDRINCL, 517 IP_HDRINCL,
518 (char*)&bOptVal, bOptLen)) 518 (char*)&bOptVal, bOptLen))
519 { 519 {
520 fprintf(stderr, 520 fprintf(stderr,
521 "Error setting IP_HDRINCL to ON: %s\n", 521 "Error setting IP_HDRINCL to ON: %s\n",
522 strerror (errno)); 522 strerror (errno));
523 closesocket(rawsock); 523 closesocket(rawsock);
@@ -566,7 +566,7 @@ make_udp_socket (const struct in_addr *my_ip)
566 566
567 567
568int 568int
569main (int argc, 569main (int argc,
570 char *const *argv) 570 char *const *argv)
571{ 571{
572 struct in_addr external; 572 struct in_addr external;
@@ -588,7 +588,7 @@ main (int argc,
588 argv[1], strerror (errno)); 588 argv[1], strerror (errno));
589 return 1; 589 return 1;
590 } 590 }
591 if (1 != inet_pton (AF_INET, DUMMY_IP, &dummy)) 591 if (1 != inet_pton (AF_INET, DUMMY_IP, &dummy))
592 { 592 {
593 fprintf (stderr, 593 fprintf (stderr,
594 "Internal error converting dummy IP to binary.\n"); 594 "Internal error converting dummy IP to binary.\n");
@@ -601,25 +601,25 @@ main (int argc,
601 } 601 }
602 if (INVALID_SOCKET == (icmpsock = make_icmp_socket())) 602 if (INVALID_SOCKET == (icmpsock = make_icmp_socket()))
603 { 603 {
604 return 3; 604 return 3;
605 } 605 }
606 if (INVALID_SOCKET == (make_raw_socket())) 606 if (INVALID_SOCKET == (make_raw_socket()))
607 { 607 {
608 closesocket (icmpsock); 608 closesocket (icmpsock);
609 return 3; 609 return 3;
610 } 610 }
611 if (INVALID_SOCKET == (udpsock = make_udp_socket(&external))) 611 if (INVALID_SOCKET == (udpsock = make_udp_socket(&external)))
612 { 612 {
613 closesocket (icmpsock); 613 closesocket (icmpsock);
614 closesocket (rawsock); 614 closesocket (rawsock);
615 return 3; 615 return 3;
616 } 616 }
617 while (1) 617 while (1)
618 { 618 {
619 FD_ZERO (&rs); 619 FD_ZERO (&rs);
620 FD_SET (icmpsock, &rs); 620 FD_SET (icmpsock, &rs);
621 tv.tv_sec = 0; 621 tv.tv_sec = 0;
622 tv.tv_usec = ICMP_SEND_FREQUENCY_MS * 1000; 622 tv.tv_usec = ICMP_SEND_FREQUENCY_MS * 1000;
623 if (-1 == select (icmpsock + 1, &rs, NULL, NULL, &tv)) 623 if (-1 == select (icmpsock + 1, &rs, NULL, NULL, &tv))
624 { 624 {
625 if (errno == EINTR) 625 if (errno == EINTR)
@@ -641,7 +641,7 @@ main (int argc,
641 closesocket(rawsock); 641 closesocket(rawsock);
642 closesocket(udpsock); 642 closesocket(udpsock);
643 WSACleanup (); 643 WSACleanup ();
644 return 4; 644 return 4;
645} 645}
646 646
647 647