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 | |
parent | 5f64d528be2ca7229c0e9ce00837ac0fa4da2e54 (diff) | |
download | system_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
-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 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; |