class TargetInterface(object): def __init__(self, ips=None, ll_protocol=None, link_addr=None): self.ips = IPAddressCollection(ips or []) self.__ll_addr = link_addr self.ll_protocol = ll_protocol def global_ip(self, offset=0, type='v6'): return self.ips.global_ip(offset=offset, type=type) def has_ip(self, ip): return str(ip) in self.ips def ip(self, offset=0, scope=IPAddressCollection.GLOBAL, type='v6'): return self.ips.ip(offset=offset, scope=scope, type=type) def link_local_ip(self, offset=0, type='v6'): return self.ips.link_local_ip(offset=offset, type=type) def ll_addr(self): return self.__ll_addr def __str__(self): s = "<veripy.Target address=" + str(self.__ll_addr) for ip in self.ip(offset='*', scope='*'): s += "\n ip=" + str(ip) s += ">" return s
class Interface(object): def __init__(self, ips=None, link=None, link_addr=None): self.ips = IPAddressCollection(ips or []) self.link = link self.ll_addr = link_addr self.ll_protocol = self.link.ll_protocol self.__on_receive_callbacks = [] self.__on_send_callbacks = [] self.link.bind(self) self.reset() def accept(self, frame): try: if frame.haslayer(self.ll_protocol.frame): packet = frame.getlayer(self.ll_protocol.frame)[1] else: packet = frame except AttributeError: packet = frame self.__raw_buffer.append(frame) self.__receive_buffer.append(packet) for callback in self.__on_receive_callbacks: callback(packet, self) def clear_received(self): self.__raw_buffer = [] self.__receive_buffer = [] def global_ip(self, offset=0, type='v6'): return self.ips.global_ip(offset=offset, type=type) def has_ip(self, ip): return str(ip) in self.ips def ip(self, offset=0, scope=IPAddressCollection.GLOBAL, type='v6'): return self.ips.ip(offset=offset, scope=scope, type=type) def link_local_ip(self, offset=0, type='v6'): return self.ips.link_local_ip(offset=offset, type=type) def on_send(self, callback): self.__on_send_callbacks.append(callback) def on_receive(self, callback): self.__on_receive_callbacks.append(callback) def real(self): return RealInterface(self) def received(self, src=None, dst=None, lbda=None, seq=None, type=None, raw=False): packet_list = PacketList(raw and self.__raw_buffer[:] or self.__receive_buffer[:]) def packet_dst_in(dsts, p): dsts = isinstance(dsts, list) and dsts or [dsts] for d in dsts: d = IPAddress.identify(d) if d.version() == 4 and p.haslayer(IP) and IPAddress.identify(p.getlayer(IP).dst) == d: return True elif d.version() == 6 and p.haslayer(IPv6) and IPAddress.identify(p.getlayer(IPv6).dst) == d: return True return False def packet_src_in(srcs, p): srcs = isinstance(srcs, list) and srcs or [srcs] for s in srcs: s = IPAddress.identify(s) if s.version() == 4 and p.haslayer(IP) and IPAddress.identify(p.getlayer(IP).src) == s: return True elif s.version() == 6 and p.haslayer(IPv6) and IPAddress.identify(p.getlayer(IPv6).src) == s: return True return False if not (src == None and dst == None and lbda == None and seq == None and type == None): packet_list = packet_list.filter(lambda p: (src == None or hasattr(p, 'haslayer') and packet_src_in(src, p)) and \ (dst == None or hasattr(p, 'haslayer') and packet_dst_in(dst, p)) and \ (seq == None or hasattr(p, 'haslayer') and (p.haslayer(ICMPv6EchoRequest) and p.getlayer(ICMPv6EchoRequest).seq == seq or p.haslayer(ICMPv6EchoReply) and p.getlayer(ICMPv6EchoReply).seq == seq)) and \ (type == None or hasattr(p, 'haslayer') and p.getlayer(type)) and \ (lbda == None or lbda(p))) return packet_list def reset(self): self.__raw_buffer = [] self.__receive_buffer = [] self.__send_buffer = [] def send(self, packet): try: if not packet.haslayer(self.ll_protocol.frame): # TODO: is ff:ff:ff:ff:ff:ff acceptable as the target address # here? or do we need to resolve the target MAC address? frame = self.ll_protocol.frame(src=self.ll_addr, dst="ff:ff:ff:ff:ff:ff")/packet else: frame = packet except AttributeError: frame = packet self.__send_buffer.append(packet) for callback in self.__on_send_callbacks: callback(frame, self) self.link.accept(frame, previous_hop=self) def __str__(self): return "<veripy.Interface link=" + self.link.name + ">"
class Interface(object): def __init__(self, ips=None, link=None, link_addr=None): self.ips = IPAddressCollection(ips or []) self.link = link self.ll_addr = link_addr self.ll_protocol = self.link.ll_protocol self.__on_receive_callbacks = [] self.__on_send_callbacks = [] self.link.bind(self) self.reset() def accept(self, frame): try: if frame.haslayer(self.ll_protocol.frame): packet = frame.getlayer(self.ll_protocol.frame)[1] else: packet = frame except AttributeError: packet = frame self.__raw_buffer.append(frame) self.__receive_buffer.append(packet) for callback in self.__on_receive_callbacks: callback(packet, self) def clear_received(self): self.__raw_buffer = [] self.__receive_buffer = [] def global_ip(self, offset=0, type='v6'): return self.ips.global_ip(offset=offset, type=type) def has_ip(self, ip): return str(ip) in self.ips def ip(self, offset=0, scope=IPAddressCollection.GLOBAL, type='v6'): return self.ips.ip(offset=offset, scope=scope, type=type) def link_local_ip(self, offset=0, type='v6'): return self.ips.link_local_ip(offset=offset, type=type) def on_send(self, callback): self.__on_send_callbacks.append(callback) def on_receive(self, callback): self.__on_receive_callbacks.append(callback) def real(self): return RealInterface(self) def received(self, src=None, dst=None, lbda=None, seq=None, type=None, raw=False): packet_list = PacketList(raw and self.__raw_buffer[:] or self.__receive_buffer[:]) def packet_dst_in(dsts, p): dsts = isinstance(dsts, list) and dsts or [dsts] for d in dsts: d = IPAddress.identify(d) if d.version() == 4 and p.haslayer(IP) and IPAddress.identify( p.getlayer(IP).dst) == d: return True elif d.version() == 6 and p.haslayer( IPv6) and IPAddress.identify( p.getlayer(IPv6).dst) == d: return True return False def packet_src_in(srcs, p): srcs = isinstance(srcs, list) and srcs or [srcs] for s in srcs: s = IPAddress.identify(s) if s.version() == 4 and p.haslayer(IP) and IPAddress.identify( p.getlayer(IP).src) == s: return True elif s.version() == 6 and p.haslayer( IPv6) and IPAddress.identify( p.getlayer(IPv6).src) == s: return True return False if not (src == None and dst == None and lbda == None and seq == None and type == None): packet_list = packet_list.filter(lambda p: (src == None or hasattr(p, 'haslayer') and packet_src_in(src, p)) and \ (dst == None or hasattr(p, 'haslayer') and packet_dst_in(dst, p)) and \ (seq == None or hasattr(p, 'haslayer') and (p.haslayer(ICMPv6EchoRequest) and p.getlayer(ICMPv6EchoRequest).seq == seq or p.haslayer(ICMPv6EchoReply) and p.getlayer(ICMPv6EchoReply).seq == seq)) and \ (type == None or hasattr(p, 'haslayer') and p.getlayer(type)) and \ (lbda == None or lbda(p))) return packet_list def reset(self): self.__raw_buffer = [] self.__receive_buffer = [] self.__send_buffer = [] def send(self, packet): try: if not packet.haslayer(self.ll_protocol.frame): # TODO: is ff:ff:ff:ff:ff:ff acceptable as the target address # here? or do we need to resolve the target MAC address? frame = self.ll_protocol.frame( src=self.ll_addr, dst="ff:ff:ff:ff:ff:ff") / packet else: frame = packet except AttributeError: frame = packet self.__send_buffer.append(packet) for callback in self.__on_send_callbacks: callback(frame, self) self.link.accept(frame, previous_hop=self) def __str__(self): return "<veripy.Interface link=" + self.link.name + ">"