aboutsummaryrefslogtreecommitdiff
path: root/src/dns
diff options
context:
space:
mode:
authorChristian Grothoff <christian@grothoff.org>2012-01-17 20:19:03 +0000
committerChristian Grothoff <christian@grothoff.org>2012-01-17 20:19:03 +0000
commit11cbed2558f43f11a4329266ecfb46bf916c5a4a (patch)
tree632f52a2a7afc8b2c53d9be44a9417e12def8bc6 /src/dns
parent0e9f40d2a5470c648f26effdb155a392a4b4be1b (diff)
downloadgnunet-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.c70
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 */