% Regression tests for Scapy BPF mode

# More informations at http://www.secdev.org/projects/UTscapy/


############
############
+ Addresses manipulation functions

= Get the packet IPv4 address configured on conf.iface

get_if_raw_addr(conf.iface)


= Get the packed MAC address of conf.iface

get_if_raw_hwaddr(conf.iface)

= Get the packed MAC address of LOOPBACK_NAME

get_if_raw_hwaddr(LOOPBACK_NAME) == (ARPHDR_LOOPBACK, b'\x00'*6) 


############
############
+ BPF related functions

= Get a BPF handler
~ needs_root

from scapy.arch.bpf.supersocket import get_dev_bpf
fd, _ = get_dev_bpf()

= Attach a BPF filter
~ needs_root

from scapy.arch.bpf.supersocket import attach_filter
attach_filter(fd, conf.iface, "arp or icmp")


= Get network interfaces list

iflist = get_if_list()
len(iflist) > 0


= Get working network interfaces
~ needs_root

from scapy.arch.bpf.core import get_working_ifaces
ifworking = get_working_ifaces()
len(ifworking)
            
from scapy.arch.bpf.core import get_working_if
len(ifworking) and get_working_if() == ifworking[0][0]


= Misc functions
~ needs_root

from scapy.arch.bpf.supersocket import isBPFSocket, bpf_select
isBPFSocket(L2bpfListenSocket()) and isBPFSocket(L2bpfSocket()) and isBPFSocket(L3bpfSocket())

l = bpf_select([L2bpfSocket()])
l = bpf_select([L2bpfSocket(), sys.stdin.fileno()])


############
############
+ BPF sockets

= L2bpfListenSocket - initialization variants
~ needs_root

L2bpfListenSocket()
L2bpfListenSocket(iface=conf.iface)
L2bpfListenSocket(promisc=True)
L2bpfListenSocket(filter="icmp")
L2bpfListenSocket(iface=conf.iface, promisc=True, filter="icmp")


= L2bpfListenSocket - set_*()
~ needs_root

s = L2bpfListenSocket()
s.set_promisc(0)
s.set_nonblock(1)
s.set_promisc(0)
s.close()

s = L2bpfListenSocket()
s.set_nonblock(set_flag=False)
s.set_nonblock(set_flag=True)
s.set_nonblock(set_flag=False)
s.close()

= L2bpfListenSocket - recv as nonblocking
~ needs_root

s = L2bpfListenSocket()
s.set_nonblock(set_flag=True)

def test_nonblock_recv(s):
    for i in range(1, 100):
        a = s.recv()
        if not a:
            return True
    return False

assert test_nonblock_recv(s)

= L2bpfListenSocket - get_*()
~ needs_root

s = L2bpfListenSocket()
blen = s.get_blen()
blen > 0 and type(blen) == int
s.close()

s = L2bpfListenSocket()
stats = s.get_stats()
len(stats) == 2 and type(stats) == tuple
s.close()


= L2bpfListenSocket - other methods
~ needs_root

s = L2bpfListenSocket()
type(s.fileno()) == int
s.close()

s = L2bpfListenSocket()
guessed = s.guess_cls()
issubclass(guessed, Packet)
s.close()


= L2bpfSocket - nonblock_recv()
~ needs_root

s = L2bpfSocket()
s.nonblock_recv()
s.close()


= L*bpfSocket - send()        
~ needs_root
                              
s = L2bpfSocket()             
s.send(Ether()/IP(dst="8.8.8.8")/ICMP())
                              
s = L3bpfSocket()             
s.send(IP(dst="8.8.8.8")/ICMP())
                              
s = L3bpfSocket()             
s.assigned_interface = LOOPBACK_NAME
s.send(IP(dst="8.8.8.8")/ICMP())
