dhcpd will discard DHCP request when checksum value of packet is 0xffff.
Cathy Almond
cathya at isc.org
Wed Aug 24 18:45:46 UTC 2011
Hi all,
Thanks for your input - we will take a look. This is now being tracked
as change request #25587 internally.
Please could you refrain from re-adding dhcp-bugs to the cc-list for
this discussion thread.
Kind regards,
Cathy Almond
ISC Support
On 24/08/11 14:51, Joerg Mayer wrote:
> On Wed, Aug 24, 2011 at 04:54:59PM +0900, Yoshihiro takahashi wrote:
>> dhcpd will discard DHCP request when checksum value of packet is 0xffff.
>
> That's not completely correct: It will discard the packet in case the calculated
> checksum would be 0.
>
>> 0xffff for checksum value is equivalent to 0x0000.
>> In 0xffff case, is the packet treated as error?
>>
>> RFC768
>> ------
>> If the computed checksum is zero, it is transmitted as all ones
>> ------
>>
>> dhcp-discover did not work when checksum of packet is 0xffff.
>> ----
>> 52 0.853890 172.18.76.162 172.18.76.161 DHCP DHCP Request - Transaction ID 0x2862
>> Frame 52 (1514 bytes on wire, 1514 bytes captured)
>> Ethernet II, Src: ********* (00:40:66:43:99:b2), Dst: ******** (00:07:32:16:47:b0)
>> Internet Protocol, Src: 172.18.76.162 (172.18.76.162), Dst: 172.18.76.161 (172.18.76.161)
>> User Datagram Protocol, Src Port: bootps (67), Dst Port: bootps (67)
>> Source port: bootps (67)
>> Destination port: bootps (67)
>> Length: 1480
>> Checksum: 0xffff [validation disabled]
>
> Validation disabled means that tshark has been instructed to not check wether the
> transmitted checksum is OK.
>
>> Bootstrap Protocol
>> ----
>>
>>
>> Best regards,
>>
>> diff -aurp dhcp-4.2.2.orig/common/packet.c dhcp-4.2.2/common/packet.c
>> --- dhcp-4.2.2.orig/common/packet.c 2011-08-24 13:44:50.251979028 +0900
>> +++ dhcp-4.2.2/common/packet.c 2011-08-24 14:10:46.688060536 +0900
>> @@ -322,7 +322,10 @@ decode_udp_ip_header(struct interface_in
>> 8, IPPROTO_UDP + ulen))));
>
> It would be easier and clrearer to add in this place:
> if (sum == 0) sum = 0xffff;
>>
>> udp_packets_seen++;
>> - if (usum && usum != sum) {
>> + /* RFC768
>> + * If the computed checksum is zero, it is transmitted as all ones
>> + */
>> + if (usum && usum != sum && !(usum == 0xffff && sum == 0)) {
>> udp_packets_bad_checksum++;
>> if (udp_packets_seen > 4 &&
>> (udp_packets_seen / udp_packets_bad_checksum) < 2) {
>
> Nice find.
>
> Ciao
> Joerg
>
More information about the dhcp-hackers
mailing list