Удалить слой из пакета gopacket
Я пытаюсь реализовать VLAN-переключатель с Dot1Q
слой. Я могу создать пакет с NewPacket()
который либо содержит слой, либо нет. Моя проблема в том, что я не знаю, как удалить / добавить слой Dot1Q, чтобы пометить / разметить пакеты vlan.
Я мог бы получить NextLayerType
от Dot1Q
слой и использование NewPacket
, но тогда я бы потерял Ethernet
слой?
Другой возможный подход заключается в сериализации всего пакета, исключая Dot1Q
слой, а затем создайте новый из байтового среза. Примерно так (но с использованием реальных слоев из пакета):
buf := gopacket.NewSerializeBuffer()
opts := gopacket.SerializeOptions{}
gopacket.SerializeLayers(buf, opts,
&layers.Ethernet{},
&layers.IPv4{},
&layers.TCP{},
gopacket.Payload([]byte{1, 2, 3, 4}))
bytes := buf.Bytes()
gopacket.NewPacket(bytes, layers.LayerTypeEthernet, gopacket.Default)
Но это кажется слишком сложным (поскольку я не могу получить прямой доступ к каждому слою) и не очень оптимизировано по производительности.
Есть ли лучший способ удалить или добавить слой (между другими слоями)?