#!/bin/sh
# Copyright (c) 2016 Red Hat Inc., All Rights Reserved.
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License as
# published by the Free Software Foundation; either version 2 of
# the License, or (at your option) any later version.
#
# This program is distributed in the hope that it would be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, see .
#
# Author: Hangbin Liu
#
#######################################################################
. test_net.sh
# tst_ipsec_cleanup: flush ipsec state and policy rules
tst_ipsec_cleanup()
{
ip xfrm state flush
ip xfrm policy flush
tst_rhost_run -c "ip xfrm state flush && ip xfrm policy flush"
}
# tst_ipsec target protocol mode spi src_addr dst_addr: config ipsec with
# supplied protocol and mode.
#
# target: target of the configuration host ( lhost / rhost )
# protocol: ah / esp / ipcomp
# mode: transport / tunnel
# spi: the first spi value
# src_addr: source IP address
# dst_addr: destination IP address
tst_ipsec()
{
if [ $# -ne 6 ]; then
tst_brkm TCONF "tst_ipsec parameter mismatch"
fi
tst_check_cmds hexdump
local target=$1
local protocol=$2
local mode=$3
local spi=$4
local src=$5
local dst=$6
# Encryption algorithm
local EALGO="des3_ede"
local EALGO_KEY=0x$(printf _I_want_to_have_chicken_ | \
hexdump -ve '/1 "%x"')
# Authentication algorithm
local AALGO="sha1"
local AALGO_KEY=0x$(printf beef_fish_pork_salad | \
hexdump -ve '/1 "%x"')
# Compression algorithm
local CALGO="deflate"
# Algorithm options for each protocol
local algo_line=
local proto=
case $protocol in
ah)
algo_line="auth $AALGO $AALGO_KEY"
proto="ah"
;;
esp)
algo_line="enc $EALGO $EALGO_KEY auth $AALGO $AALGO_KEY"
proto="esp"
;;
ipcomp)
algo_line="comp $CALGO"
proto="comp"
;;
*)
tst_brkm TCONF "tst_ipsec protocol mismatch"
;;
esac
if [ $target = lhost ]; then
local spi_1="0x$spi"
local spi_2="0x$(( $spi + 1 ))"
ROD ip xfrm state add src $src dst $dst spi $spi_1 \
proto $proto $algo_line mode $mode sel src $src dst $dst
ROD ip xfrm state add src $dst dst $src spi $spi_2 \
proto $proto $algo_line mode $mode sel src $dst dst $src
ROD ip xfrm policy add src $src dst $dst dir out tmpl src $src \
dst $dst proto $proto mode $mode
ROD ip xfrm policy add src $dst dst $src dir in tmpl src $dst \
dst $src proto $proto mode $mode level use
elif [ $target = rhost ]; then
local spi_1="0x$(( $spi + 1 ))"
local spi_2="0x$spi"
tst_rhost_run -s -c "ip xfrm state add src $src dst $dst \
spi $spi_1 proto $proto $algo_line mode $mode sel \
src $src dst $dst"
tst_rhost_run -s -c "ip xfrm state add src $dst dst $src \
spi $spi_2 proto $proto $algo_line mode $mode sel \
src $dst dst $src"
tst_rhost_run -s -c "ip xfrm policy add src $src dst $dst \
dir out tmpl src $src dst $dst proto $proto mode $mode"
tst_rhost_run -s -c "ip xfrm policy add src $dst dst $src dir \
in tmpl src $dst dst $src proto $proto \
mode $mode level use"
fi
}