Удалить слой из пакета gopacket - PullRequest
0 голосов
/ 09 января 2019

Я пытаюсь реализовать переключатель 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)

Но это кажется слишком сложным (поскольку я не могу получить прямой доступ к каждому слою) и не очень оптимизировано по производительности.

Есть ли лучший способ удалить или добавить слой (между другими слоями)?

...