xref: /freebsd/sbin/dhclient/tests/pcp.sh (revision 5575d5a5)
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