diff --git a/scapy/packet.py b/scapy/packet.py index 90f238eee4b6dcef4d3f31169e210ae78a3aaf31..eb8e265e3f0831477b74f301d39cb37148f53fcb 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 bd13bbefe2dedc8940d2c4a31081785df9b32697..0da39aa3a932165e569956f68573df5247d23b77 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")