test suite reviews and discussions
 help / color / Atom feed
* [dts] [PATCH V1 1/5] dep: add dependency modules for ddp suites
@ 2019-09-17 23:19 Xinfeng Zhao
  2019-09-17 23:19 ` [dts] [PATCH V1 2/5] tests/TestSuite_ddp_gtp.py: load the local dep module in scapy command Xinfeng Zhao
                   ` (4 more replies)
  0 siblings, 5 replies; 6+ messages in thread
From: Xinfeng Zhao @ 2019-09-17 23:19 UTC (permalink / raw)
  To: dts; +Cc: Xinfeng Zhao

Signed-off-by: Xinfeng Zhao <xinfengx.zhao@intel.com>
---
 dep/gtp.py  | 112 ++++++++++++++++++++++++++++++++++++++++++++++++++++
 dep/l2tp.py |  50 +++++++++++++++++++++++
 dep/mpls.py |  33 ++++++++++++++++
 3 files changed, 195 insertions(+)
 create mode 100644 dep/gtp.py
 create mode 100644 dep/l2tp.py
 create mode 100644 dep/mpls.py

diff --git a/dep/gtp.py b/dep/gtp.py
new file mode 100644
index 0000000..693327f
--- /dev/null
+++ b/dep/gtp.py
@@ -0,0 +1,112 @@
+#! /usr/bin/env python
+
+## Copyright (C) 2017 Alexis Sultan    <alexis.sultan@sfr.com>
+##               2017 Alessio Deiana <adeiana@gmail.com>
+##               2014 Guillaume Valadon <guillaume.valadon@ssi.gouv.fr>
+##               2012 ffranz <ffranz@iniqua.com>
+##
+## This program is published under a GPLv2 license
+
+# scapy.contrib.description = GTP
+# scapy.contrib.status = loads
+
+from __future__ import absolute_import
+from scapy.packet import *
+from scapy.fields import *
+from scapy.layers.inet import IP, UDP
+from scapy.layers.inet6 import IPv6
+
+# GTP Data types
+GTPmessageType = {   1: "echo_request",
+                     2: "echo_response",
+                    16: "create_pdp_context_req",
+                    17: "create_pdp_context_res",
+                    18: "update_pdp_context_req",
+                    19: "update_pdp_context_resp",
+                    20: "delete_pdp_context_req",
+                    21: "delete_pdp_context_res",
+                    26: "error_indication",
+                    27: "pdu_notification_req",
+                    31: "supported_extension_headers_notification",
+                   254: "end_marker",
+                   255: "g_pdu" }
+
+# http://www.arib.or.jp/IMT-2000/V720Mar09/5_Appendix/Rel8/29/29281-800.pdf
+ExtensionHeadersTypes = {
+        0: "No more extension headers",
+        1: "Reserved",
+        2: "Reserved",
+        64: "UDP Port",
+        192: "PDCP PDU Number",
+        193: "Reserved",
+        194: "Reserved"
+    }
+
+class GTPHeader(Packet):
+    # 3GPP TS 29.060 V9.1.0 (2009-12)
+    name = "GTP-C Header"
+    fields_desc=[ BitField("version", 1, 3),
+                  BitField("PT", 1, 1),
+                  BitField("reserved", 0, 1),
+                  BitField("E", 0, 1),
+                  BitField("S", 0, 1),
+                  BitField("PN", 0, 1),
+                  ByteEnumField("gtp_type", None, GTPmessageType),
+                  ShortField("length", None),
+                  IntField("teid", 0),
+                  ConditionalField(XBitField("seq", 0, 16), lambda pkt:pkt.E==1 or pkt.S==1 or pkt.PN==1),
+                  ConditionalField(ByteField("npdu", 0), lambda pkt:pkt.E==1 or pkt.S==1 or pkt.PN==1),
+                  ConditionalField(ByteEnumField("next_ex", 0, ExtensionHeadersTypes), lambda pkt:pkt.E==1 or pkt.S==1 or pkt.PN==1), ]
+
+    def post_build(self, p, pay):
+        p += pay
+        if self.length is None:
+            l = len(p)-8
+            p = p[:2] + struct.pack("!H", l)+ p[4:]
+        return p
+
+    def hashret(self):
+        return struct.pack("B", self.version) + self.payload.hashret()
+
+    def answers(self, other):
+        return (isinstance(other, GTPHeader) and
+                self.version == other.version and
+                self.payload.answers(other.payload))
+
+    @classmethod
+    def dispatch_hook(cls, _pkt=None, *args, **kargs):
+        if _pkt and len(_pkt) >= 1:
+            if (struct.unpack("B", _pkt[0])[0] >> 5) & 0x7 == 2:
+                from . import gtp_v2
+                return gtp_v2.GTPHeader
+        if _pkt and len(_pkt) >= 8:
+            _gtp_type = struct.unpack("!B", _pkt[1:2])[0]
+            return GTPforcedTypes.get(_gtp_type, GTPHeader)
+        return cls
+
+class GTP_U_Header(GTPHeader):
+    # 3GPP TS 29.060 V9.1.0 (2009-12)
+    name = "GTP-U Header"
+    # GTP-U protocol is used to transmit T-PDUs between GSN pairs (or between an SGSN and an RNC in UMTS),
+    # encapsulated in G-PDUs. A G-PDU is a packet including a GTP-U header and a T-PDU. The Path Protocol
+    # defines the path and the GTP-U header defines the tunnel. Several tunnels may be multiplexed on a single path.
+
+# Some gtp_types have to be associated with a certain type of header
+GTPforcedTypes = {
+    16: GTPHeader,
+    17: GTPHeader,
+    18: GTPHeader,
+    19: GTPHeader,
+    20: GTPHeader,
+    21: GTPHeader,
+    26: GTP_U_Header,
+    27: GTPHeader,
+    254: GTP_U_Header,
+    255: GTP_U_Header
+    }
+
+# Bind GTP-U
+bind_layers(UDP, GTP_U_Header, dport = 2152)
+bind_layers(UDP, GTP_U_Header, sport = 2152)
+bind_layers(GTP_U_Header, IP, gtp_type = 255)
+bind_layers(GTP_U_Header, IPv6, gtp_type = 255)
diff --git a/dep/l2tp.py b/dep/l2tp.py
new file mode 100644
index 0000000..90c2bcf
--- /dev/null
+++ b/dep/l2tp.py
@@ -0,0 +1,50 @@
+## This file is part of Scapy
+## See http://www.secdev.org/projects/scapy for more informations
+## Copyright (C) Philippe Biondi <phil@secdev.org>
+## This program is published under a GPLv2 license
+
+"""
+L2TP (Layer 2 Tunneling Protocol) for VPNs.
+
+[RFC 2661]
+"""
+
+import struct
+
+from scapy.packet import *
+from scapy.fields import *
+from scapy.layers.inet import UDP
+from scapy.layers.ppp import PPP
+
+class L2TP(Packet):
+    fields_desc = [ ShortEnumField("pkt_type",2,{2:"data"}),
+                    ShortField("len", None),
+                    #ShortField("tunnelid", 0),
+                    ShortField("sessionid", 0),
+                    ShortField("ns", 0),
+                    ShortField("nr", 0),
+                    ShortField("offset", 0)
+                ]
+
+    def post_build(self, pkt, pay):
+        if self.len is None:
+            l = len(pkt)+len(pay)
+            pkt = pkt[:2]+struct.pack("!H", l)+pkt[4:]
+        return pkt+pay
+
+class PPP_L2TP(Packet):
+    fields_desc = [ ShortEnumField("pkt_type",0x4002,{2:"data"}),
+                    ShortField("tunnelid", 0),
+                    ShortField("sessionid", 0),
+                    ShortField("address_control", 0xff03),
+                    ShortField("proto", 0x0021) ]
+                    #ShortField("proto", None) ]
+
+    def post_build(self, pkt, pay):
+        if self.pkt_type & 0x4000:
+            l = len(pkt)+2+len(pay)
+            pkt = pkt[:2]+struct.pack("!H", l)+pkt[2:]
+        return pkt+pay
+
+bind_layers( UDP,           L2TP,          sport=1701, dport=1701)
+bind_layers( L2TP,          PPP,           )
diff --git a/dep/mpls.py b/dep/mpls.py
new file mode 100644
index 0000000..e211b7b
--- /dev/null
+++ b/dep/mpls.py
@@ -0,0 +1,33 @@
+# http://trac.secdev.org/scapy/ticket/31
+
+
+
+# scapy.contrib.description = MPLS
+
+# scapy.contrib.status = loads
+
+
+
+from scapy.packet import Packet,bind_layers
+
+from scapy.fields import BitField,ByteField
+
+from scapy.layers.l2 import Ether
+
+
+
+class MPLS(Packet):
+
+   name = "MPLS"
+
+   fields_desc =  [ BitField("label", 3, 20),
+
+                    BitField("cos", 0, 3),
+
+                    BitField("s", 1, 1),
+
+                    ByteField("ttl", 0)  ]
+
+
+
+bind_layers(Ether, MPLS, type=0x8847)
-- 
2.17.1


