[dts] [PATCH V2 1/3][nsh] dep: add support of mpls and nsh
Chen, Zhaoyan
zhaoyan.chen at intel.com
Mon Nov 4 06:33:09 CET 2019
Acked-by: Chen, Zhaoyan <zhaoyan.chen at intel.com>
Regards,
Zhaoyan Chen
> -----Original Message-----
> From: dts <dts-bounces at dpdk.org> On Behalf Of lihong
> Sent: Tuesday, October 15, 2019 5:49 AM
> To: dts at dpdk.org
> Cc: Ma, LihongX <lihongx.ma at intel.com>
> Subject: [dts] [PATCH V2 1/3][nsh] dep: add support of mpls and nsh
>
> 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