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