^ permalink raw reply	[flat|nested] 6+ messages in thread

* [dts] [PATCH V1 2/5] tests/TestSuite_ddp_gtp.py: load the local dep module in scapy command
  2019-09-17 23:19 [dts] [PATCH V1 1/5] dep: add dependency modules for ddp suites Xinfeng Zhao
@ 2019-09-17 23:19 ` Xinfeng Zhao
  2019-09-17 23:19 ` [dts] [PATCH V1 3/5] tests/TestSuite_ddp_gtp_qregion.py: " Xinfeng Zhao
                   ` (3 subsequent siblings)
  4 siblings, 0 replies; 6+ messages in thread
From: Xinfeng Zhao @ 2019-09-17 23:19 UTC (permalink / raw)
  To: dts; +Cc: Xinfeng Zhao

Signed-off-by: Xinfeng Zhao <xinfengx.zhao@intel.com>
---
 tests/TestSuite_ddp_gtp.py | 7 ++++++-
 1 file changed, 6 insertions(+), 1 deletion(-)

diff --git a/tests/TestSuite_ddp_gtp.py b/tests/TestSuite_ddp_gtp.py
index b8f6817..d8e1302 100644
--- a/tests/TestSuite_ddp_gtp.py
+++ b/tests/TestSuite_ddp_gtp.py
@@ -2,15 +2,18 @@
 
 import time
 import re
+import os
 import sys
 import utils
 from qemu_kvm import QEMUKvm
 from test_case import TestCase
 from pmd_output import PmdOutput
-from settings import get_nic_name
+from settings import get_nic_name, FOLDERS
 import random
 
 VM_CORES_MASK = 'all'
+CWD = os.getcwd()
+DIR_DEPEND = os.path.join(CWD, FOLDERS['Depends'])
 
 
 class TestDdpGtp(TestCase):
@@ -294,6 +297,8 @@ class TestDdpGtp(TestCase):
                 for chksum_opt in ['good chksum', 'bad chksum']:
                     pkts = self.gtp_packets(
                         type, tunnel_pkt, inner_L3, match_opt, chk, teid)
+                    self.tester.scapy_append("sys.path.append('%s')" % DIR_DEPEND)
+                    self.tester.scapy_append("from gtp import *")
                     for packet_type in pkts.keys():
                         count = count + 1
                         self.tester.scapy_append(
-- 
2.17.1


^ permalink raw reply	[flat|nested] 6+ messages in thread

* [dts] [PATCH V1 3/5] tests/TestSuite_ddp_gtp_qregion.py: load the local dep module in scapy command
  2019-09-17 23:19 [dts] [PATCH V1 1/5] dep: add dependency modules for ddp suites Xinfeng Zhao
  2019-09-17 23:19 ` [dts] [PATCH V1 2/5] tests/TestSuite_ddp_gtp.py: load the local dep module in scapy command Xinfeng Zhao
