Удалить слой из пакета 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)

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

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

0 ответов

Другие вопросы по тегам