diff --git a/src/tcp.c b/src/tcp.c index 947fe1c..be3c45a 100644 --- a/src/tcp.c +++ b/src/tcp.c @@ -1,5 +1,6 @@ #include #include +#include #include "endian.h" #include "tcp.h" @@ -125,7 +126,6 @@ calculate_checksum(const slice_list_t *slices, size_t num_slices) for (size_t slice_idx = 0; slice_idx < num_slices; slice_idx++) { - assert((slices[slice_idx].len & 1) == 0); const uint16_t *src = slices[slice_idx].src; const size_t len = slices[slice_idx].len; @@ -134,6 +134,18 @@ calculate_checksum(const slice_list_t *slices, size_t num_slices) if (sum > 0xffff) sum -= 0xffff; } + + if (len & 1) { + alignas(uint16_t) uint8_t temp[2]; + + temp[0] = ((uint8_t*) slices[slice_idx].src)[len-1]; + temp[1] = 0; + + uint16_t temp2 = *(uint16_t*) temp; + sum += net_to_cpu_u16(temp2); + if (sum > 0xffff) + sum -= 0xffff; + } } return cpu_to_net_u16(~sum);