После прочтения исходного кода Scapy inet6.py я заметил, что есть более "прямой" - но не обязательно "более чистый" - способ получить правильный объект сообщения Scapy ICMPv6, чем в Cukic0d. ответ: это в том смысле, что есть альтернативный способ, которому не нужна «поддельная» внешняя оболочка объекта IPv6 (хотя я действительно ценю ответ Cukic0d, так как это было бы хорошим местом, чтобы сбросить адрес отправителя!):
from scapy.layers.inet6 import *
icmpv6_packet = icmp6typescls.get(p[0], ICMPv6Unknown)(p)
При этом используется словарь icmp6typescls
, сопоставляющий тип ICMPv6 (сообщения), который находится в первом октете пакета, возвращенного из сокета), с соответствующим классом сообщений Scapy ICMPv6 ... и затем вызывает конструктор, передавая полезная нагрузка к нему.
Класс ICMPv6Unknown
является классом по умолчанию, который Scapy использует, когда тип ICMPv6 (сообщения) не может быть сопоставлен с известным классом сообщений. Это гарантирует, что всегда есть разумный конструктор для вызова, даже если мы не понимаем пакет, полученный в его полных деталях.