diff --git a/scapy/fields.py b/scapy/fields.py index 7f48092c98e7def3913f3ad84d020d1fd033f14e..ffd0209d579eea2233c3fe9bbe5ed48888260d48 100644 --- a/scapy/fields.py +++ b/scapy/fields.py @@ -268,15 +268,15 @@ class SourceIPField(IPField): if conf.route is None: # unused import, only to initialize conf.route import scapy.route - dst=getattr(pkt,self.dstname) - if isinstance(dst,Gen): - r = map(conf.route.route, dst) - r.sort() - if r[0] != r[-1]: - warning("More than one possible route for %s"%repr(dst)) - iff,x,gw = r[0] + dst = ("0.0.0.0" if self.dstname is None else + getattr(pkt, self.dstname)) + if isinstance(dst, (Gen, list)): + r = {conf.route.route(daddr) for daddr in dst} + if len(r) > 1: + warning("More than one possible route for %r" % (dst,)) + x = min(r)[1] else: - iff,x,gw = conf.route.route(dst) + x = conf.route.route(dst)[1] return IPField.i2h(self, pkt, x) diff --git a/scapy/layers/inet6.py b/scapy/layers/inet6.py index dd5929aa60f6c3de6da1fceb88877792896bff27..4fa9314767f1facc52f3c2c3de2a964b8a4f564b 100644 --- a/scapy/layers/inet6.py +++ b/scapy/layers/inet6.py @@ -247,17 +247,17 @@ class SourceIP6Field(IP6Field): return IP6Field.i2m(self, pkt, x) def i2h(self, pkt, x): if x is None: - dst=getattr(pkt,self.dstname) - if isinstance(dst,Gen): - r = map(conf.route6.route, dst) - r.sort() - if r[0] == r[-1]: - x=r[0][1] - else: - warning("More than one possible route for %s"%repr(dst)) - return None + if conf.route6 is None: + # unused import, only to initialize conf.route6 + import scapy.route6 + dst = ("::" if self.dstname is None else getattr(pkt, self.dstname)) + if isinstance(dst, (Gen, list)): + r = {conf.route6.route(daddr) for daddr in dst} + if len(r) > 1: + warning("More than one possible route for %r" % (dst,)) + x = min(r)[1] else: - iff,x,nh = conf.route6.route(dst) + x = conf.route6.route(dst)[1] return IP6Field.i2h(self, pkt, x) class DestIP6Field(IP6Field, DestField):