xref: /aosp_15_r20/external/ltp/testcases/network/dhcp/dhcp_lib.sh (revision 49cdfc7efb34551c7342be41a7384b9c40d7cab7)
1#!/bin/sh
2# SPDX-License-Identifier: GPL-2.0-or-later
3# Copyright (c) 2014-2018 Oracle and/or its affiliates. All Rights Reserved.
4# Copyright (c) 2018-2022 Petr Vorel <[email protected]>
5# Author:       Alexey Kodanev [email protected]
6
7TST_SETUP="${TST_SETUP:-dhcp_lib_setup}"
8TST_CLEANUP="${TST_CLEANUP:-dhcp_lib_cleanup}"
9TST_TESTFUNC="test01"
10TST_NEEDS_TMPDIR=1
11TST_NEEDS_ROOT=1
12TST_NEEDS_CMDS="cat $dhcp_name awk ip pgrep pkill dhclient"
13
14iface0="ltp_veth0"
15iface1="ltp_veth1"
16
17stop_dhcp()
18{
19	[ "$(pgrep -x $dhcp_name)" ] || return 0
20
21	tst_res TINFO "stopping $dhcp_name"
22	local count=0
23	while [ $count -le 10 ]; do
24		pkill -x $dhcp_name
25		[ "$(pgrep -x $dhcp_name)" ] || return 0
26		tst_sleep 100ms
27		count=$((count + 1))
28	done
29
30	pkill -9 -x $dhcp_name
31	tst_sleep 100ms
32	[ "$(pgrep -x $dhcp_name)" ] && return 1 || return 0
33}
34
35dhcp_lib_setup()
36{
37	if [ $HAVE_SYSTEMCTL -eq 1 ] && \
38		systemctl --no-pager -p Id show network.service | grep -q Id=wicked.service; then
39		[ $TST_IPV6 ] && tst_brk TCONF "wicked not supported on IPv6"
40		is_wicked=1
41	fi
42
43	[ -z "$log" ] && log="$PWD/$(basename $0 '.sh').log"
44
45	if [ $TST_IPV6 ]; then
46		ip_addr="fd00:1:1:2::12/64"
47		ip_addr_check_noprefix="fd00:1:1:2::100"
48		ip_addr_check="$ip_addr_check_noprefix/128"
49	else
50		ip_addr="10.1.1.12/24"
51		ip_addr_check_noprefix="10.1.1.100"
52		ip_addr_check="$ip_addr_check_noprefix/24"
53	fi
54
55	lsmod | grep -q '^veth ' && veth_loaded=yes || veth_loaded=no
56
57	tst_res TINFO "create veth interfaces"
58	ip link add $iface0 type veth peer name $iface1 || \
59		tst_brk TBROK "failed to add veth $iface0"
60
61	veth_added=1
62	ip link set up $iface0 || tst_brk TBROK "failed to bring $iface0 up"
63	ip link set up $iface1 || tst_brk TBROK "failed to bring $iface1 up"
64
65	stop_dhcp || tst_brk TBROK "Failed to stop dhcp server"
66
67	dhclient_lease="/var/lib/dhclient/dhclient${TST_IPV6}.leases"
68	[ -f $dhclient_lease ] || dhclient_lease="/var/lib/dhcp/dhclient${TST_IPV6}.leases"
69	if [ -f $dhclient_lease ]; then
70		tst_res TINFO "backup dhclient${TST_IPV6}.leases"
71		mv $dhclient_lease .
72	fi
73
74	tst_res TINFO "add $ip_addr to $iface0"
75	ip addr add $ip_addr dev $iface0 || \
76		tst_brk TBROK "failed to add ip address"
77
78	if [ ! -d "$lease_dir" ]; then
79		mkdir -p $lease_dir
80		lease_dir_added=1
81	fi
82}
83
84dhcp_lib_cleanup()
85{
86	[ -z "$veth_loaded" ] && return
87
88	[ "$lease_dir_added" = 1 ] && rm -rf $lease_dir
89	rm -f $lease_file
90
91	stop_dhcp
92
93	pkill -f "dhclient -$TST_IPVER $iface1"
94
95	cleanup_dhcp
96
97	# restore dhclient leases
98	[ $dhclient_lease ] && rm -f $dhclient_lease
99	[ -f "dhclient${TST_IPV6}.leases" ] && \
100		mv dhclient${TST_IPV6}.leases $dhclient_lease
101
102	[ $veth_added ] && ip link del $iface0
103
104	[ "$veth_loaded" = "no" ] && lsmod | grep -q '^veth ' && rmmod veth
105}
106
107print_dhcp_log()
108{
109	[ -f "$log" ] && cat $log
110}
111
112test01()
113{
114	local wicked_cfg="/etc/sysconfig/network/ifcfg-$iface1"
115	local wicked_cleanup
116
117	tst_res TINFO "testing DHCP server $dhcp_name: $(print_dhcp_version)"
118	tst_res TINFO "using DHCP client: $(dhclient --version 2>&1)"
119
120	tst_res TINFO "starting DHCPv$TST_IPVER server on $iface0"
121
122	start_dhcp$TST_IPV6
123	if [ $? -ne 0 ]; then
124		print_dhcp_log
125		tst_brk TBROK "Failed to start $dhcp_name"
126	fi
127
128	sleep 1
129
130	if [ "$(pgrep '$dhcp_name')" ]; then
131		print_dhcp_log
132		tst_brk TBROK "Failed to start $dhcp_name"
133	fi
134
135	if [ "$is_wicked" ]; then
136		tst_res TINFO "wicked is running, don't start dhclient"
137		if [ ! -f "$wicked_cfg" ]; then
138			cat <<EOF > $wicked_cfg
139BOOTPROTO='dhcp'
140NAME='LTP card'
141STARTMODE='auto'
142USERCONTROL='no'
143EOF
144			wicked_cleanup=1
145		else
146			tst_res TINFO "wicked config file $wicked_cfg already exist"
147		fi
148
149		tst_res TINFO "restarting wicked"
150		systemctl restart wicked
151	else
152		tst_res TINFO "starting dhclient -$TST_IPVER $iface1"
153		dhclient -$TST_IPVER $iface1 || tst_brk TBROK "dhclient failed"
154	fi
155
156	# check that we get configured ip address
157	ip addr show $iface1 | grep -q $ip_addr_check
158	if [ $? -eq 0 ]; then
159		tst_res TPASS "'$ip_addr_check' configured by DHCPv$TST_IPVER"
160	else
161		if ip addr show $iface1 | grep -q $ip_addr_check_noprefix; then
162			tst_res TFAIL "'$ip_addr_check_noprefix' configured but has wrong prefix, expect '$ip_addr_check'"
163			ip addr show $iface1
164		else
165			tst_res TFAIL "'$ip_addr_check' not configured by DHCPv$TST_IPVER"
166			print_dhcp_log
167		fi
168	fi
169
170	[ "$wicked_cleanup" ] && rm -f $wicked_cfg
171
172	stop_dhcp
173}
174
175. tst_net.sh
176. daemonlib.sh
177