From f3016aca7ca2742f118310d0ddb2dc87153e1b4a Mon Sep 17 00:00:00 2001
From: gpotter2 <gabriel@potter.fr>
Date: Tue, 28 Feb 2017 21:38:32 +0100
Subject: [PATCH] Add pickling methods

---
 scapy/packet.py     | 25 +++++++++++++++++++++++++
 test/regression.uts | 21 +++++++++++++++++++++
 2 files changed, 46 insertions(+)

diff --git a/scapy/packet.py b/scapy/packet.py
index 90f238ee..eb8e265e 100644
--- a/scapy/packet.py
+++ b/scapy/packet.py
@@ -73,6 +73,31 @@ class Packet(BasePacket):
         for lower,fval in self._overload_fields.iteritems():
             print "%-20s  %s" % (lower.__name__, ", ".join("%-12s" % ("%s=%r"%i) for i in fval.iteritems()))
 
+    def _unpickle(self, dlist):
+        """Used to unpack pickling"""
+        self.__init__("".join(dlist))
+        return self
+
+    def __reduce__(self):
+        """Used by pickling methods"""
+        return (self.__class__, (), (self.build(),))
+
+    def __reduce_ex__(self, proto):
+        """Used by pickling methods"""
+        return self.__reduce__()
+
+    def __getstate__(self):
+        """Mark object as pickable"""
+        return self.__reduce__()[2]
+
+    def __setstate__(self, state):
+        """Rebuild state using pickable methods"""
+        return self._unpickle(state)
+
+    def __deepcopy__(self, memo):
+        """Used by copy.deepcopy"""
+        return self.copy()
+
     def __init__(self, _pkt="", post_transform=None, _internal=0, _underlayer=None, **fields):
         self.time  = time.time()
         self.sent_time = None
diff --git a/test/regression.uts b/test/regression.uts
index bd13bbef..0da39aa3 100644
--- a/test/regression.uts
+++ b/test/regression.uts
@@ -154,6 +154,27 @@ data = ["init_session(\"scapySession2\")",\
 
 emulate_main_input(data)
 
+= Test pickling with packets
+
+data = ["init_session(\"scapySession1\")",\
+"test_value = IP(src=\"127.0.0.1\", dst=\"8.8.8.8\")",\
+"test_value2 = ICMPv6EchoReply(data=\"testData@%!\")",\
+"save_session()",\
+"del test_value",\
+"load_session()",\
+"assert test_value.src == \"127.0.0.1\"",\
+"assert test_value.dst == \"8.8.8.8\"",\
+"assert test_value2.data == \"testData@%!\""]
+
+emulate_main_input(data)
+
+= Clean up session files
+
+try:
+    os.remove("scapySaveSession.dat")
+except OSError:
+    pass
+
 = Test utility functions
 
 tmpfile =  get_temp_file(autoext=".ut")
-- 
GitLab