xref: /openbsd-src/regress/sys/netinet/arp/arp_request.py (revision a13597fa25002793552843f1ed3bf5cb23f04645)
1*a13597faSbluhm#!/usr/local/bin/python2.7
2*a13597faSbluhm# send Address Resolution Protocol Request
3*a13597faSbluhm# expect Address Resolution Protocol response and check all fields
4*a13597faSbluhm# RFC 826  An Ethernet Address Resolution Protocol
5*a13597faSbluhm# Packet Generation
6*a13597faSbluhm
7*a13597faSbluhmimport os
8*a13597faSbluhmfrom addr import *
9*a13597faSbluhmfrom scapy.all import *
10*a13597faSbluhm
11*a13597faSbluhmarp=ARP(op='who-has', hwsrc=LOCAL_MAC, psrc=LOCAL_ADDR,
12*a13597faSbluhm    hwdst="ff:ff:ff:ff:ff:ff", pdst=REMOTE_ADDR)
13*a13597faSbluhmeth=Ether(src=LOCAL_MAC, dst="ff:ff:ff:ff:ff:ff")/arp
14*a13597faSbluhm
15*a13597faSbluhme=srp1(eth, iface=LOCAL_IF, timeout=2)
16*a13597faSbluhm
17*a13597faSbluhmif e and e.type == ETH_P_ARP:
18*a13597faSbluhm	a=e.payload
19*a13597faSbluhm	if a.hwtype != ARPHDR_ETHER:
20*a13597faSbluhm		print "HWTYPE=%#0.4x != ARPHDR_ETHER" % (a.hwtype)
21*a13597faSbluhm		exit(1)
22*a13597faSbluhm	if a.ptype != ETH_P_IP:
23*a13597faSbluhm		print "PTYPE=%#0.4x != ETH_P_IP" % (a.ptype)
24*a13597faSbluhm		exit(1)
25*a13597faSbluhm	if a.hwlen != 6:
26*a13597faSbluhm		print "HWLEN=%d != 6" % (a.hwlen)
27*a13597faSbluhm		exit(1)
28*a13597faSbluhm	if a.plen != 4:
29*a13597faSbluhm		print "PLEN=%d != 4" % (a.plen)
30*a13597faSbluhm		exit(1)
31*a13597faSbluhm	if a.op != 2:
32*a13597faSbluhm		print "OP=%s != is-at" % (a.op)
33*a13597faSbluhm		exit(1)
34*a13597faSbluhm	if a.hwsrc != REMOTE_MAC:
35*a13597faSbluhm		print "HWLOCAL=%s != REMOTE_MAC" % (a.hwsrc)
36*a13597faSbluhm		exit(1)
37*a13597faSbluhm	if a.psrc != REMOTE_ADDR:
38*a13597faSbluhm		print "PLOCAL=%s != REMOTE_ADDR" % (a.psrc)
39*a13597faSbluhm		exit(1)
40*a13597faSbluhm	if a.hwdst != LOCAL_MAC:
41*a13597faSbluhm		print "HWREMOTE=%s != LOCAL_MAC" % (a.hwdst)
42*a13597faSbluhm		exit(1)
43*a13597faSbluhm	if a.pdst != LOCAL_ADDR:
44*a13597faSbluhm		print "PREMOTE=%s != LOCAL_ADDR" % (a.pdst)
45*a13597faSbluhm		exit(1)
46*a13597faSbluhm	print "arp reply"
47*a13597faSbluhm	exit(0)
48*a13597faSbluhm
49*a13597faSbluhmprint "NO ARP REPLY"
50*a13597faSbluhmexit(2)
51