1f08c3bdfSopenharmony_ci#!/bin/sh
2f08c3bdfSopenharmony_ci# SPDX-License-Identifier: GPL-2.0-or-later
3f08c3bdfSopenharmony_ci# Copyright (c) 2018 SUSE Linux GmbH
4f08c3bdfSopenharmony_ci# Copyright (c) 2016 Oracle and/or its affiliates. All Rights Reserved.
5f08c3bdfSopenharmony_ci# Copyright (c) International Business Machines Corp., 2000
6f08c3bdfSopenharmony_ci#
7f08c3bdfSopenharmony_ci# Test basic functionality of 'arp' and 'ip neigh'.
8f08c3bdfSopenharmony_ci
9f08c3bdfSopenharmony_ciNUMLOOPS=${NUMLOOPS:-50}
10f08c3bdfSopenharmony_ciTST_TESTFUNC=do_test
11f08c3bdfSopenharmony_ciTST_SETUP=do_setup
12f08c3bdfSopenharmony_ciTST_OPTS="c:"
13f08c3bdfSopenharmony_ciTST_PARSE_ARGS="parse_args"
14f08c3bdfSopenharmony_ciTST_USAGE="usage"
15f08c3bdfSopenharmony_ciTST_NEEDS_ROOT=1
16f08c3bdfSopenharmony_ci
17f08c3bdfSopenharmony_cido_setup()
18f08c3bdfSopenharmony_ci{
19f08c3bdfSopenharmony_ci	case $CMD in
20f08c3bdfSopenharmony_ci	ip)
21f08c3bdfSopenharmony_ci		SHOW_CMD="ip neigh show"
22f08c3bdfSopenharmony_ci		DEL_CMD="ROD ip neigh del $(tst_ipaddr rhost) dev $(tst_iface)"
23f08c3bdfSopenharmony_ci		;;
24f08c3bdfSopenharmony_ci	arp)
25f08c3bdfSopenharmony_ci		if [ -n "$TST_IPV6" ]; then
26f08c3bdfSopenharmony_ci			tst_brk TCONF "'arp' doesn't support IPv6"
27f08c3bdfSopenharmony_ci		fi
28f08c3bdfSopenharmony_ci		SHOW_CMD="arp -an"
29f08c3bdfSopenharmony_ci		DEL_CMD="ROD arp -d $(tst_ipaddr rhost) -i $(tst_iface)"
30f08c3bdfSopenharmony_ci		;;
31f08c3bdfSopenharmony_ci	*)
32f08c3bdfSopenharmony_ci		tst_brk TBROK "unknown or missing command, use -c [ arp | ip ]"
33f08c3bdfSopenharmony_ci		;;
34f08c3bdfSopenharmony_ci	esac
35f08c3bdfSopenharmony_ci
36f08c3bdfSopenharmony_ci	tst_require_cmds $CMD ping$TST_IPV6
37f08c3bdfSopenharmony_ci}
38f08c3bdfSopenharmony_ci
39f08c3bdfSopenharmony_ciusage()
40f08c3bdfSopenharmony_ci{
41f08c3bdfSopenharmony_ci	echo "-c [ arp | ip ] Test command"
42f08c3bdfSopenharmony_ci}
43f08c3bdfSopenharmony_ci
44f08c3bdfSopenharmony_ciparse_args()
45f08c3bdfSopenharmony_ci{
46f08c3bdfSopenharmony_ci	case $1 in
47f08c3bdfSopenharmony_ci	c) CMD="$2" ;;
48f08c3bdfSopenharmony_ci	esac
49f08c3bdfSopenharmony_ci}
50f08c3bdfSopenharmony_ci
51f08c3bdfSopenharmony_cido_test()
52f08c3bdfSopenharmony_ci{
53f08c3bdfSopenharmony_ci	local entry_name="ARP"
54f08c3bdfSopenharmony_ci	[ "$TST_IPV6" ] && entry_name="NDISC"
55f08c3bdfSopenharmony_ci
56f08c3bdfSopenharmony_ci	tst_res TINFO "stress auto-creation $entry_name cache entry deleted with '$CMD' $NUMLOOPS times"
57f08c3bdfSopenharmony_ci
58f08c3bdfSopenharmony_ci	for i in $(seq 1 $NUMLOOPS); do
59f08c3bdfSopenharmony_ci
60f08c3bdfSopenharmony_ci		ping$TST_IPV6 -q -c1 $(tst_ipaddr rhost) -I $(tst_iface) > /dev/null || \
61f08c3bdfSopenharmony_ci			tst_brk TFAIL "cannot ping $(tst_ipaddr rhost)"
62f08c3bdfSopenharmony_ci
63f08c3bdfSopenharmony_ci		local k
64f08c3bdfSopenharmony_ci		local ret=1
65f08c3bdfSopenharmony_ci		for k in $(seq 1 30); do
66f08c3bdfSopenharmony_ci			$SHOW_CMD | grep -q $(tst_ipaddr rhost)
67f08c3bdfSopenharmony_ci			if [ $? -eq 0 ]; then
68f08c3bdfSopenharmony_ci				ret=0
69f08c3bdfSopenharmony_ci				break;
70f08c3bdfSopenharmony_ci			fi
71f08c3bdfSopenharmony_ci			tst_sleep 100ms
72f08c3bdfSopenharmony_ci		done
73f08c3bdfSopenharmony_ci
74f08c3bdfSopenharmony_ci		[ "$ret" -ne 0 ] && \
75f08c3bdfSopenharmony_ci			tst_brk TFAIL "$entry_name entry '$(tst_ipaddr rhost)' not listed"
76f08c3bdfSopenharmony_ci
77f08c3bdfSopenharmony_ci		$DEL_CMD
78f08c3bdfSopenharmony_ci
79f08c3bdfSopenharmony_ci		$SHOW_CMD | grep -q "$(tst_ipaddr rhost).*$(tst_hwaddr rhost)" && \
80f08c3bdfSopenharmony_ci			tst_brk TFAIL "'$DEL_CMD' failed, entry has " \
81f08c3bdfSopenharmony_ci				"$(tst_hwaddr rhost)' $i/$NUMLOOPS"
82f08c3bdfSopenharmony_ci	done
83f08c3bdfSopenharmony_ci
84f08c3bdfSopenharmony_ci	tst_res TPASS "verified adding/removing $entry_name cache entry"
85f08c3bdfSopenharmony_ci}
86f08c3bdfSopenharmony_ci
87f08c3bdfSopenharmony_ci. tst_net.sh
88f08c3bdfSopenharmony_citst_run
89