| #!/bin/sh |
| # Copyright (c) 2018 SUSE Linux GmbH |
| # Copyright (c) 2016 Oracle and/or its affiliates. All Rights Reserved. |
| # Copyright (c) International Business Machines Corp., 2000 |
| # This program is free software; you can redistribute it and/or |
| # modify it under the terms of the GNU General Public License as |
| # published by the Free Software Foundation; either version 2 of |
| # the License, or (at your option) any later version. |
| # |
| # This program is distributed in the hope that it would be useful, |
| # but WITHOUT ANY WARRANTY; without even the implied warranty of |
| # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| # GNU General Public License for more details. |
| # |
| # You should have received a copy of the GNU General Public License |
| # along with this program. If not, see <http://www.gnu.org/licenses/>. |
| # |
| # Test basic functionality of 'arp' and 'ip neigh'. |
| |
| NUMLOOPS=${NUMLOOPS:-50} |
| TST_TESTFUNC=do_test |
| TST_SETUP=do_setup |
| TST_OPTS="c:" |
| TST_PARSE_ARGS="parse_args" |
| TST_USAGE="usage" |
| TST_NEEDS_ROOT=1 |
| . tst_net.sh |
| |
| do_setup() |
| { |
| case $CMD in |
| ip) |
| SHOW_CMD="ip neigh show" |
| DEL_CMD="ip neigh del $(tst_ipaddr rhost) dev $(tst_iface)" |
| ;; |
| arp) |
| if [ -n "$TST_IPV6" ]; then |
| tst_brk TCONF "'arp' doesn't support IPv6" |
| fi |
| SHOW_CMD="arp -a" |
| DEL_CMD="arp -d $(tst_ipaddr rhost)" |
| ;; |
| *) |
| tst_brk TBROK "unknown or missing command, use -c [ arp | ip ]" |
| ;; |
| esac |
| |
| tst_test_cmds $CMD ping$TST_IPV6 |
| } |
| |
| usage() |
| { |
| echo "-c [ arp | ip ] Test command" |
| } |
| |
| parse_args() |
| { |
| case $1 in |
| c) CMD="$2" ;; |
| esac |
| } |
| |
| do_test() |
| { |
| local entry_name="ARP" |
| [ "$TST_IPV6" ] && entry_name="NDISC" |
| |
| tst_res TINFO "stress auto-creation $entry_name cache entry deleted with '$CMD' $NUMLOOPS times" |
| |
| for i in $(seq 1 $NUMLOOPS); do |
| |
| ping$TST_IPV6 -q -c1 $(tst_ipaddr rhost) > /dev/null || \ |
| tst_brk TFAIL "cannot ping $(tst_ipaddr rhost)" |
| |
| local k |
| local ret=1 |
| for k in $(seq 1 30); do |
| $SHOW_CMD | grep -q $(tst_ipaddr rhost) |
| if [ $? -eq 0 ]; then |
| ret=0 |
| break; |
| fi |
| tst_sleep 100ms |
| done |
| |
| [ "$ret" -ne 0 ] && \ |
| tst_brk TFAIL "$entry_name entry '$(tst_ipaddr rhost)' not listed" |
| |
| $DEL_CMD || tst_brk TFAIL "fail to delete entry" |
| |
| $SHOW_CMD | grep -q "$(tst_ipaddr rhost).*$(tst_hwaddr rhost)" && \ |
| tst_brk TFAIL "'$DEL_CMD' failed, entry has " \ |
| "$(tst_hwaddr rhost)' $i/$NUMLOOPS" |
| done |
| |
| tst_res TPASS "verified adding/removing $entry_name cache entry" |
| } |
| |
| tst_run |