我正在尝试通过Dot1Q
层实现VLAN交换机。我可以使用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)
但是,这接缝太复杂了(因为我无法直接访问每一层)并且性能没有得到很好的优化。
是否有更好的方法来删除或添加一层(在其他层之间)?