[dts] [PATCH V2 1/3][nsh] dep: add support of mpls and nsh

lihong lihongx.ma at intel.com
Mon Oct 14 23:49:00 CEST 2019


Signed-off-by: lihong <lihongx.ma at intel.com>
---
 dep/mpls.py | 24 ++++++++++++++++++++++
 dep/nsh.py  | 67 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 91 insertions(+)
 create mode 100644 dep/mpls.py
 create mode 100644 dep/nsh.py

diff --git a/dep/mpls.py b/dep/mpls.py
new file mode 100644
index 0000000..0b37bba
--- /dev/null
+++ b/dep/mpls.py
@@ -0,0 +1,24 @@
+from scapy.packet import Packet, bind_layers, Padding
+from scapy.fields import BitField,ByteField
+from scapy.layers.inet import IP
+from scapy.layers.inet6 import IPv6
+from scapy.layers.l2 import Ether, GRE
+
+class MPLS(Packet):
+   name = "MPLS"
+   fields_desc =  [ BitField("label", 3, 20),
+                    BitField("cos", 0, 3),
+                    BitField("s", 1, 1),
+                    ByteField("ttl", 0)  ]
+
+   def guess_payload_class(self, payload):
+       if len(payload) >= 1:
+           ip_version = (ord(payload[0]) >> 4) & 0xF
+           if ip_version == 4:
+               return IP
+           elif ip_version == 6:
+               return IPv6
+       return Padding
+
+bind_layers(Ether, MPLS, type=0x8847)
+bind_layers(GRE, MPLS, proto=0x8847)
diff --git a/dep/nsh.py b/dep/nsh.py
new file mode 100644
index 0000000..2e249c9
--- /dev/null
+++ b/dep/nsh.py
@@ -0,0 +1,67 @@
+from scapy.packet import *
+from scapy.fields import *
+from scapy.layers.inet import Ether, IP
+from scapy.layers.inet6 import IPv6
+from vxlan import VXLAN
+from mpls import MPLS
+
+
+class Metadata(Packet):
+    name = 'NSH metadata'
+    fields_desc = [XIntField('value', 0)]
+
+
+class NSHTLV(Packet):
+    "NSH MD-type 2 - Variable Length Context Headers"
+    name = "NSHTLV"
+    fields_desc = [
+        ShortField('Class', 0),
+        BitField('Critical', 0, 1),
+        BitField('Type', 0, 7),
+        BitField('Reserved', 0, 3),
+        BitField('Len', 0, 5),
+        PacketListField('Metadata', None, XIntField, count_from='Len')
+    ]
+
+
+class NSH(Packet):
+    """Network Service Header.
+       NSH MD-type 1 if there is no ContextHeaders"""
+    name = "NSH"
+
+    fields_desc = [
+        BitField('Ver', 0, 2),
+        BitField('OAM', 0, 1),
+        BitField('Critical', 0, 1),
+        BitField('Reserved', 0, 6),
+        BitField('Len', 0, 6),
+        ByteEnumField('MDType', 1, {1: 'Fixed Length',
+                                    2: 'Variable Length'}),
+        ByteEnumField('NextProto', 3, {1: 'IPv4',
+                                       2: 'IPv6',
+                                       3: 'Ethernet',
+                                       4: 'NSH',
+                                       5: 'MPLS'}),
+        X3BytesField('NSP', 0),
+        ByteField('NSI', 1),
+        ConditionalField(XIntField('NPC', 0), lambda pkt: pkt.MDType == 1),
+        ConditionalField(XIntField('NSC', 0), lambda pkt: pkt.MDType == 1),
+        ConditionalField(XIntField('SPC', 0), lambda pkt: pkt.MDType == 1),
+        ConditionalField(XIntField('SSC', 0), lambda pkt: pkt.MDType == 1),
+        ConditionalField(PacketListField("ContextHeaders", None,
+                                         NSHTLV, count_from="Length"),
+                         lambda pkt: pkt.MDType == 2)
+        ]
+
+    def mysummary(self):
+        return self.sprintf("NSP: %NSP% - NSI: %NSI%")
+
+
+bind_layers(Ether, NSH, {'type': 0x894F}, type=0x894F)
+bind_layers(VXLAN, NSH, {'flags': 0xC, 'NextProtocol': 4}, NextProtocol=4)
+
+bind_layers(NSH, IP, {'NextProto': 1}, NextProto=1)
+bind_layers(NSH, IPv6, {'NextProto': 2}, NextProto=2)
+bind_layers(NSH, Ether, {'NextProto': 3}, NextProto=3)
+bind_layers(NSH, NSH, {'NextProto': 4}, NextProto=4)
+bind_layers(NSH, MPLS, {'NextProto': 5}, NextProto=5)
-- 
2.7.4



More information about the dts mailing list