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