@ 2019-09-17 23:19 ` " Xinfeng Zhao
  2019-09-17 23:19 ` [dts] [PATCH V1 4/5] tests/TestSuite_ddp_mpls.py: " Xinfeng Zhao
                   ` (2 subsequent siblings)
  4 siblings, 0 replies; 6+ messages in thread
From: Xinfeng Zhao @ 2019-09-17 23:19 UTC (permalink / raw)
  To: dts; +Cc: Xinfeng Zhao

Signed-off-by: Xinfeng Zhao <xinfengx.zhao@intel.com>
---
 tests/TestSuite_ddp_gtp_qregion.py | 14 ++++++++++++--
 1 file changed, 12 insertions(+), 2 deletions(-)

diff --git a/tests/TestSuite_ddp_gtp_qregion.py b/tests/TestSuite_ddp_gtp_qregion.py
index 4963f5f..c79082a 100644
--- a/tests/TestSuite_ddp_gtp_qregion.py
+++ b/tests/TestSuite_ddp_gtp_qregion.py
@@ -2,12 +2,18 @@
 
 import time
 import re
+import os
 import sys
 import utils
-from scapy.all import *
+from scapy.all import Ether, IP, UDP, IPv6, IPv6
 from test_case import TestCase
 from pmd_output import PmdOutput
-from settings import get_nic_name
+from settings import get_nic_name, FOLDERS
+import random
+from gtp import *
+
+CWD = os.getcwd()
+DIR_DEPEND = os.path.join(CWD, FOLDERS['Depends'])
 
 
 class TestDdpGtpQregion(TestCase):
@@ -148,6 +154,8 @@ class TestDdpGtpQregion(TestCase):
         """
         pkts = self.gtp_pkts(flowtype, keyword, opt)
         for packet_type in pkts.keys():
+            self.tester.scapy_append("sys.path.append('%s')" % DIR_DEPEND)
+            self.tester.scapy_append("from gtp import *")
             self.tester.scapy_append(
                 'sendp([%s], iface="%s")'
                 % (pkts[packet_type], self.tester_intf))
@@ -210,6 +218,8 @@ class TestDdpGtpQregion(TestCase):
                     keyword = 'src_ipv6'
             pkts = self.gtp_pkts(flowtype, keyword, opt)
             for packet_type in pkts.keys():
+                self.tester.scapy_append("sys.path.append('%s')" % DIR_DEPEND)
+                self.tester.scapy_append("from gtp import *")
                 self.tester.scapy_append(
                     'sendp([%s], iface="%s")'
                     % (pkts[packet_type], self.tester_intf))
-- 
2.17.1


^ permalink raw reply	[flat|nested] 6+ messages in thread

* [dts] [PATCH V1 4/5] tests/TestSuite_ddp_mpls.py: load the local dep module in scapy command
  2019-09-17 23:19 [dts] [PATCH V1 1/5] dep: add dependency modules for ddp suites Xinfeng Zhao
  2019-09-17 23:19 ` [dts] [PATCH V1 2/5] tests/TestSuite_ddp_gtp.py: load the local dep module in scapy command Xinfeng Zhao
  2019-09-17 23:19 ` [dts] [PATCH V1 3/5] tests/TestSuite_ddp_gtp_qregion.py: " Xinfeng Zhao
@ 2019-09-17 23:19 ` " Xinfeng Zhao
  2019-09-17 23:19 ` [dts] [PATCH V1 5/5] tests/TestSuite_ddp_ppp_l2tp.py: " Xinfeng Zhao
  2019-09-18  7:28 ` [dts] [PATCH V1 1/5] dep: add dependency modules for ddp suites Zhao, XinfengX
  4 siblings, 0 replies; 6+ messages in thread
