Я пытаюсь реализовать переключатель 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)
Но это кажется слишком сложным (поскольку я не могу получить прямой доступ к каждому слою) и не очень оптимизировано по производительности.
Есть ли лучший способ удалить или добавить слой (между другими слоями)?