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