From: Xinfeng Zhao @ 2019-09-17 23:19 UTC (permalink / raw)
  To: dts; +Cc: Xinfeng Zhao

Signed-off-by: Xinfeng Zhao <xinfengx.zhao@intel.com>
---
 tests/TestSuite_ddp_mpls.py | 10 ++++++++--
 1 file changed, 8 insertions(+), 2 deletions(-)

diff --git a/tests/TestSuite_ddp_mpls.py b/tests/TestSuite_ddp_mpls.py
index 547e1c9..8e74047 100644
--- a/tests/TestSuite_ddp_mpls.py
+++ b/tests/TestSuite_ddp_mpls.py
@@ -1,6 +1,7 @@
 # <COPYRIGHT_TAG>
 
 import time
+import os
 import sys
 import utils 
 from scapy.utils import rdpcap
@@ -8,12 +9,15 @@ from scapy.utils import rdpcap
 from qemu_kvm import QEMUKvm
 from test_case import TestCase
 from pmd_output import PmdOutput
-from settings import get_nic_name
+from settings import get_nic_name, FOLDERS
 import random
 
 VM_CORES_MASK = 'all'
 PF_MAX_QUEUE = 64
 VF_MAX_QUEUE = 4
+CWD = os.getcwd()
+DIR_DEPEND = os.path.join(CWD, FOLDERS['Depends'])
+
 
 class Testddp_mpls(TestCase):
     supported_vf_driver = ['pci-stub', 'vfio-pci']
