summaryrefslogtreecommitdiffstats
path: root/libnetutils
diff options
context:
space:
mode:
authorAjay Dudani <adudani@codeaurora.org>2013-05-22 21:16:59 -0700
committerVineeta Srivastava <vsrivastava@google.com>2013-12-12 11:24:26 -0800
commit1c87ae05b337f789b2e56bbb273758dfb12fb2ef (patch)
treedc134d88e869a3847eac5d35138c26360b9fd8a1 /libnetutils
parent5f64d528be2ca7229c0e9ce00837ac0fa4da2e54 (diff)
downloadsystem_core-1c87ae05b337f789b2e56bbb273758dfb12fb2ef.zip
system_core-1c87ae05b337f789b2e56bbb273758dfb12fb2ef.tar.gz
system_core-1c87ae05b337f789b2e56bbb273758dfb12fb2ef.tar.bz2
libnetutils: Expect 1's complement if computed UDP checksum is zero
Per http://tools.ietf.org/html/rfc768: If the computed checksum is zero, it is transmitted as all ones (the equivalent in one's complement arithmetic). An all zero transmitted checksum value means that the transmitter generated no checksum (for debugging or for higher level protocols that don't care). Bug: 10642341 Change-Id: Ib6296dcf3f420f87227047a645c99d9f7ea0d437
Diffstat (limited to 'libnetutils')
-rw-r--r--libnetutils/packet.c2
1 files changed, 2 insertions, 0 deletions
diff --git a/libnetutils/packet.c b/libnetutils/packet.c
index be4e0db..3cdefb0 100644
--- a/libnetutils/packet.c
+++ b/libnetutils/packet.c
@@ -230,6 +230,8 @@ int receive_packet(int s, struct dhcp_msg *msg)
packet.udp.check = 0;
sum = finish_sum(checksum(&packet, nread, 0));
packet.udp.check = temp;
+ if (!sum)
+ sum = finish_sum(sum);
if (temp != sum) {
ALOGW("UDP header checksum failure (0x%x should be 0x%x)", sum, temp);
return -1;