В моей программе я использую scapy для создания/анализа пакетов, но фактическая программа написана на C++. Поскольку пользователям нужны только первые несколько полей ICMPv6, которые одинаковы для всех пакетов ICMPv6, я создал один класс ICMPv6 (используя ICMPv6Unknown) на стороне C++.
Моя проблема в том, что, хотя они могут нормально работать с полями ICMPv6, поле plen в IPv6 не обновляется правильно в соответствии с типом, который я указал в заголовке ICMPv6.
Я не уверен, что я могу отредактировать в классе IPv6, чтобы он изменил поле в соответствии с тем, какой тип ICMPv6 будет следующим, прямо сейчас он делает:
def post_build(self, p, pay):
p += pay
if self.plen is None:
l = len(p) - 40
p = p[:4]+struct.pack("!H", l)+p[6:]
return p
Это не удается, потому что ICMPv6Unknown возвращает len, равное 4, поэтому он не меняет размер в соответствии с моим полем типа. Я знаю, что Ether меняет тип в соответствии с полями, но я не смог воспроизвести это для ICMPv6.