Improve the UDP checksum handling:
* When sending UDP packets,
* compute the checksum in the correct order. This only has an impact if the length of the payload is odd.
* don't send packet with a checksum of zero, use 0xffff instead as required.
* When receiving UDP packets,
* don't do any computations when the checksum is zero.
* compute the checksum in the correct order. This only has an impact if the length of the payload is odd.
* when computing the checksum, store the pseudo header checksum
* if the checksum is computed as zero, use 0xffff instead.
* also accept packets, when the checksum in the packet is the pseudo header checksum.
The past point fixes a problem when the DHCP client runs in a VM, the DHCP server runs on the host serving the VM and the network interface supports transmit checksum offloading. Since `dhclient` doesn't use UDP sockets but `bpf` devices to read the packets, the checksum will be incorrect and only contain the checksum of the pseudo header.
This was reported in [[ https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=263229 | PR 263229 ]].