diff --git a/docs/manual.md b/docs/manual.md index 8724eea..53d991b 100644 --- a/docs/manual.md +++ b/docs/manual.md @@ -1645,6 +1645,18 @@ function reconstruct_dissect(dissect, reconstruct_opts) Возвращает raw_ip. Все чексуммы считаются автоматически. L4 чексуммы портятся, если задан badsum в reconstruct_opts. +Реконструкция диссектов с IP фрагментацией происходит особым образом - с участием как LUA, так и C кода. +LUA код должен подготовить диссект полного пакета, подлежащего фрагментации, но заполнить некоторые поля такими, какими они должны быть во фрагменте. + +* ipv4 : ip.ip_len должен быть рассчитан таким, каким он должен быть во фрагменте. +По ip.ip_len С код определяет размер фрагментированной части. +Поле ip.ip_off должно содержать offset фрагмента и признак IP_MF, если это не последний фрагмент. +* ipv6 : нужно вставить в ip6.exthdr fragment header, в котором заполнить ident, offset и бит IP6F_MORE_FRAG, если это не последний фрагмент. +ip6.ip6_len должен быть рассчитан таким, каким он должен быть во фрагменте. По этой длине C код определяет размер фрагмента. + +Если C код видит признаки необходимости фрагментации, он проверяет корректность рассчитанных длин и смещений, +и если они корректны, после реконструкции сдвигает содержимое raw пакета в буфере реконструкции, чтобы получился фрагмент с нужными данными. + ``` function reconstruct_tcphdr(tcp) function reconstruct_udphdr(udp)