From f5a5e7285362d4be5163ca9f3eed0f355862d24b Mon Sep 17 00:00:00 2001
From: Phil <phil@secdev.org>
Date: Tue, 12 Feb 2008 13:03:15 +0100
Subject: [PATCH] Made setattr/delattr on fields consistent with getattr, i.e.
 work on payloads

Added Packet.setfieldval() and Packet.delfieldval()
(Ticket #86)
---
 scapy.py | 62 +++++++++++++++++++++++++++++++++++++-------------------
 1 file changed, 41 insertions(+), 21 deletions(-)

diff --git a/scapy.py b/scapy.py
index 2e9227ef..7e53bf8f 100755
--- a/scapy.py
+++ b/scapy.py
@@ -5252,33 +5252,49 @@ class Packet(Gen):
             return v
         raise AttributeError(attr)
 
+    def setfieldval(self, attr, val):
+        if self.default_fields.has_key(attr):
+            fld = self.get_field(attr)
+            if fld is None:
+                any2i = lambda x,y: y
+            else:
+                any2i = fld.any2i
+            self.fields[attr] = any2i(self, val)
+            self.explicit=0
+        elif attr == "payload":
+            self.remove_payload()
+            self.add_payload(val)
+        else:
+            self.payload.setfieldval(attr,val)
+
     def __setattr__(self, attr, val):
         if self.initialized:
-            if self.default_fields.has_key(attr):
-                fld = self.get_field(attr)
-                if fld is None:
-                    any2i = lambda x,y: y
-                else:
-                    any2i = fld.any2i
-                self.fields[attr] = any2i(self, val)
-                self.explicit=0
-            elif attr == "payload":
-                self.remove_payload()
-                self.add_payload(val)
+            try:
+                self.setfieldval(attr,val)
+            except AttributeError:
+                pass
             else:
-                self.__dict__[attr] = val
+                return
+        self.__dict__[attr] = val
+
+    def delfieldval(self, attr):
+        if self.fields.has_key(attr):
+            del(self.fields[attr])
+            self.explicit=0 # in case a default value must be explicited
+        elif self.default_fields.has_key(attr):
+            pass
+        elif attr == "payload":
+            self.remove_payload()
         else:
-            self.__dict__[attr] = val
+            self.payload.delfieldval(attr)
+
     def __delattr__(self, attr):
         if self.initialized:
-            if self.fields.has_key(attr):
-                del(self.fields[attr])
-                self.explicit=0 # in case a default value must be explicited
-                return
-            elif self.default_fields.has_key(attr):
-                return
-            elif attr == "payload":
-                self.remove_payload()
+            try:
+                self.delfieldval(attr)
+            except AttributeError:
+                pass
+            else:
                 return
         if self.__dict__.has_key(attr):
             del(self.__dict__[attr])
@@ -6069,6 +6085,10 @@ class NoPayload(Packet,object):
         raise AttributeError(attr)
     def getfield_and_val(self, attr):
         raise AttributeError(attr)
+    def setfieldval(self, attr, val):
+        raise AttributeError(attr)
+    def delfieldval(self, attr):
+        raise AttributeError(attr)
     def __getattr__(self, attr):
         if attr in self.__dict__:
             return self.__dict__[attr]
-- 
GitLab