xref: /freebsd-src/tests/sys/netinet/arp.sh (revision b4bd97ec168e97360cf9511b975a20f677864661)
1f17f94cdSAlexander V. Chernikov#!/usr/bin/env atf-sh
2f17f94cdSAlexander V. Chernikov#-
3f17f94cdSAlexander V. Chernikov# SPDX-License-Identifier: BSD-2-Clause
4f17f94cdSAlexander V. Chernikov#
5f17f94cdSAlexander V. Chernikov# Copyright (c) 2021 Alexander V. Chernikov
6f17f94cdSAlexander V. Chernikov#
7f17f94cdSAlexander V. Chernikov# Redistribution and use in source and binary forms, with or without
8f17f94cdSAlexander V. Chernikov# modification, are permitted provided that the following conditions
9f17f94cdSAlexander V. Chernikov# are met:
10f17f94cdSAlexander V. Chernikov# 1. Redistributions of source code must retain the above copyright
11f17f94cdSAlexander V. Chernikov#    notice, this list of conditions and the following disclaimer.
12f17f94cdSAlexander V. Chernikov# 2. Redistributions in binary form must reproduce the above copyright
13f17f94cdSAlexander V. Chernikov#    notice, this list of conditions and the following disclaimer in the
14f17f94cdSAlexander V. Chernikov#    documentation and/or other materials provided with the distribution.
15f17f94cdSAlexander V. Chernikov#
16f17f94cdSAlexander V. Chernikov# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
17f17f94cdSAlexander V. Chernikov# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18f17f94cdSAlexander V. Chernikov# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19f17f94cdSAlexander V. Chernikov# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
20f17f94cdSAlexander V. Chernikov# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21f17f94cdSAlexander V. Chernikov# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
22f17f94cdSAlexander V. Chernikov# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23f17f94cdSAlexander V. Chernikov# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24f17f94cdSAlexander V. Chernikov# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25f17f94cdSAlexander V. Chernikov# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26f17f94cdSAlexander V. Chernikov# SUCH DAMAGE.
27f17f94cdSAlexander V. Chernikov#
28f17f94cdSAlexander V. Chernikov#
29f17f94cdSAlexander V. Chernikov
30f17f94cdSAlexander V. Chernikov. $(atf_get_srcdir)/../common/vnet.subr
31f17f94cdSAlexander V. Chernikov
32f17f94cdSAlexander V. Chernikovatf_test_case "arp_add_success" "cleanup"
33f17f94cdSAlexander V. Chernikovarp_add_success_head() {
34f17f94cdSAlexander V. Chernikov	atf_set descr 'Test static arp record addition'
35f17f94cdSAlexander V. Chernikov	atf_set require.user root
36f17f94cdSAlexander V. Chernikov}
37f17f94cdSAlexander V. Chernikov
38f17f94cdSAlexander V. Chernikovarp_add_success_body() {
39f17f94cdSAlexander V. Chernikov
40f17f94cdSAlexander V. Chernikov	vnet_init
41f17f94cdSAlexander V. Chernikov
42f17f94cdSAlexander V. Chernikov	jname="v4t-arp_add_success"
43f17f94cdSAlexander V. Chernikov
44f17f94cdSAlexander V. Chernikov	epair0=$(vnet_mkepair)
45f17f94cdSAlexander V. Chernikov
46f17f94cdSAlexander V. Chernikov	vnet_mkjail ${jname} ${epair0}a
47f17f94cdSAlexander V. Chernikov
48f17f94cdSAlexander V. Chernikov	jexec ${jname} ifconfig ${epair0}a inet 198.51.100.1/24
49f17f94cdSAlexander V. Chernikov
50f17f94cdSAlexander V. Chernikov	atf_check jexec ${jname} arp -s 198.51.100.2 90:10:00:01:02:03
51f17f94cdSAlexander V. Chernikov
52f17f94cdSAlexander V. Chernikov	atf_check -o match:"\? \(198.51.100.2\) at 90:10:00:01:02:03 on ${epair0}a permanent" jexec ${jname} arp -ni ${epair0}a 198.51.100.2
53f17f94cdSAlexander V. Chernikov}
54f17f94cdSAlexander V. Chernikov
55f17f94cdSAlexander V. Chernikovarp_add_success_cleanup() {
56f17f94cdSAlexander V. Chernikov	vnet_cleanup
57f17f94cdSAlexander V. Chernikov}
58f17f94cdSAlexander V. Chernikov
59f17f94cdSAlexander V. Chernikov
60f17f94cdSAlexander V. Chernikovatf_test_case "arp_del_success" "cleanup"
61f17f94cdSAlexander V. Chernikovarp_del_success_head() {
62f17f94cdSAlexander V. Chernikov	atf_set descr 'Test arp record deletion'
63f17f94cdSAlexander V. Chernikov	atf_set require.user root
64f17f94cdSAlexander V. Chernikov}
65f17f94cdSAlexander V. Chernikov
66f17f94cdSAlexander V. Chernikovarp_del_success_body() {
67f17f94cdSAlexander V. Chernikov
68f17f94cdSAlexander V. Chernikov	vnet_init
69f17f94cdSAlexander V. Chernikov
70f17f94cdSAlexander V. Chernikov	jname="v4t-arp_del_success"
71f17f94cdSAlexander V. Chernikov
72f17f94cdSAlexander V. Chernikov	epair0=$(vnet_mkepair)
73f17f94cdSAlexander V. Chernikov
74f17f94cdSAlexander V. Chernikov	vnet_mkjail ${jname} ${epair0}a
75f17f94cdSAlexander V. Chernikov
76f17f94cdSAlexander V. Chernikov	jexec ${jname} ifconfig ${epair0}a inet 198.51.100.1/24
77f17f94cdSAlexander V. Chernikov
78f17f94cdSAlexander V. Chernikov	jexec ${jname} ping -c1 -t1 198.51.100.2
79f17f94cdSAlexander V. Chernikov
80f17f94cdSAlexander V. Chernikov	atf_check -o match:"198.51.100.2 \(198.51.100.2\) deleted" jexec ${jname} arp -nd 198.51.100.2
8128bc1822SGleb Smirnoff	atf_check -s exit:1 -o match:"198.51.100.2 \(198.51.100.2\) -- no entry" jexec ${jname} arp -n 198.51.100.2
82f17f94cdSAlexander V. Chernikov}
83f17f94cdSAlexander V. Chernikov
84f17f94cdSAlexander V. Chernikovarp_del_success_cleanup() {
85f17f94cdSAlexander V. Chernikov	vnet_cleanup
86f17f94cdSAlexander V. Chernikov}
87f17f94cdSAlexander V. Chernikov
88e8646907SKristof Provostatf_test_case "pending_delete_if" "cleanup"
89e8646907SKristof Provostpending_delete_if_head() {
90e8646907SKristof Provost	atf_set descr 'Test having pending link layer lookups on interface delete'
91e8646907SKristof Provost	atf_set require.user root
92e8646907SKristof Provost}
93e8646907SKristof Provost
94e8646907SKristof Provostpending_delete_if_body() {
95e8646907SKristof Provost	vnet_init
96e8646907SKristof Provost
97e8646907SKristof Provost	jname="arp_pending_delete_if"
98e8646907SKristof Provost	epair=$(vnet_mkepair)
99e8646907SKristof Provost
100e8646907SKristof Provost	ifconfig ${epair}b up
101e8646907SKristof Provost
102e8646907SKristof Provost	vnet_mkjail ${jname} ${epair}a
103e8646907SKristof Provost	jexec ${jname} ifconfig ${epair}a 198.51.100.1/24
104e8646907SKristof Provost	for i in `seq 2 200`
105e8646907SKristof Provost	do
106e8646907SKristof Provost		jexec ${jname} ping 198.51.100.${i} &
107e8646907SKristof Provost	done
108e8646907SKristof Provost
109e8646907SKristof Provost	# Give the ping processes time to send their ARP requests
110e8646907SKristof Provost	sleep 1
111e8646907SKristof Provost
112e8646907SKristof Provost	jexec ${jname} arp -an
113e8646907SKristof Provost	jexec ${jname} killall ping
114e8646907SKristof Provost
115e8646907SKristof Provost	# Delete the interface. Test failure panics the machine.
116e8646907SKristof Provost	ifconfig ${epair}b destroy
117e8646907SKristof Provost}
118e8646907SKristof Provost
119e8646907SKristof Provostpending_delete_if_cleanup() {
120e8646907SKristof Provost	vnet_cleanup
121e8646907SKristof Provost}
122e8646907SKristof Provost
123f17f94cdSAlexander V. Chernikov
124aad8fb3eSDag-Erling Smørgravatf_test_case "arp_lookup_host" "cleanup"
125aad8fb3eSDag-Erling Smørgravarp_lookup_host_head() {
126aad8fb3eSDag-Erling Smørgrav	atf_set descr 'Test looking up a specific host'
127aad8fb3eSDag-Erling Smørgrav	atf_set require.user root
128aad8fb3eSDag-Erling Smørgrav}
129aad8fb3eSDag-Erling Smørgrav
130aad8fb3eSDag-Erling Smørgravarp_lookup_host_body() {
131aad8fb3eSDag-Erling Smørgrav
132aad8fb3eSDag-Erling Smørgrav	vnet_init
133aad8fb3eSDag-Erling Smørgrav
134aad8fb3eSDag-Erling Smørgrav	jname="v4t-arp_lookup_host"
135aad8fb3eSDag-Erling Smørgrav
136aad8fb3eSDag-Erling Smørgrav	epair0=$(vnet_mkepair)
137aad8fb3eSDag-Erling Smørgrav
138aad8fb3eSDag-Erling Smørgrav	vnet_mkjail ${jname}a ${epair0}a
139aad8fb3eSDag-Erling Smørgrav	vnet_mkjail ${jname}b ${epair0}b
140aad8fb3eSDag-Erling Smørgrav
141aad8fb3eSDag-Erling Smørgrav	ipa=198.51.100.1
142aad8fb3eSDag-Erling Smørgrav	ipb=198.51.100.2
143aad8fb3eSDag-Erling Smørgrav
144aad8fb3eSDag-Erling Smørgrav	atf_check -o ignore \
145aad8fb3eSDag-Erling Smørgrav		  ifconfig -j ${jname}a ${epair0}a inet ${ipa}/24
146aad8fb3eSDag-Erling Smørgrav	atf_check -o ignore \
147aad8fb3eSDag-Erling Smørgrav		  ifconfig -j ${jname}b ${epair0}b inet ${ipb}/24
148aad8fb3eSDag-Erling Smørgrav
149aad8fb3eSDag-Erling Smørgrav	# get jail b's MAC address
150aad8fb3eSDag-Erling Smørgrav	eth="$(ifconfig -j ${jname}b ${epair0}b |
151aad8fb3eSDag-Erling Smørgrav		sed -nE "s/^\tether ([0-9a-f:]*)$/\1/p")"
152aad8fb3eSDag-Erling Smørgrav
153aad8fb3eSDag-Erling Smørgrav	# no entry yet
154aad8fb3eSDag-Erling Smørgrav	atf_check -s exit:1 -o match:"\(${ipb}\) -- no entry" \
155aad8fb3eSDag-Erling Smørgrav		  jexec ${jname}a arp -n ${ipb}
156aad8fb3eSDag-Erling Smørgrav
157aad8fb3eSDag-Erling Smørgrav	# now ping jail b from jail a
158aad8fb3eSDag-Erling Smørgrav	atf_check -o ignore \
159aad8fb3eSDag-Erling Smørgrav		  jexec ${jname}a ping -c1 ${ipb}
160aad8fb3eSDag-Erling Smørgrav
161aad8fb3eSDag-Erling Smørgrav	# should be populated
162aad8fb3eSDag-Erling Smørgrav	atf_check -o match:"\(${ipb}\) at $eth on ${epair0}a" \
163aad8fb3eSDag-Erling Smørgrav		  jexec ${jname}a arp -n ${ipb}
164aad8fb3eSDag-Erling Smørgrav
165aad8fb3eSDag-Erling Smørgrav}
166aad8fb3eSDag-Erling Smørgrav
167aad8fb3eSDag-Erling Smørgravarp_lookup_host_cleanup() {
168aad8fb3eSDag-Erling Smørgrav	vnet_cleanup
169aad8fb3eSDag-Erling Smørgrav}
170aad8fb3eSDag-Erling Smørgrav
171aad8fb3eSDag-Erling Smørgrav
1721968d716SGleb Smirnoffatf_test_case "static" "cleanup"
1731968d716SGleb Smirnoffstatic_head() {
1741968d716SGleb Smirnoff	atf_set descr 'Test arp -s/-S works'
1751968d716SGleb Smirnoff	atf_set require.user root
1761968d716SGleb Smirnoff}
1771968d716SGleb Smirnoff
1781968d716SGleb Smirnoffstatic_body() {
1791968d716SGleb Smirnoff
1801968d716SGleb Smirnoff	vnet_init
1811968d716SGleb Smirnoff
1821968d716SGleb Smirnoff	jname="v4t-arp_static_host"
1831968d716SGleb Smirnoff
1841968d716SGleb Smirnoff	epair0=$(vnet_mkepair)
1851968d716SGleb Smirnoff
1861968d716SGleb Smirnoff	vnet_mkjail ${jname}a ${epair0}a
1871968d716SGleb Smirnoff	vnet_mkjail ${jname}b ${epair0}b
1881968d716SGleb Smirnoff
1891968d716SGleb Smirnoff	ipa=198.51.100.1
1901968d716SGleb Smirnoff	ipb=198.51.100.2
1911968d716SGleb Smirnoff	max_age=$(sysctl -n net.link.ether.inet.max_age)
1921968d716SGleb Smirnoff
1931968d716SGleb Smirnoff	atf_check ifconfig -j ${jname}a ${epair0}a inet ${ipa}/24
1941968d716SGleb Smirnoff	eth="$(ifconfig -j ${jname}b ${epair0}b |
1951968d716SGleb Smirnoff		sed -nE "s/^\tether ([0-9a-f:]*)$/\1/p")"
1961968d716SGleb Smirnoff
1971968d716SGleb Smirnoff	# Expected outputs
1981968d716SGleb Smirnoff	permanent=\
1991968d716SGleb Smirnoff"? (${ipb}) at 00:00:00:00:00:00 on ${epair0}a permanent [ethernet]\n"
2001968d716SGleb Smirnoff	temporary=\
2011968d716SGleb Smirnoff"? (${ipb}) at ${eth} on ${epair0}a expires in ${max_age} seconds [ethernet]\n"
2021968d716SGleb Smirnoff	deleted=\
2031968d716SGleb Smirnoff"${ipb} (${ipb}) deleted\n"
2041968d716SGleb Smirnoff
2051968d716SGleb Smirnoff	# first check -s
2061968d716SGleb Smirnoff	atf_check jexec ${jname}a arp -s ${ipb} 0:0:0:0:0:0
2071968d716SGleb Smirnoff	# the jail B ifconfig will send gratuitous ARP that will trigger A
2081968d716SGleb Smirnoff	atf_check ifconfig -j ${jname}b ${epair0}b inet ${ipb}/24
2091968d716SGleb Smirnoff	atf_check -o "inline:${permanent}" jexec ${jname}a arp -n ${ipb}
2101968d716SGleb Smirnoff	if [ $(sysctl -n net.link.ether.inet.log_arp_permanent_modify) -ne 0 ];
2111968d716SGleb Smirnoff	then
2121968d716SGleb Smirnoff		msg=$(dmesg | tail -n 1)
2131968d716SGleb Smirnoff		atf_check_equal "${msg}" \
2141968d716SGleb Smirnoff"arp: ${eth} attempts to modify permanent entry for ${ipb} on ${epair0}a"
2151968d716SGleb Smirnoff	fi
2161968d716SGleb Smirnoff
2171968d716SGleb Smirnoff	# then check -S
2181968d716SGleb Smirnoff	atf_check -o "inline:${deleted}" jexec ${jname}a arp -nd ${ipb}
2191968d716SGleb Smirnoff	atf_check -o ignore jexec ${jname}b ping -c1 ${ipa}
2201968d716SGleb Smirnoff	atf_check -o "inline:${temporary}" jexec ${jname}a arp -n ${ipb}
2211968d716SGleb Smirnoff	# Note: this doesn't fail, tracked all the way down to FreeBSD 8
2221968d716SGleb Smirnoff	# atf_check -s not-exit:0 jexec ${jname}a arp -s ${ipb} 0:0:0:0:0:0
2231968d716SGleb Smirnoff	atf_check -o "inline:${deleted}" \
2241968d716SGleb Smirnoff	    jexec ${jname}a arp -S ${ipb} 0:0:0:0:0:0
2251968d716SGleb Smirnoff	atf_check -o "inline:${permanent}" jexec ${jname}a arp -n ${ipb}
2261968d716SGleb Smirnoff}
2271968d716SGleb Smirnoff
2281968d716SGleb Smirnoffstatic_cleanup() {
2291968d716SGleb Smirnoff	vnet_cleanup
2301968d716SGleb Smirnoff}
2311968d716SGleb Smirnoff
232*b4bd97ecSKristof Provostatf_test_case "garp" "cleanup"
233*b4bd97ecSKristof Provostgarp_head() {
234*b4bd97ecSKristof Provost	atf_set descr 'Basic gratuitous arp test'
235*b4bd97ecSKristof Provost	atf_set require.user root
236*b4bd97ecSKristof Provost}
237*b4bd97ecSKristof Provost
238*b4bd97ecSKristof Provostgarp_body() {
239*b4bd97ecSKristof Provost	vnet_init
240*b4bd97ecSKristof Provost
241*b4bd97ecSKristof Provost	j="v4t-garp"
242*b4bd97ecSKristof Provost
243*b4bd97ecSKristof Provost	epair=$(vnet_mkepair)
244*b4bd97ecSKristof Provost
245*b4bd97ecSKristof Provost	vnet_mkjail ${j} ${epair}a
246*b4bd97ecSKristof Provost	atf_check -s exit:0 -o ignore \
247*b4bd97ecSKristof Provost	    jexec ${j} sysctl net.link.ether.inet.garp_rexmit_count=3
248*b4bd97ecSKristof Provost	jexec ${j} ifconfig ${epair}a inet 192.0.2.1/24 up
249*b4bd97ecSKristof Provost
250*b4bd97ecSKristof Provost	# Allow some time for the timer to actually fire
251*b4bd97ecSKristof Provost	sleep 5
252*b4bd97ecSKristof Provost}
253*b4bd97ecSKristof Provost
254*b4bd97ecSKristof Provostgarp_cleanup() {
255*b4bd97ecSKristof Provost	vnet_cleanup
256*b4bd97ecSKristof Provost}
257*b4bd97ecSKristof Provost
2581968d716SGleb Smirnoff
259f17f94cdSAlexander V. Chernikovatf_init_test_cases()
260f17f94cdSAlexander V. Chernikov{
261f17f94cdSAlexander V. Chernikov
262f17f94cdSAlexander V. Chernikov	atf_add_test_case "arp_add_success"
263f17f94cdSAlexander V. Chernikov	atf_add_test_case "arp_del_success"
264e8646907SKristof Provost	atf_add_test_case "pending_delete_if"
265aad8fb3eSDag-Erling Smørgrav	atf_add_test_case "arp_lookup_host"
2661968d716SGleb Smirnoff	atf_add_test_case "static"
267*b4bd97ecSKristof Provost	atf_add_test_case "garp"
268f17f94cdSAlexander V. Chernikov}
269f17f94cdSAlexander V. Chernikov
270f17f94cdSAlexander V. Chernikov# end
271f17f94cdSAlexander V. Chernikov
272