diff options
author | Ajay Dudani <adudani@codeaurora.org> | 2013-05-22 21:16:59 -0700 |
---|---|---|
committer | Vineeta Srivastava <vsrivastava@google.com> | 2013-12-12 11:24:26 -0800 |
commit | 1c87ae05b337f789b2e56bbb273758dfb12fb2ef (patch) | |
tree | dc134d88e869a3847eac5d35138c26360b9fd8a1 /libnetutils | |
parent | 5f64d528be2ca7229c0e9ce00837ac0fa4da2e54 (diff) | |
download | system_core-1c87ae05b337f789b2e56bbb273758dfb12fb2ef.tar.gz system_core-1c87ae05b337f789b2e56bbb273758dfb12fb2ef.tar.bz2 system_core-1c87ae05b337f789b2e56bbb273758dfb12fb2ef.zip |
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.c | 2 |
1 files changed, 2 insertions, 0 deletions
diff --git a/libnetutils/packet.c b/libnetutils/packet.c index be4e0db41..3cdefb08b 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; |