@@ -175,7 +179,9 @@ class Testddp_mpls(TestCase):
                             /MPLS(label=%s)/Ether()/IP()/UDP()'% label,
                         'mpls/bad chksum gre': 'Ether()/IP(proto=47)/GRE(chksum=0x1234,\
                             proto=0x8847)/MPLS(label=%s)/Ether()/IP()/UDP()'% label }
-            for packet_type in pkts.keys(): 
+            for packet_type in pkts.keys():
+                self.tester.scapy_append("sys.path.append('%s')" % DIR_DEPEND)
+                self.tester.scapy_append("from mpls import *")
                 self.tester.scapy_append('sendp([%s], iface="%s")' 
                     % (pkts[packet_type], self.tester_intf)) 
                 self.tester.scapy_execute()
-- 
2.17.1


^ permalink raw reply	[flat|nested] 6+ messages in thread

* [dts] [PATCH V1 5/5] tests/TestSuite_ddp_ppp_l2tp.py: load the local dep module in scapy command
  2019-09-17 23:19 [dts] [PATCH V1 1/5] dep: add dependency modules for ddp suites Xinfeng Zhao
                   ` (2 preceding siblings ...)
  2019-09-17 23:19 ` [dts] [PATCH V1 4/5] tests/TestSuite_ddp_mpls.py: " Xinfeng Zhao
@ 2019-09-17 23:19 ` " Xinfeng Zhao
  2019-09-18  7:28 ` [dts] [PATCH V1 1/5] dep: add dependency modules for ddp suites Zhao, XinfengX
  4 siblings, 0 replies; 6+ messages in thread
From: Xinfeng Zhao @ 2019-09-17 23:19 UTC (permalink / raw)
  To: dts; +Cc: Xinfeng Zhao

Signed-off-by: Xinfeng Zhao <xinfengx.zhao@intel.com>
---
 tests/TestSuite_ddp_ppp_l2tp.py | 11 +++++++++--
 1 file changed, 9 insertions(+), 2 deletions(-)

diff --git a/tests/TestSuite_ddp_ppp_l2tp.py b/tests/TestSuite_ddp_ppp_l2tp.py
index 2dd8baf..b1dc755 100644
--- a/tests/TestSuite_ddp_ppp_l2tp.py
+++ b/tests/TestSuite_ddp_ppp_l2tp.py
@@ -2,13 +2,18 @@
 
 import time
 import re
+import os
 import sys
 import utils
 from test_case import TestCase
 from pmd_output import PmdOutput
-from settings import get_nic_name
-from scapy.all import *
+from settings import get_nic_name, FOLDERS
+from scapy.all import Ether, IP, UDP, IPv6, IPv6, PPPoE
 import random
