diff options
Diffstat (limited to 'src/transport/gnunet-nat-server-windows.c')
-rw-r--r-- | src/transport/gnunet-nat-server-windows.c | 144 |
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 | */ |
85 | struct ip_header | 85 | struct 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 | */ |
142 | struct icmp_ttl_exceeded_header | 142 | struct 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 | */ |
208 | static uint16_t | 208 | static uint16_t |
209 | calc_checksum(const uint16_t *data, | 209 | calc_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 | */ |
232 | static int | 232 | static int |
233 | inet_pton (int af, | 233 | inet_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 | ||
568 | int | 568 | int |
569 | main (int argc, | 569 | main (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 | ||