diff --git a/scapy/fields.py b/scapy/fields.py index 59d26c7db5a46757922dce3fc4b0ff79901a95e7..280c1b3c21c88db0a14134459c8d85351d648971 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 2a1ddaa703ebaee24c48c300865a5d7b07e1b1af..d5f1b97791b7bceb243a4d8bca3803acf993ec7f 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 2f7bb3096d2327b4193b5a177d105db4ec7804c4..64730b46457d66e38a853afead7efc524ddcc99f 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 b12b6fe029475ba96aac79d7e45ff157655001ee..61ba3301f77a01f3064a52c7910ad52602980122 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 a5bc6e38f433ac1908f81ba3358463b09b8aee91..4d33cc7971cd5e4eac1e3b92c193b1ff86d37a30 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: