From 43843b2689d7dbc90d65c67dc3c409e021b040b3 Mon Sep 17 00:00:00 2001
From: Phil <phil@secdev.org>
Date: Mon, 28 Jul 2008 16:13:00 +0200
Subject: [PATCH] Added packet.route()

---
 scapy/fields.py      |  4 +++-
 scapy/layers/inet.py |  5 +++++
 scapy/layers/l2.py   | 38 ++++++++++++++------------------------
 scapy/packet.py      |  4 +++-
 scapy/supersocket.py | 14 ++++----------
 5 files changed, 29 insertions(+), 36 deletions(-)

diff --git a/scapy/fields.py b/scapy/fields.py
index 59d26c7d..280c1b3c 100644
--- a/scapy/fields.py
+++ b/scapy/fields.py
@@ -220,7 +220,9 @@ class SourceIPField(IPField):
         self.dstname = dstname
     def i2m(self, pkt, x):
         if x is None:
-            iff,x,gw = conf.route.route(getattr(pkt,self.dstname))
+            iff,x,gw = pkt.route()
+            if x is None:
+                x = "0.0.0.0"
         return IPField.i2m(self, pkt, x)
     def i2h(self, pkt, x):
         if x is None:
diff --git a/scapy/layers/inet.py b/scapy/layers/inet.py
index 2a1ddaa7..d5f1b977 100644
--- a/scapy/layers/inet.py
+++ b/scapy/layers/inet.py
@@ -201,6 +201,11 @@ class IP(Packet, IPTools):
                 log_runtime.error(msg)
             if slp:
                 time.sleep(slp)
+    def route(self):
+        dst = self.dst
+        if isinstance(dst,Gen):
+            dst = iter(dst).next()
+        return conf.route.route(dst)
     def hashret(self):
         if ( (self.proto == socket.IPPROTO_ICMP)
              and (isinstance(self.payload, ICMP))
diff --git a/scapy/layers/l2.py b/scapy/layers/l2.py
index 2f7bb309..64730b46 100644
--- a/scapy/layers/l2.py
+++ b/scapy/layers/l2.py
@@ -5,6 +5,7 @@ from scapy.ansmachine import *
 from scapy.plist import SndRcvList
 from scapy.fields import *
 from scapy.sendrecv import srp,srp1
+from scapy.arch import get_if_hwaddr
 
 
 
@@ -81,27 +82,14 @@ class SourceMACField(MACField):
         MACField.__init__(self, name, None)
     def i2h(self, pkt, x):
         if x is None:
-            dstip = None
-            if isinstance(pkt.payload, IPv6):
-                dstip = pkt.payload.dst
-            elif isinstance(pkt.payload, IP):
-                dstip = pkt.payload.dst
-            elif isinstance(pkt.payload, ARP):
-                dstip = pkt.payload.pdst
-            if isinstance(dstip, Gen):
-                dstip = dstip.__iter__().next()
-
-            if dstip is not None:
-                if isinstance(pkt.payload, IPv6):
-                    iff,a,nh = conf.route6.route(dstip)
-                else:
-                    iff,a,gw = conf.route.route(dstip)
+            iff,a,gw = pkt.payload.route()
+            if iff:
                 try:
                     x = get_if_hwaddr(iff)
                 except:
                     pass
-                if x is None:
-                    x = "00:00:00:00:00:00"
+            if x is None:
+                x = "00:00:00:00:00:00"
         return MACField.i2h(self, pkt, x)
     def i2m(self, pkt, x):
         return MACField.i2m(self, pkt, self.i2h(pkt, x))
@@ -111,17 +99,14 @@ class ARPSourceMACField(MACField):
         MACField.__init__(self, name, None)
     def i2h(self, pkt, x):
         if x is None:
-            dstip = pkt.pdst
-            if isinstance(dstip, Gen):
-                dstip = dstip.__iter__().next()
-            if dstip is not None:
-                iff,a,gw = conf.route.route(dstip)
+            iff,a,gw = pkt.route()
+            if iff:
                 try:
                     x = get_if_hwaddr(iff)
                 except:
                     pass
-                if x is None:
-                    x = "00:00:00:00:00:00"
+            if x is None:
+                x = "00:00:00:00:00:00"
         return MACField.i2h(self, pkt, x)
     def i2m(self, pkt, x):
         return MACField.i2m(self, pkt, self.i2h(pkt, x))
@@ -329,6 +314,11 @@ class ARP(Packet):
                  (self.psrc == other.pdst) ):
                 return 1
         return 0
+    def route(self):
+        dst = self.pdst
+        if isinstance(dst,Gen):
+            dst = iter(dst).next()
+        return conf.route.route(dst)
     def extract_padding(self, s):
         return "",s
     def mysummary(self):
diff --git a/scapy/packet.py b/scapy/packet.py
index b12b6fe0..61ba3301 100644
--- a/scapy/packet.py
+++ b/scapy/packet.py
@@ -723,7 +723,9 @@ Creates an EPS file describing a packet. If filename is not provided a temporary
     def __contains__(self, cls):
         """"cls in self" returns true if self has a layer which is an instance of cls."""
         return self.haslayer(cls)
-        
+
+    def route(self):
+        return (None,None,None)
     
 
     def display(self,*args,**kargs):  # Deprecated. Use show()
diff --git a/scapy/supersocket.py b/scapy/supersocket.py
index a5bc6e38..4d33cc79 100644
--- a/scapy/supersocket.py
+++ b/scapy/supersocket.py
@@ -132,11 +132,8 @@ class L3PacketSocket(SuperSocket):
         return pkt
     
     def send(self, x):
-        if isinstance(x, IPv6):
-            iff,a,gw = conf.route6.route(x.dst)
-        elif hasattr(x,"dst"):
-            iff,a,gw = conf.route.route(x.dst)
-        else:
+        iff,a,gw  = x.route()
+        if iff is None:
             iff = conf.iface
         sdto = (iff, self.type)
         self.outs.bind(sdto)
@@ -299,11 +296,8 @@ class L3dnetSocket(SuperSocket):
         if filter:
             self.ins.setfilter(filter, 0, 0)
     def send(self, x):
-        if isinstance(x, IPv6):
-            iff,a,gw = conf.route6.route(x.dst)
-        elif hasattr(x,"dst"):
-            iff,a,gw = conf.route.route(x.dst)
-        else:
+        iff,a,gw  = x.route()
+        if iff is None:
             iff = conf.iface
         ifs = self.iflist.get(iff)
         if ifs is None:
-- 
GitLab