1#!/bin/sh 2# Copyright (c) 2014-2015 Oracle and/or its affiliates. All Rights Reserved. 3# 4# This program is free software; you can redistribute it and/or 5# modify it under the terms of the GNU General Public License as 6# published by the Free Software Foundation; either version 2 of 7# the License, or (at your option) any later version. 8# 9# This program is distributed in the hope that it would be useful, 10# but WITHOUT ANY WARRANTY; without even the implied warranty of 11# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12# GNU General Public License for more details. 13# 14# You should have received a copy of the GNU General Public License 15# along with this program; if not, write the Free Software Foundation, 16# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA 17# 18# Author: Alexey Kodanev alexey.kodanev@oracle.com 19 20stop_dhcp() 21{ 22 [ "$(pgrep -x $dhcp_name)" ] || return 0 23 24 tst_resm TINFO "stopping $dhcp_name" 25 local count=0 26 while [ $count -le 10 ]; do 27 pkill -x $dhcp_name 28 [ "$(pgrep -x $dhcp_name)" ] || return 0 29 tst_sleep 100ms 30 count=$((count + 1)) 31 done 32 33 pkill -9 -x $dhcp_name 34 tst_sleep 100ms 35 [ "$(pgrep -x $dhcp_name)" ] && return 1 || return 0 36} 37 38init() 39{ 40 tst_require_root 41 tst_check_cmds cat $dhcp_name awk ip pgrep pkill dhclient 42 43 veth_loaded= 44 lsmod | grep -q '^veth ' && veth_loaded=1 45 46 tst_resm TINFO "create veth interfaces" 47 ip li add $iface0 type veth peer name $iface1 || \ 48 tst_brkm TBROK "failed to add veth $iface0" 49 50 veth_added=1 51 ip li set up $iface0 || tst_brkm TBROK "failed to bring $iface0 up" 52 ip li set up $iface1 || tst_brkm TBROK "failed to bring $iface1 up" 53 54 tst_tmpdir 55 56 stop_dhcp || tst_brkm TBROK "Failed to stop dhcp server" 57 58 dhclient_lease="/var/lib/dhclient/dhclient${TST_IPV6}.leases" 59 if [ -f $dhclient_lease ]; then 60 tst_resm TINFO "backup dhclient${TST_IPV6}.leases" 61 mv $dhclient_lease . 62 fi 63 64 tst_resm TINFO "add $ip_addr to $iface0" 65 ip addr add $ip_addr dev $iface0 || \ 66 tst_brkm TBROK "failed to add ip address" 67} 68 69cleanup() 70{ 71 stop_dhcp 72 73 pkill -f "dhclient -$ipv $iface1" 74 75 cleanup_dhcp 76 77 # restore dhclient leases 78 [ $dhclient_lease ] && rm -f $dhclient_lease 79 [ -f "dhclient${TST_IPV6}.leases" ] && \ 80 mv dhclient${TST_IPV6}.leases $dhclient_lease 81 82 [ $veth_added ] && ip li del $iface0 83 84 if [ -z $veth_loaded ]; then 85 lsmod | grep -q '^veth ' && rmmod veth 86 fi 87 88 tst_rmdir 89} 90 91test01() 92{ 93 tst_resm TINFO "starting DHCPv${ipv} server on $iface0" 94 95 start_dhcp$TST_IPV6 96 97 sleep 1 98 99 if [ "$(pgrep '$dhcp_name')" ]; then 100 print_dhcp_log 101 tst_brkm TBROK "Failed to start $dhcp_name" 102 fi 103 104 tst_resm TINFO "starting dhclient -${ipv} $iface1" 105 dhclient -$ipv $iface1 || \ 106 tst_brkm TBROK "dhclient failed" 107 108 # check that we get configured ip address 109 ip addr show $iface1 | grep $ip_addr_check > /dev/null 110 if [ $? -eq 0 ]; then 111 tst_resm TPASS "'$ip_addr_check' configured by DHCPv$ipv" 112 else 113 tst_resm TFAIL "'$ip_addr_check' not configured by DHCPv$ipv" 114 print_dhcp_log 115 fi 116 117 stop_dhcp 118} 119 120iface0="ltp_veth0" 121iface1="ltp_veth1" 122ipv=${TST_IPV6:-"4"} 123 124if [ $TST_IPV6 ]; then 125 ip_addr="fd00:1:1:2::12/64" 126 ip_addr_check="fd00:1:1:2::100/64" 127else 128 ip_addr="10.1.1.12/24" 129 ip_addr_check="10.1.1.100/24" 130fi 131 132trap "tst_brkm TBROK 'test interrupted'" INT 133