当NextDecoder依赖于上一层而不是当前层时,如何正确编写自定义层?

时间:2019-07-05 18:21:34

标签: go gopacket

我正在用 gopacket 编写自定义层解码器。

LayerA 包含字段Type,该字段可以是以下值之一:

  • 仅B ,下一层是 LayerB ,其后是原始有效载荷
  • 仅C ,下一层是 LayerC ,其后是原始有效载荷
  • B-C ,下一层是 LayerB ,然后是 LayerC ,然后是原始有效载荷

LayerB 中没有可用于了解 LayerC 是否为下一个字段的字段。 LayerB LayerC 解码与是否存在其他层无关。

编写 LayerA 的解码功能的正确方法是什么,因为它是知道下一层是什么的方法?

关于 gopacket 的自定义层的教程并不多,这种情况与此处介绍的基本层不同。

似乎应该在调用p.NextDecoder之前将逻辑放在 LayerA 解码函数中。

我想到了两种实现方法:

1。使用闭包

将字段nextDecoder Decoder添加到结构 LayerB 。 在 LayerA 的解码器中,当Type仅限于 C 时,只需使用 LayerC 的解码器。否则,创建一个结构 LayerB ,并相应地填充字段nextDecoder。然后在闭包中使用此结构,该闭包将用作下一个解码器。

问题

LayerB 的解码逻辑将在 LayerA 解码功能中(请参见下面Palyground中的代码)。 此外,在向gopacket.RegisterLayer注册 LayerB 时要使用哪种解码功能?

2。有两个单独的层LayerB-C和仅LayerB

LayerB-C 的下一个解码器将是LayerC仅LayerB 的将是有效负载层。

问题

LayerB LayerB-C 的解码功能相同,期望调用p.NextDecoder。 既然没有“继承”的概念,我不确定如何设计以避免重复。也许使用功能nextDecoder() LayerType创建基于LayerB的接口,并实现 LayerB-C LayerB-only ?还是嵌入具有功能Decode LayerB-base 类型?但是他们两个都不对。

代码

以下是每种描述方式的一些代码:https://play.golang.org/p/N9ZpYqFb16Q。除LayerA.Type之外,各层的实际内容均无关。

此代码的结果符合预期,但我想知道是否有更好或更惯用的方法。

1 个答案:

答案 0 :(得分:0)

您可以通过将下一层声明为可以支持B或C的接口来做到这一点。只要声明的内容适合LayerType,就可以正常工作。