135dc7f8fSJohn-Mark Gurney#!/usr/bin/env atf-sh 235dc7f8fSJohn-Mark Gurney# 335dc7f8fSJohn-Mark Gurney# SPDX-License-Identifier: BSD-2-Clause 435dc7f8fSJohn-Mark Gurney# 535dc7f8fSJohn-Mark Gurney# Copyright 2022 John-Mark Gurney 635dc7f8fSJohn-Mark Gurney# All rights reserved. 735dc7f8fSJohn-Mark Gurney# 835dc7f8fSJohn-Mark Gurney# Redistribution and use in source and binary forms, with or without 935dc7f8fSJohn-Mark Gurney# modification, are permitted provided that the following conditions are 1035dc7f8fSJohn-Mark Gurney# met: 1135dc7f8fSJohn-Mark Gurney# 1235dc7f8fSJohn-Mark Gurney# * Redistributions of source code must retain the above copyright 1335dc7f8fSJohn-Mark Gurney# notice, this list of conditions and the following disclaimer. 1435dc7f8fSJohn-Mark Gurney# * Redistributions in binary form must reproduce the above copyright 1535dc7f8fSJohn-Mark Gurney# notice, this list of conditions and the following disclaimer in the 1635dc7f8fSJohn-Mark Gurney# documentation and/or other materials provided with the distribution. 1735dc7f8fSJohn-Mark Gurney# 1835dc7f8fSJohn-Mark Gurney# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 1935dc7f8fSJohn-Mark Gurney# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 2035dc7f8fSJohn-Mark Gurney# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 2135dc7f8fSJohn-Mark Gurney# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 2235dc7f8fSJohn-Mark Gurney# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 2335dc7f8fSJohn-Mark Gurney# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 2435dc7f8fSJohn-Mark Gurney# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 2535dc7f8fSJohn-Mark Gurney# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 2635dc7f8fSJohn-Mark Gurney# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 2735dc7f8fSJohn-Mark Gurney# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 2835dc7f8fSJohn-Mark Gurney# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2935dc7f8fSJohn-Mark Gurney 3035dc7f8fSJohn-Mark Gurney# 3135dc7f8fSJohn-Mark Gurney# Run the tests: 3235dc7f8fSJohn-Mark Gurney# make WITH_TESTS=yes -j 4 all install && kyua test -k /usr/tests/Kyuafile sbin/dhclient/pcp 3335dc7f8fSJohn-Mark Gurney# 3435dc7f8fSJohn-Mark Gurney# Output last run: 3535dc7f8fSJohn-Mark Gurney# kyua report --verbose -r $(ls -tr ~/.kyua/store/results.*.db | tail -n 1) 3635dc7f8fSJohn-Mark Gurney 3735dc7f8fSJohn-Mark Gurney. $(atf_get_srcdir)/../../sys/common/vnet.subr 3835dc7f8fSJohn-Mark Gurney 3935dc7f8fSJohn-Mark Gurneygeneric_dhcp_cleanup() 4035dc7f8fSJohn-Mark Gurney{ 4135dc7f8fSJohn-Mark Gurney 4235dc7f8fSJohn-Mark Gurney # clean up programs 4335dc7f8fSJohn-Mark Gurney kill $(cat dhclient.test.pid) $(cat dhcpd.pid) 4435dc7f8fSJohn-Mark Gurney 4535dc7f8fSJohn-Mark Gurney # clean up files 4635dc7f8fSJohn-Mark Gurney rm -f dhclient.dhcpd.conf lease.dhclient.test dhclient.test.pid 4735dc7f8fSJohn-Mark Gurney 4835dc7f8fSJohn-Mark Gurney vnet_cleanup 4935dc7f8fSJohn-Mark Gurney} 5035dc7f8fSJohn-Mark Gurney 5135dc7f8fSJohn-Mark Gurneyatf_test_case normal cleanup 5235dc7f8fSJohn-Mark Gurneynormal_head() 5335dc7f8fSJohn-Mark Gurney{ 5435dc7f8fSJohn-Mark Gurney atf_set descr 'test dhclient against a server' 5535dc7f8fSJohn-Mark Gurney atf_set require.user root 5635dc7f8fSJohn-Mark Gurney} 5735dc7f8fSJohn-Mark Gurney 5835dc7f8fSJohn-Mark Gurneynormal_body() 5935dc7f8fSJohn-Mark Gurney{ 6035dc7f8fSJohn-Mark Gurney dhcpd=$(which dhcpd) 6135dc7f8fSJohn-Mark Gurney 6235dc7f8fSJohn-Mark Gurney if ! [ -x "$dhcpd" ]; then 6335dc7f8fSJohn-Mark Gurney atf_skip "ISC dhcp server (isc-dhcp44-server) not installed" 6435dc7f8fSJohn-Mark Gurney fi 6535dc7f8fSJohn-Mark Gurney 6635dc7f8fSJohn-Mark Gurney vnet_init 6735dc7f8fSJohn-Mark Gurney 6835dc7f8fSJohn-Mark Gurney epair=$(vnet_mkepair) 6935dc7f8fSJohn-Mark Gurney 7035dc7f8fSJohn-Mark Gurney vnet_mkjail dhclient_normal_test ${epair}b 7135dc7f8fSJohn-Mark Gurney 7235dc7f8fSJohn-Mark Gurney # Set IP on server iface 7335dc7f8fSJohn-Mark Gurney ifconfig ${epair}a 192.0.2.2/24 up 7435dc7f8fSJohn-Mark Gurney 7535dc7f8fSJohn-Mark Gurney # Create dhcp server config 7635dc7f8fSJohn-Mark Gurney cat > dhclient.dhcpd.conf << EOF 7735dc7f8fSJohn-Mark Gurneydefault-lease-time 36000; 7835dc7f8fSJohn-Mark Gurneymax-lease-time 86400; 7935dc7f8fSJohn-Mark Gurneyauthoritative; 8035dc7f8fSJohn-Mark Gurneysubnet 192.0.2.0 netmask 255.255.255.0 { 8135dc7f8fSJohn-Mark Gurney range 192.0.2.10 192.0.2.10; 8235dc7f8fSJohn-Mark Gurney option routers 192.0.2.2; 8335dc7f8fSJohn-Mark Gurney option domain-name-servers 192.0.2.2; 8435dc7f8fSJohn-Mark Gurney} 8535dc7f8fSJohn-Mark GurneyEOF 8635dc7f8fSJohn-Mark Gurney 8735dc7f8fSJohn-Mark Gurney # Start dhcp server 8835dc7f8fSJohn-Mark Gurney touch dhcpd.leases.conf 8935dc7f8fSJohn-Mark Gurney atf_check -e ignore ${dhcpd} -cf ./dhclient.dhcpd.conf -lf ./dhcpd.leases.conf -pf ./dhcpd.pid ${epair}a 9035dc7f8fSJohn-Mark Gurney 9135dc7f8fSJohn-Mark Gurney # Expect that we get an IP assigned 9235dc7f8fSJohn-Mark Gurney atf_check -e match:'DHCPACK from 192.0.2.2' jexec dhclient_normal_test dhclient -c /dev/null -l ./lease.dhclient.test -p ./dhclient.test.pid ${epair}b 9335dc7f8fSJohn-Mark Gurney 9435dc7f8fSJohn-Mark Gurney # And it's the correct one 9535dc7f8fSJohn-Mark Gurney atf_check -o match:'inet 192.0.2.10' jexec dhclient_normal_test ifconfig ${epair}b 9635dc7f8fSJohn-Mark Gurney 9735dc7f8fSJohn-Mark Gurney} 9835dc7f8fSJohn-Mark Gurney 9935dc7f8fSJohn-Mark Gurneynormal_cleanup() 10035dc7f8fSJohn-Mark Gurney{ 10135dc7f8fSJohn-Mark Gurney 10235dc7f8fSJohn-Mark Gurney generic_dhcp_cleanup 10335dc7f8fSJohn-Mark Gurney} 10435dc7f8fSJohn-Mark Gurney 10535dc7f8fSJohn-Mark Gurneyatf_test_case pcp cleanup 10635dc7f8fSJohn-Mark Gurneypcp_head() 10735dc7f8fSJohn-Mark Gurney{ 10835dc7f8fSJohn-Mark Gurney atf_set descr 'test dhclient on pcp interface' 10935dc7f8fSJohn-Mark Gurney atf_set require.user root 11035dc7f8fSJohn-Mark Gurney} 11135dc7f8fSJohn-Mark Gurney 11235dc7f8fSJohn-Mark Gurneypcp_body() 11335dc7f8fSJohn-Mark Gurney{ 11435dc7f8fSJohn-Mark Gurney dhcpd=$(which dhcpd) 11535dc7f8fSJohn-Mark Gurney 11635dc7f8fSJohn-Mark Gurney if ! [ -x "$dhcpd" ]; then 11735dc7f8fSJohn-Mark Gurney atf_skip "ISC dhcp server (isc-dhcp44-server) not installed" 11835dc7f8fSJohn-Mark Gurney fi 11935dc7f8fSJohn-Mark Gurney 12035dc7f8fSJohn-Mark Gurney vnet_init 12135dc7f8fSJohn-Mark Gurney 12235dc7f8fSJohn-Mark Gurney epair=$(vnet_mkepair) 12335dc7f8fSJohn-Mark Gurney 12435dc7f8fSJohn-Mark Gurney # Server side needs to be up to pass packets 12535dc7f8fSJohn-Mark Gurney ifconfig ${epair}a up 12635dc7f8fSJohn-Mark Gurney 12735dc7f8fSJohn-Mark Gurney # Make sure necessary netgraph modules are loaded 12835dc7f8fSJohn-Mark Gurney kldstat -q -n ng_ether || kldload ng_ether 12935dc7f8fSJohn-Mark Gurney kldstat -q -n ng_iface || kldload ng_iface 13035dc7f8fSJohn-Mark Gurney kldstat -q -n ng_vlan || kldload ng_vlan 13135dc7f8fSJohn-Mark Gurney 13235dc7f8fSJohn-Mark Gurney # create vlan, and attach epair to it (has incoming/outgoing vlan 13335dc7f8fSJohn-Mark Gurney # 0 tagged frames) 13435dc7f8fSJohn-Mark Gurney ngctl mkpeer ${epair}a: vlan lower downstream 13535dc7f8fSJohn-Mark Gurney 13635dc7f8fSJohn-Mark Gurney # create new interface on other side of vlan (untagged/pcp) 13735dc7f8fSJohn-Mark Gurney ngctl mkpeer ${epair}a:lower. eiface vlan0 ether 13835dc7f8fSJohn-Mark Gurney 13935dc7f8fSJohn-Mark Gurney # get the interface created 14035dc7f8fSJohn-Mark Gurney ngiface=$(ngctl show ${epair}a:lower.vlan0 | head -n 1 | awk '{ print $2}') 14135dc7f8fSJohn-Mark Gurney 14235dc7f8fSJohn-Mark Gurney # schedule it for clean up 14335dc7f8fSJohn-Mark Gurney echo ${ngiface} >> ngctl.shutdown 14435dc7f8fSJohn-Mark Gurney 14535dc7f8fSJohn-Mark Gurney # set the filter on it 14635dc7f8fSJohn-Mark Gurney ngctl msg ${epair}a:lower. 'addfilter { vlan=0 hook="vlan0" }' 14735dc7f8fSJohn-Mark Gurney 14835dc7f8fSJohn-Mark Gurney vnet_mkjail dhclient_pcp_test ${epair}b 14935dc7f8fSJohn-Mark Gurney 15035dc7f8fSJohn-Mark Gurney # Set IP on server iface 15135dc7f8fSJohn-Mark Gurney ifconfig ${ngiface} up 192.0.2.2/24 15235dc7f8fSJohn-Mark Gurney 15335dc7f8fSJohn-Mark Gurney # Set pcp in jail 15435dc7f8fSJohn-Mark Gurney jexec dhclient_pcp_test ifconfig ${epair}b pcp 0 up 15535dc7f8fSJohn-Mark Gurney 15635dc7f8fSJohn-Mark Gurney # Create dhcp server config 15735dc7f8fSJohn-Mark Gurney cat > dhclient.dhcpd.conf << EOF 15835dc7f8fSJohn-Mark Gurneydefault-lease-time 36000; 15935dc7f8fSJohn-Mark Gurneymax-lease-time 86400; 16035dc7f8fSJohn-Mark Gurneyauthoritative; 16135dc7f8fSJohn-Mark Gurneysubnet 192.0.2.0 netmask 255.255.255.0 { 16235dc7f8fSJohn-Mark Gurney range 192.0.2.10 192.0.2.10; 16335dc7f8fSJohn-Mark Gurney option routers 192.0.2.2; 16435dc7f8fSJohn-Mark Gurney option domain-name-servers 192.0.2.2; 16535dc7f8fSJohn-Mark Gurney} 16635dc7f8fSJohn-Mark GurneyEOF 16735dc7f8fSJohn-Mark Gurney 16835dc7f8fSJohn-Mark Gurney # Start dhcp server 16935dc7f8fSJohn-Mark Gurney touch dhcpd.leases.conf 17035dc7f8fSJohn-Mark Gurney atf_check -e ignore ${dhcpd} -cf ./dhclient.dhcpd.conf -lf ./dhcpd.leases.conf -pf ./dhcpd.pid ${ngiface} 17135dc7f8fSJohn-Mark Gurney 17235dc7f8fSJohn-Mark Gurney # Expect that we get an IP assigned 17335dc7f8fSJohn-Mark Gurney atf_check -e match:'DHCPACK from 192.0.2.2' jexec dhclient_pcp_test dhclient -c /dev/null -l ./lease.dhclient.test -p ./dhclient.test.pid ${epair}b 17435dc7f8fSJohn-Mark Gurney 17535dc7f8fSJohn-Mark Gurney # And it's the correct one 17635dc7f8fSJohn-Mark Gurney atf_check -o match:'inet 192.0.2.10' jexec dhclient_pcp_test ifconfig ${epair}b 17735dc7f8fSJohn-Mark Gurney} 17835dc7f8fSJohn-Mark Gurney 17935dc7f8fSJohn-Mark Gurneypcp_cleanup() 18035dc7f8fSJohn-Mark Gurney{ 18135dc7f8fSJohn-Mark Gurney 18235dc7f8fSJohn-Mark Gurney generic_dhcp_cleanup 18335dc7f8fSJohn-Mark Gurney 18435dc7f8fSJohn-Mark Gurney # Clean up netgraph nodes 18535dc7f8fSJohn-Mark Gurney for i in $(cat ngctl.shutdown); do 18635dc7f8fSJohn-Mark Gurney ngctl shutdown ${i}: 18735dc7f8fSJohn-Mark Gurney done 1885575d5a5SKristof Provost rm -f ngctl.shutdown 18935dc7f8fSJohn-Mark Gurney} 19035dc7f8fSJohn-Mark Gurney 19135dc7f8fSJohn-Mark Gurneyatf_init_test_cases() 19235dc7f8fSJohn-Mark Gurney{ 19335dc7f8fSJohn-Mark Gurney atf_add_test_case normal 19435dc7f8fSJohn-Mark Gurney atf_add_test_case pcp 19535dc7f8fSJohn-Mark Gurney} 19635dc7f8fSJohn-Mark Gurney 197