diff --git a/scapy/fields.py b/scapy/fields.py index 339796ef7e7a21d2bc3e68337147e841b06822f7..2b2896686470e743d0076789a3d350e5141dd918 100644 --- a/scapy/fields.py +++ b/scapy/fields.py @@ -180,80 +180,6 @@ class MACField(Field): def randval(self): return RandMAC() -class DestMACField(MACField): - def __init__(self, name): - 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): - x = getmacbyip6(dstip, chainCC=1) - else: - x = getmacbyip(dstip, chainCC=1) - if x is None: - x = "ff:ff:ff:ff:ff:ff" - warning("Mac address to reach %s not found\n"%dstip) - return MACField.i2h(self, pkt, x) - def i2m(self, pkt, x): - return MACField.i2m(self, pkt, self.i2h(pkt, x)) - -class SourceMACField(MACField): - def __init__(self, name): - 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) - try: - x = get_if_hwaddr(iff) - except: - pass - 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)) - -class ARPSourceMACField(MACField): - def __init__(self, name): - 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) - try: - x = get_if_hwaddr(iff) - except: - pass - 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)) class Dot11AddrMACField(MACField): def is_applicable(self, pkt): diff --git a/scapy/layers/l2.py b/scapy/layers/l2.py index d112c17782f3551034561981cdcc6ba3a93d7fdb..6fd8ab212d39d4da66ced7563c160b69e1321abb 100644 --- a/scapy/layers/l2.py +++ b/scapy/layers/l2.py @@ -6,6 +6,87 @@ from scapy.plist import SndRcvList from scapy.fields import * from scapy.sendrecv import srp,srp1 +### Fields + +class DestMACField(MACField): + def __init__(self, name): + 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): + x = getmacbyip6(dstip, chainCC=1) + else: + x = getmacbyip(dstip, chainCC=1) + if x is None: + x = "ff:ff:ff:ff:ff:ff" + warning("Mac address to reach %s not found\n"%dstip) + return MACField.i2h(self, pkt, x) + def i2m(self, pkt, x): + return MACField.i2m(self, pkt, self.i2h(pkt, x)) + +class SourceMACField(MACField): + def __init__(self, name): + 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) + try: + x = get_if_hwaddr(iff) + except: + pass + 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)) + +class ARPSourceMACField(MACField): + def __init__(self, name): + 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) + try: + x = get_if_hwaddr(iff) + except: + pass + 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)) + + + +### Layers + class Ether_or_Dot3_metaclass(Packet_metaclass): def __call__(self, _pkt=None, *args, **kargs): cls = self diff --git a/scapy/layers/netbios.py b/scapy/layers/netbios.py index fdfa4215a9702e10e9f1a9d53d55e8f0a0f0351a..098c965f4f55e00782cbefac14b296a41af0b803 100644 --- a/scapy/layers/netbios.py +++ b/scapy/layers/netbios.py @@ -2,6 +2,7 @@ import struct from scapy.packet import * from scapy.fields import * from scapy.layers.inet import UDP,TCP +from scapy.layers.l2 import SourceMACField class NetBIOS_DS(Packet): name = "NetBIOS datagram service"