diff options
author | Christian Grothoff <christian@grothoff.org> | 2012-01-17 20:19:03 +0000 |
---|---|---|
committer | Christian Grothoff <christian@grothoff.org> | 2012-01-17 20:19:03 +0000 |
commit | 11cbed2558f43f11a4329266ecfb46bf916c5a4a (patch) | |
tree | 632f52a2a7afc8b2c53d9be44a9417e12def8bc6 /src/dns | |
parent | 0e9f40d2a5470c648f26effdb155a392a4b4be1b (diff) | |
download | gnunet-11cbed2558f43f11a4329266ecfb46bf916c5a4a.tar.gz gnunet-11cbed2558f43f11a4329266ecfb46bf916c5a4a.zip |
-moving remaining checksum calculations to tun library, fixing #2066
Diffstat (limited to 'src/dns')
-rw-r--r-- | src/dns/gnunet-service-dns.c | 70 |
1 files changed, 21 insertions, 49 deletions
diff --git a/src/dns/gnunet-service-dns.c b/src/dns/gnunet-service-dns.c index 288304600..690b4887e 100644 --- a/src/dns/gnunet-service-dns.c +++ b/src/dns/gnunet-service-dns.c | |||
@@ -20,6 +20,7 @@ | |||
20 | 20 | ||
21 | /** | 21 | /** |
22 | * @file dns/gnunet-service-dns.c | 22 | * @file dns/gnunet-service-dns.c |
23 | * @brief service to intercept and modify DNS queries (and replies) of this system | ||
23 | * @author Christian Grothoff | 24 | * @author Christian Grothoff |
24 | */ | 25 | */ |
25 | #include "platform.h" | 26 | #include "platform.h" |
@@ -351,7 +352,8 @@ request_done (struct RequestRecord *rr) | |||
351 | { | 352 | { |
352 | char buf[reply_len]; | 353 | char buf[reply_len]; |
353 | size_t off; | 354 | size_t off; |
354 | uint32_t udp_crc_sum; | 355 | struct GNUNET_TUN_IPv4Header ip4; |
356 | struct GNUNET_TUN_IPv6Header ip6; | ||
355 | 357 | ||
356 | /* first, GNUnet message header */ | 358 | /* first, GNUnet message header */ |
357 | hdr = (struct GNUNET_MessageHeader*) buf; | 359 | hdr = (struct GNUNET_MessageHeader*) buf; |
@@ -373,71 +375,38 @@ request_done (struct RequestRecord *rr) | |||
373 | } | 375 | } |
374 | 376 | ||
375 | /* now IP header */ | 377 | /* now IP header */ |
376 | udp_crc_sum = 0; | ||
377 | switch (rr->src_addr.ss_family) | 378 | switch (rr->src_addr.ss_family) |
378 | { | 379 | { |
379 | case AF_INET: | 380 | case AF_INET: |
380 | { | 381 | { |
381 | struct sockaddr_in *src = (struct sockaddr_in *) &rr->src_addr; | 382 | struct sockaddr_in *src = (struct sockaddr_in *) &rr->src_addr; |
382 | struct sockaddr_in *dst = (struct sockaddr_in *) &rr->dst_addr; | 383 | struct sockaddr_in *dst = (struct sockaddr_in *) &rr->dst_addr; |
383 | struct GNUNET_TUN_IPv4Header ip; | ||
384 | 384 | ||
385 | spt = dst->sin_port; | 385 | spt = dst->sin_port; |
386 | dpt = src->sin_port; | 386 | dpt = src->sin_port; |
387 | GNUNET_TUN_initialize_ipv4_header (&ip, | 387 | GNUNET_TUN_initialize_ipv4_header (&ip4, |
388 | IPPROTO_UDP, | 388 | IPPROTO_UDP, |
389 | reply_len - off - sizeof (struct GNUNET_TUN_IPv4Header), | 389 | reply_len - off - sizeof (struct GNUNET_TUN_IPv4Header), |
390 | &dst->sin_addr, | 390 | &dst->sin_addr, |
391 | &src->sin_addr); | 391 | &src->sin_addr); |
392 | 392 | memcpy (&buf[off], &ip4, sizeof (ip4)); | |
393 | 393 | off += sizeof (ip4); | |
394 | |||
395 | udp_crc_sum = GNUNET_CRYPTO_crc16_step (udp_crc_sum, | ||
396 | &ip.source_address, | ||
397 | sizeof (struct in_addr) * 2); | ||
398 | { | ||
399 | uint16_t tmp; | ||
400 | |||
401 | tmp = htons (IPPROTO_UDP); | ||
402 | udp_crc_sum = GNUNET_CRYPTO_crc16_step (udp_crc_sum, | ||
403 | &tmp, | ||
404 | sizeof (uint16_t)); | ||
405 | tmp = htons (rr->payload_length + sizeof (struct GNUNET_TUN_UdpHeader)); | ||
406 | udp_crc_sum = GNUNET_CRYPTO_crc16_step (udp_crc_sum, | ||
407 | &tmp, | ||
408 | sizeof (uint16_t)); | ||
409 | } | ||
410 | memcpy (&buf[off], &ip, sizeof (ip)); | ||
411 | off += sizeof (ip); | ||
412 | } | 394 | } |
413 | break; | 395 | break; |
414 | case AF_INET6: | 396 | case AF_INET6: |
415 | { | 397 | { |
416 | struct sockaddr_in6 *src = (struct sockaddr_in6 *) &rr->src_addr; | 398 | struct sockaddr_in6 *src = (struct sockaddr_in6 *) &rr->src_addr; |
417 | struct sockaddr_in6 *dst = (struct sockaddr_in6 *) &rr->dst_addr; | 399 | struct sockaddr_in6 *dst = (struct sockaddr_in6 *) &rr->dst_addr; |
418 | struct GNUNET_TUN_IPv6Header ip; | ||
419 | 400 | ||
420 | spt = dst->sin6_port; | 401 | spt = dst->sin6_port; |
421 | dpt = src->sin6_port; | 402 | dpt = src->sin6_port; |
422 | GNUNET_TUN_initialize_ipv6_header (&ip, | 403 | GNUNET_TUN_initialize_ipv6_header (&ip6, |
423 | IPPROTO_UDP, | 404 | IPPROTO_UDP, |
424 | reply_len - sizeof (struct GNUNET_TUN_IPv6Header), | 405 | reply_len - sizeof (struct GNUNET_TUN_IPv6Header), |
425 | &dst->sin6_addr, | 406 | &dst->sin6_addr, |
426 | &src->sin6_addr); | 407 | &src->sin6_addr); |
427 | { | 408 | memcpy (&buf[off], &ip6, sizeof (ip6)); |
428 | uint32_t tmp; | 409 | off += sizeof (ip6); |
429 | |||
430 | tmp = htons (rr->payload_length + sizeof (struct GNUNET_TUN_UdpHeader)); | ||
431 | udp_crc_sum = GNUNET_CRYPTO_crc16_step (udp_crc_sum, | ||
432 | &tmp, | ||
433 | sizeof (uint32_t)); | ||
434 | tmp = htons (IPPROTO_UDP); | ||
435 | udp_crc_sum = GNUNET_CRYPTO_crc16_step (udp_crc_sum, | ||
436 | &tmp, | ||
437 | sizeof (uint32_t)); | ||
438 | } | ||
439 | memcpy (&buf[off], &ip, sizeof (ip)); | ||
440 | off += sizeof (ip); | ||
441 | } | 410 | } |
442 | break; | 411 | break; |
443 | default: | 412 | default: |
@@ -451,17 +420,20 @@ request_done (struct RequestRecord *rr) | |||
451 | udp.spt = spt; | 420 | udp.spt = spt; |
452 | udp.dpt = dpt; | 421 | udp.dpt = dpt; |
453 | udp.len = htons (reply_len - off); | 422 | udp.len = htons (reply_len - off); |
454 | udp.crc = 0; | 423 | if (AF_INET == rr->src_addr.ss_family) |
455 | udp_crc_sum = GNUNET_CRYPTO_crc16_step (udp_crc_sum, | 424 | GNUNET_TUN_calculate_udp4_checksum (&ip4, |
456 | &udp, | 425 | &udp, |
457 | sizeof (udp)); | 426 | rr->payload, |
458 | udp_crc_sum = GNUNET_CRYPTO_crc16_step (udp_crc_sum, | 427 | rr->payload_length); |
459 | rr->payload, | 428 | else |
460 | rr->payload_length); | 429 | GNUNET_TUN_calculate_udp6_checksum (&ip6, |
461 | udp.crc = GNUNET_CRYPTO_crc16_finish (udp_crc_sum); | 430 | &udp, |
431 | rr->payload, | ||
432 | rr->payload_length); | ||
462 | memcpy (&buf[off], &udp, sizeof (udp)); | 433 | memcpy (&buf[off], &udp, sizeof (udp)); |
463 | off += sizeof (udp); | 434 | off += sizeof (udp); |
464 | } | 435 | } |
436 | |||
465 | /* now DNS payload */ | 437 | /* now DNS payload */ |
466 | { | 438 | { |
467 | memcpy (&buf[off], rr->payload, rr->payload_length); | 439 | memcpy (&buf[off], rr->payload, rr->payload_length); |
@@ -1273,4 +1245,4 @@ main (int argc, char *const *argv) | |||
1273 | } | 1245 | } |
1274 | 1246 | ||
1275 | 1247 | ||
1276 | /* end of gnunet-service-dns_new.c */ | 1248 | /* end of gnunet-service-dns.c */ |