tests: Add capture file validation for IPv4 in proxyarp_open

Verify that the expected frames were seend and unexpected frames
weren't.

Signed-off-by: Jouni Malinen <jouni@qca.qualcomm.com>
This commit is contained in:
Jouni Malinen 2015-01-30 16:23:26 +02:00 committed by Jouni Malinen
parent 210a4f6a13
commit efd0a6fbf1
2 changed files with 83 additions and 4 deletions

View file

@ -18,6 +18,7 @@ import subprocess
import hostapd import hostapd
from utils import HwsimSkip from utils import HwsimSkip
import hwsim_utils import hwsim_utils
from tshark import run_tshark
from wlantest import Wlantest from wlantest import Wlantest
from wpasupplicant import WpaSupplicant from wpasupplicant import WpaSupplicant
from test_ap_eap import check_eap_capa, check_domain_match_full from test_ap_eap import check_eap_capa, check_domain_match_full
@ -2920,6 +2921,17 @@ def get_bridge_macs(ifname):
cmd.stdout.close() cmd.stdout.close()
return res return res
def tshark_get_arp(cap, filter):
res = run_tshark(cap, filter,
[ "eth.dst", "eth.src",
"arp.src.hw_mac", "arp.src.proto_ipv4",
"arp.dst.hw_mac", "arp.dst.proto_ipv4" ],
wait=False)
frames = []
for l in res.splitlines():
frames.append(l.split('\t'))
return frames
def _test_proxyarp_open(dev, apdev, params, ebtables=False): def _test_proxyarp_open(dev, apdev, params, ebtables=False):
prefix = "proxyarp_open" prefix = "proxyarp_open"
if ebtables: if ebtables:
@ -3013,6 +3025,7 @@ def _test_proxyarp_open(dev, apdev, params, ebtables=False):
addr0 = dev[0].p2p_interface_addr() addr0 = dev[0].p2p_interface_addr()
addr1 = dev[1].p2p_interface_addr() addr1 = dev[1].p2p_interface_addr()
addr2 = dev[2].p2p_interface_addr()
src_ll_opt0 = "\x01\x01" + binascii.unhexlify(addr0.replace(':','')) src_ll_opt0 = "\x01\x01" + binascii.unhexlify(addr0.replace(':',''))
src_ll_opt1 = "\x01\x01" + binascii.unhexlify(addr1.replace(':','')) src_ll_opt1 = "\x01\x01" + binascii.unhexlify(addr1.replace(':',''))
@ -3262,6 +3275,71 @@ def _test_proxyarp_open(dev, apdev, params, ebtables=False):
cmd.stdout.close() cmd.stdout.close()
logger.info("ebtables results:\n" + res) logger.info("ebtables results:\n" + res)
# Verify that expected ARP messages were seen and no unexpected
# ARP messages were seen.
arp_req = tshark_get_arp(cap_dev0, "arp.opcode == 1")
arp_reply = tshark_get_arp(cap_dev0, "arp.opcode == 2")
logger.info("dev0 seen ARP requests:\n" + str(arp_req))
logger.info("dev0 seen ARP replies:\n" + str(arp_reply))
if [ 'ff:ff:ff:ff:ff:ff', addr1,
addr1, '192.168.1.100',
'00:00:00:00:00:00', '192.168.1.123' ] in arp_req:
raise Exception("dev0 saw ARP request from dev1")
if [ 'ff:ff:ff:ff:ff:ff', addr2,
addr2, '192.168.1.103',
'00:00:00:00:00:00', '192.168.1.123' ] in arp_req:
raise Exception("dev0 saw ARP request from dev2")
# TODO: Uncomment once fixed in kernel
#if [ 'ff:ff:ff:ff:ff:ff', bssid,
# bssid, '192.168.1.101',
# '00:00:00:00:00:00', '192.168.1.123' ] in arp_req:
# raise Exception("dev0 saw ARP request from br")
if ebtables:
for req in arp_req:
if req[1] != addr0:
raise Exception("Unexpected foreign ARP request on dev0")
arp_req = tshark_get_arp(cap_dev1, "arp.opcode == 1")
arp_reply = tshark_get_arp(cap_dev1, "arp.opcode == 2")
logger.info("dev1 seen ARP requests:\n" + str(arp_req))
logger.info("dev1 seen ARP replies:\n" + str(arp_reply))
if [ 'ff:ff:ff:ff:ff:ff', addr2,
addr2, '192.168.1.103',
'00:00:00:00:00:00', '192.168.1.123' ] in arp_req:
raise Exception("dev1 saw ARP request from dev2")
if [addr1, addr0, addr0, '192.168.1.123', addr1, '192.168.1.100'] not in arp_reply:
raise Exception("dev1 did not get ARP response for 192.168.1.123")
if ebtables:
for req in arp_req:
if req[1] != addr1:
raise Exception("Unexpected foreign ARP request on dev1")
arp_req = tshark_get_arp(cap_dev2, "arp.opcode == 1")
arp_reply = tshark_get_arp(cap_dev2, "arp.opcode == 2")
logger.info("dev2 seen ARP requests:\n" + str(arp_req))
logger.info("dev2 seen ARP replies:\n" + str(arp_reply))
if [ addr2, addr0,
addr0, '192.168.1.123',
addr2, '192.168.1.103' ] not in arp_reply:
raise Exception("dev2 did not get ARP response for 192.168.1.123")
arp_req = tshark_get_arp(cap_br, "arp.opcode == 1")
arp_reply = tshark_get_arp(cap_br, "arp.opcode == 2")
logger.info("br seen ARP requests:\n" + str(arp_req))
logger.info("br seen ARP replies:\n" + str(arp_reply))
# TODO: Uncomment once fixed in kernel
#if [ bssid, addr0,
# addr0, '192.168.1.123',
# bssid, '192.168.1.101' ] not in arp_reply:
# raise Exception("br did not get ARP response for 192.168.1.123")
def test_proxyarp_open(dev, apdev, params): def test_proxyarp_open(dev, apdev, params):
"""ProxyARP with open network""" """ProxyARP with open network"""
try: try:

View file

@ -15,11 +15,12 @@ logger = logging.getLogger()
_tshark_filter_arg = '-Y' _tshark_filter_arg = '-Y'
def run_tshark(filename, filter, display=None): def run_tshark(filename, filter, display=None, wait=True):
global _tshark_filter_arg global _tshark_filter_arg
# wait a bit to make it more likely for wlantest sniffer to have captured if wait:
# and written the results into a file that we can process here # wait a bit to make it more likely for wlantest sniffer to have
# captured and written the results into a file that we can process here
time.sleep(1) time.sleep(1)
try: try: