Я считаю, что при вызове:
// s64 bpf_csum_diff(__be32 *from, u32 from_size, __be32 *to, u32 to_size, __wsum seed)
sum = bpf_csum_diff(0, 0, icmph, ICMP_ECHO_LEN, 0);
Значение to_size
, передаваемое в качестве третьего аргумента, должно быть числом байтов. Предполагая, что вы скопировали ICMP_ECHO_LEN
из самотестирования ядра, я подозреваю, что его значение равно 64, поэтому просит ядро вычислить контрольную сумму в 64-байтовом буфере. Но вы никогда не проверяли, что ваш пакет был таким длинным (у вас есть if (icmph + 1 > data_end)
, что мне кажется правильным).
Я подозреваю, что вместо этого вы должны попытаться передать длину вашего заголовка в качестве третьего аргумента, что-то вроде это (не проверено):
um = bpf_csum_diff(0, 0, icmph, sizeof(struct icmphdr), 0);
struct icmphdr
определено в include/uapi/linux/icmp.h
и, кажется, имеет длину 8 байт, хотя вам не нужно это знать, и все должно быть хорошо, пока вы передайте правильную длину заголовка.