1#! /bin/bash 2 3#check that env vars are properly defined 4 5#check SGW_PATH 6if [[ -z "${SGW_PATH}" || ! -x ${SGW_PATH} ]]; then 7 echo "SGW_PATH is invalid" 8 exit 127 9fi 10 11#check ETH_DEV 12if [[ -z "${ETH_DEV}" ]]; then 13 echo "ETH_DEV is invalid" 14 exit 127 15fi 16 17#setup SGW_LCORE 18SGW_LCORE=${SGW_LCORE:-0} 19 20#check that REMOTE_HOST is reachable 21ssh ${REMOTE_HOST} echo 22st=$? 23if [[ $st -ne 0 ]]; then 24 echo "host ${REMOTE_HOST} is not reachable" 25 exit $st 26fi 27 28#get ether addr of REMOTE_HOST 29REMOTE_MAC=`ssh ${REMOTE_HOST} ip addr show dev ${REMOTE_IFACE}` 30st=$? 31REMOTE_MAC=`echo ${REMOTE_MAC} | sed -e 's/^.*ether //' -e 's/ brd.*$//'` 32if [[ $st -ne 0 || -z "${REMOTE_MAC}" ]]; then 33 echo "coouldn't retrieve ether addr from ${REMOTE_IFACE}" 34 exit 127 35fi 36 37LOCAL_IFACE=dtap0 38 39LOCAL_MAC="00:64:74:61:70:30" 40 41REMOTE_IPV4=192.168.31.14 42LOCAL_IPV4=192.168.31.92 43 44REMOTE_IPV6=fd12:3456:789a:0031:0000:0000:0000:0014 45LOCAL_IPV6=fd12:3456:789a:0031:0000:0000:0000:0092 46 47DPDK_PATH=${RTE_SDK:-${PWD}} 48DPDK_BUILD=${RTE_TARGET:-x86_64-native-linux-gcc} 49 50SGW_OUT_FILE=./ipsec-secgw.out1 51 52SGW_CMD_EAL_PRM="--lcores=${SGW_LCORE} -n 4 ${ETH_DEV}" 53SGW_CMD_CFG="(0,0,${SGW_LCORE}),(1,0,${SGW_LCORE})" 54SGW_CMD_PRM="-p 0x3 -u 1 -P --config=\"${SGW_CMD_CFG}\"" 55 56SGW_CFG_FILE=$(mktemp) 57 58# configure local host/ifaces 59config_local_iface() 60{ 61 ifconfig ${LOCAL_IFACE} ${LOCAL_IPV4}/24 mtu 1400 up 62 ifconfig ${LOCAL_IFACE} 63 64 ip neigh flush dev ${LOCAL_IFACE} 65 ip neigh add ${REMOTE_IPV4} dev ${LOCAL_IFACE} lladdr ${REMOTE_MAC} 66 ip neigh show dev ${LOCAL_IFACE} 67} 68 69config6_local_iface() 70{ 71 config_local_iface 72 73 sysctl -w net.ipv6.conf.${LOCAL_IFACE}.disable_ipv6=0 74 ip addr add ${LOCAL_IPV6}/64 dev ${LOCAL_IFACE} 75 76 sysctl -w net.ipv6.conf.${LOCAL_IFACE}.mtu=1300 77 78 ip -6 neigh add ${REMOTE_IPV6} dev ${LOCAL_IFACE} lladdr ${REMOTE_MAC} 79 ip neigh show dev ${LOCAL_IFACE} 80} 81 82#configure remote host/iface 83config_remote_iface() 84{ 85 ssh ${REMOTE_HOST} ifconfig ${REMOTE_IFACE} down 86 ssh ${REMOTE_HOST} ifconfig ${REMOTE_IFACE} ${REMOTE_IPV4}/24 up 87 ssh ${REMOTE_HOST} ifconfig ${REMOTE_IFACE} 88 89 ssh ${REMOTE_HOST} ip neigh flush dev ${REMOTE_IFACE} 90 91 # by some reason following ip neigh doesn't work for me here properly: 92 #ssh ${REMOTE_HOST} ip neigh add ${LOCAL_IPV4} \ 93 # dev ${REMOTE_IFACE} lladr ${LOCAL_MAC} 94 # so used arp instead. 95 ssh ${REMOTE_HOST} arp -i ${REMOTE_IFACE} -s ${LOCAL_IPV4} ${LOCAL_MAC} 96 ssh ${REMOTE_HOST} ip neigh show dev ${REMOTE_IFACE} 97 98 ssh ${REMOTE_HOST} iptables --flush 99} 100 101config6_remote_iface() 102{ 103 config_remote_iface 104 105 ssh ${REMOTE_HOST} sysctl -w \ 106 net.ipv6.conf.${REMOTE_IFACE}.disable_ipv6=0 107 ssh ${REMOTE_HOST} ip addr add ${REMOTE_IPV6}/64 dev ${REMOTE_IFACE} 108 109 ssh ${REMOTE_HOST} ip -6 neigh add ${LOCAL_IPV6} \ 110 dev ${REMOTE_IFACE} lladdr ${LOCAL_MAC} 111 ssh ${REMOTE_HOST} ip neigh show dev ${REMOTE_IFACE} 112 113 ssh ${REMOTE_HOST} ip6tables --flush 114} 115 116#configure remote and local host/iface 117config_iface() 118{ 119 config_local_iface 120 config_remote_iface 121} 122 123config6_iface() 124{ 125 config6_local_iface 126 config6_remote_iface 127} 128 129#start ipsec-secgw 130secgw_start() 131{ 132 SGW_EXEC_FILE=$(mktemp) 133 cat <<EOF > ${SGW_EXEC_FILE} 134${SGW_PATH} ${SGW_CMD_EAL_PRM} ${CRYPTO_DEV} \ 135--vdev="net_tap0,mac=fixed" \ 136-- ${SGW_CMD_PRM} ${SGW_CMD_XPRM} -f ${SGW_CFG_FILE} > \ 137${SGW_OUT_FILE} 2>&1 & 138p=\$! 139echo \$p 140EOF 141 142 cat ${SGW_EXEC_FILE} 143 SGW_PID=`/bin/bash -x ${SGW_EXEC_FILE}` 144 145 # wait till ipsec-secgw start properly 146 i=0 147 st=1 148 while [[ $i -ne 10 && st -ne 0 ]]; do 149 sleep 1 150 ifconfig ${LOCAL_IFACE} 151 st=$? 152 let i++ 153 done 154} 155 156#stop ipsec-secgw and cleanup 157secgw_stop() 158{ 159 kill ${SGW_PID} 160 rm -f ${SGW_EXEC_FILE} 161 rm -f ${SGW_CFG_FILE} 162} 163