+from l2tp import *
+
+CWD = os.getcwd()
+DIR_DEPEND = os.path.join(CWD, FOLDERS['Depends'])
 
 
 class TestDdpPppL2tp(TestCase):
@@ -147,6 +152,8 @@ class TestDdpPppL2tp(TestCase):
         """
         pkts = self.ppp_l2tp_pkts(flowtype, keyword)
         for packet_type in pkts.keys():
+            self.tester.scapy_append("sys.path.append('%s')" % DIR_DEPEND)
+            self.tester.scapy_append("from l2tp import *")
             self.tester.scapy_append(
                 'sendp([%s], iface="%s")'
                 % (pkts[packet_type], self.tester_intf))
-- 
2.17.1


^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [dts] [PATCH V1 1/5] dep: add dependency modules for ddp suites
  2019-09-17 23:19 [dts] [PATCH V1 1/5] dep: add dependency modules for ddp suites Xinfeng Zhao
                   ` (3 preceding siblings ...)
  2019-09-17 23:19 ` [dts] [PATCH V1 5/5] tests/TestSuite_ddp_ppp_l2tp.py: " Xinfeng Zhao
@ 2019-09-18  7:28 ` Zhao, XinfengX
  4 siblings, 0 replies; 6+ messages in thread
From: Zhao, XinfengX @ 2019-09-18  7:28 UTC (permalink / raw)
  To: dts; +Cc: Chen, Zhaoyan

Tested-by: Zhao, XinfengX <xinfengx.zhao@intel.com>

-----Original Message-----
From: Zhao, XinfengX 
Sent: Wednesday, September 18, 2019 7:19 AM
To: dts@dpdk.org
Cc: Zhao, XinfengX <xinfengx.zhao@intel.com>
Subject: [dts][PATCH V1 1/5] dep: add dependency modules for ddp suites

Signed-off-by: Xinfeng Zhao <xinfengx.zhao@intel.com>
---
 dep/gtp.py  | 112 ++++++++++++++++++++++++++++++++++++++++++++++++++++
 dep/l2tp.py |  50 +++++++++++++++++++++++  dep/mpls.py |  33 ++++++++++++++++
 3 files changed, 195 insertions(+)
 create mode 100644 dep/gtp.py
 create mode 100644 dep/l2tp.py
 create mode 100644 dep/mpls.py

diff --git a/dep/gtp.py b/dep/gtp.py
new file mode 100644
index 0000000..693327f
--- /dev/null
+++ b/dep/gtp.py
@@ -0,0 +1,112 @@
+#! /usr/bin/env python
+
+## Copyright (C) 2017 Alexis Sultan    <alexis.sultan@sfr.com>
+##               2017 Alessio Deiana <adeiana@gmail.com>
+##               2014 Guillaume Valadon <guillaume.valadon@ssi.gouv.fr>
+##               2012 ffranz <ffranz@iniqua.com>
+##
+## This program is published under a GPLv2 license
+
+# scapy.contrib.description = GTP
+# scapy.contrib.status = loads
+
+from __future__ import absolute_import
+from scapy.packet import *
+from scapy.fields import *
+from scapy.layers.inet import IP, UDP
+from scapy.layers.inet6 import IPv6
+
+# GTP Data types
+GTPmessageType = {   1: "echo_request",
+                     2: "echo_response",
+                    16: "create_pdp_context_req",
+                    17: "create_pdp_context_res",
+                    18: "update_pdp_context_req",
+                    19: "update_pdp_context_resp",
+                    20: "delete_pdp_context_req",
+                    21: "delete_pdp_context_res",
+                    26: "error_indication",
+                    27: "pdu_notification_req",
+                    31: "supported_extension_headers_notification",
+                   254: "end_marker",
+                   255: "g_pdu" }
+
+# 
+http://www.arib.or.jp/IMT-2000/V720Mar09/5_Appendix/Rel8/29/29281-800.p
+df
+ExtensionHeadersTypes = {
+        0: "No more extension headers",
+        1: "Reserved",
+        2: "Reserved",
+        64: "UDP Port",
+        192: "PDCP PDU Number",
+        193: "Reserved",
+        194: "Reserved"
+    }
+
+class GTPHeader(Packet):
+    # 3GPP TS 29.060 V9.1.0 (2009-12)
+    name = "GTP-C Header"
+    fields_desc=[ BitField("version", 1, 3),
+                  BitField("PT", 1, 1),
+                  BitField("reserved", 0, 1),
+                  BitField("E", 0, 1),
+                  BitField("S", 0, 1),
+                  BitField("PN", 0, 1),
+                  ByteEnumField("gtp_type", None, GTPmessageType),
+                  ShortField("length", None),
+                  IntField("teid", 0),
+                  ConditionalField(XBitField("seq", 0, 16), lambda pkt:pkt.E==1 or pkt.S==1 or pkt.PN==1),
+                  ConditionalField(ByteField("npdu", 0), lambda pkt:pkt.E==1 or pkt.S==1 or pkt.PN==1),
+                  ConditionalField(ByteEnumField("next_ex", 0, 
+ExtensionHeadersTypes), lambda pkt:pkt.E==1 or pkt.S==1 or pkt.PN==1), 
+]
+
+    def post_build(self, p, pay):
+        p += pay
+        if self.length is None:
+            l = len(p)-8
+            p = p[:2] + struct.pack("!H", l)+ p[4:]
+        return p
+
+    def hashret(self):
+        return struct.pack("B", self.version) + self.payload.hashret()
+
+    def answers(self, other):
+        return (isinstance(other, GTPHeader) and
+                self.version == other.version and
+                self.payload.answers(other.payload))
+
+    @classmethod
+    def dispatch_hook(cls, _pkt=None, *args, **kargs):
+        if _pkt and len(_pkt) >= 1:
+            if (struct.unpack("B", _pkt[0])[0] >> 5) & 0x7 == 2:
+                from . import gtp_v2
+                return gtp_v2.GTPHeader
+        if _pkt and len(_pkt) >= 8:
+            _gtp_type = struct.unpack("!B", _pkt[1:2])[0]
+            return GTPforcedTypes.get(_gtp_type, GTPHeader)
+        return cls
+
+class GTP_U_Header(GTPHeader):
+    # 3GPP TS 29.060 V9.1.0 (2009-12)
+    name = "GTP-U Header"
+    # GTP-U protocol is used to transmit T-PDUs between GSN pairs (or between an SGSN and an RNC in UMTS),
+    # encapsulated in G-PDUs. A G-PDU is a packet including a GTP-U header and a T-PDU. The Path Protocol
+    # defines the path and the GTP-U header defines the tunnel. Several tunnels may be multiplexed on a single path.
+
+# Some gtp_types have to be associated with a certain type of header 
+GTPforcedTypes = {
+    16: GTPHeader,
+    17: GTPHeader,
+    18: GTPHeader,
+    19: GTPHeader,
+    20: GTPHeader,
+    21: GTPHeader,
+    26: GTP_U_Header,
+    27: GTPHeader,
+    254: GTP_U_Header,
+    255: GTP_U_Header
+    }
+
+# Bind GTP-U
+bind_layers(UDP, GTP_U_Header, dport = 2152) bind_layers(UDP, 
+GTP_U_Header, sport = 2152) bind_layers(GTP_U_Header, IP, gtp_type = 
+255) bind_layers(GTP_U_Header, IPv6, gtp_type = 255)
diff --git a/dep/l2tp.py b/dep/l2tp.py
new file mode 100644
index 0000000..90c2bcf
--- /dev/null
+++ b/dep/l2tp.py
@@ -0,0 +1,50 @@
+## This file is part of Scapy
+## See http://www.secdev.org/projects/scapy for more informations ## 
+Copyright (C) Philippe Biondi <phil@secdev.org> ## This program is 
+published under a GPLv2 license
+
+"""
+L2TP (Layer 2 Tunneling Protocol) for VPNs.
+
+[RFC 2661]
+"""
+
+import struct
+
+from scapy.packet import *
+from scapy.fields import *
+from scapy.layers.inet import UDP
+from scapy.layers.ppp import PPP
+
+class L2TP(Packet):
+    fields_desc = [ ShortEnumField("pkt_type",2,{2:"data"}),
+                    ShortField("len", None),
+                    #ShortField("tunnelid", 0),
+                    ShortField("sessionid", 0),
+                    ShortField("ns", 0),
+                    ShortField("nr", 0),
+                    ShortField("offset", 0)
+                ]
+
+    def post_build(self, pkt, pay):
+        if self.len is None:
+            l = len(pkt)+len(pay)
+            pkt = pkt[:2]+struct.pack("!H", l)+pkt[4:]
+        return pkt+pay
+
+class PPP_L2TP(Packet):
+    fields_desc = [ ShortEnumField("pkt_type",0x4002,{2:"data"}),
+                    ShortField("tunnelid", 0),
+                    ShortField("sessionid", 0),
+                    ShortField("address_control", 0xff03),
+                    ShortField("proto", 0x0021) ]
+                    #ShortField("proto", None) ]
+
+    def post_build(self, pkt, pay):
+        if self.pkt_type & 0x4000:
+            l = len(pkt)+2+len(pay)
+            pkt = pkt[:2]+struct.pack("!H", l)+pkt[2:]
+        return pkt+pay
+
+bind_layers( UDP,           L2TP,          sport=1701, dport=1701)
+bind_layers( L2TP,          PPP,           )
diff --git a/dep/mpls.py b/dep/mpls.py
new file mode 100644
index 0000000..e211b7b
--- /dev/null
+++ b/dep/mpls.py
@@ -0,0 +1,33 @@
+# http://trac.secdev.org/scapy/ticket/31
+
+
+
+# scapy.contrib.description = MPLS
+
+# scapy.contrib.status = loads
+
+
+
+from scapy.packet import Packet,bind_layers
+
+from scapy.fields import BitField,ByteField
+
+from scapy.layers.l2 import Ether
+
+
+
+class MPLS(Packet):
+
+   name = "MPLS"
+
+   fields_desc =  [ BitField("label", 3, 20),
+
+                    BitField("cos", 0, 3),
+
+                    BitField("s", 1, 1),
+
+                    ByteField("ttl", 0)  ]
+
+
+
+bind_layers(Ether, MPLS, type=0x8847)
--
2.17.1


^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, back to index

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-09-17 23:19 [dts] [PATCH V1 1/5] dep: add dependency modules for ddp suites Xinfeng Zhao
2019-09-17 23:19 ` [dts] [PATCH V1 2/5] tests/TestSuite_ddp_gtp.py: load the local dep module in scapy command Xinfeng Zhao
2019-09-17 23:19 ` [dts] [PATCH V1 3/5] tests/TestSuite_ddp_gtp_qregion.py: " Xinfeng Zhao
2019-09-17 23:19 ` [dts] [PATCH V1 4/5] tests/TestSuite_ddp_mpls.py: " Xinfeng Zhao
2019-09-17 23:19 ` [dts] [PATCH V1 5/5] tests/TestSuite_ddp_ppp_l2tp.py: " Xinfeng Zhao
2019-09-18  7:28 ` [dts] [PATCH V1 1/5] dep: add dependency modules for ddp suites Zhao, XinfengX

test suite reviews and discussions

Archives are clonable:
	git clone --mirror http://inbox.dpdk.org/dts/0 dts/git/0.git

	# If you have public-inbox 1.1+ installed, you may
	# initialize and index your mirror using the following commands:
	public-inbox-init -V2 dts dts/ http://inbox.dpdk.org/dts \
		dts@dpdk.org
	public-inbox-index dts


Newsgroup available over NNTP:
	nntp://inbox.dpdk.org/inbox.dpdk.dts


AGPL code for this site: git clone https://public-inbox.org/ public-inbox