Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
This commit is contained in:
@@ -28,6 +28,19 @@ KEY_AES=0x0123456789abcdef0123456789012345
|
||||
SPI1=0x1
|
||||
SPI2=0x2
|
||||
|
||||
do_esp_policy() {
|
||||
local ns=$1
|
||||
local me=$2
|
||||
local remote=$3
|
||||
local lnet=$4
|
||||
local rnet=$5
|
||||
|
||||
# to encrypt packets as they go out (includes forwarded packets that need encapsulation)
|
||||
ip -net $ns xfrm policy add src $lnet dst $rnet dir out tmpl src $me dst $remote proto esp mode tunnel priority 100 action allow
|
||||
# to fwd decrypted packets after esp processing:
|
||||
ip -net $ns xfrm policy add src $rnet dst $lnet dir fwd tmpl src $remote dst $me proto esp mode tunnel priority 100 action allow
|
||||
}
|
||||
|
||||
do_esp() {
|
||||
local ns=$1
|
||||
local me=$2
|
||||
@@ -40,10 +53,59 @@ do_esp() {
|
||||
ip -net $ns xfrm state add src $remote dst $me proto esp spi $spi_in enc aes $KEY_AES auth sha1 $KEY_SHA mode tunnel sel src $rnet dst $lnet
|
||||
ip -net $ns xfrm state add src $me dst $remote proto esp spi $spi_out enc aes $KEY_AES auth sha1 $KEY_SHA mode tunnel sel src $lnet dst $rnet
|
||||
|
||||
# to encrypt packets as they go out (includes forwarded packets that need encapsulation)
|
||||
ip -net $ns xfrm policy add src $lnet dst $rnet dir out tmpl src $me dst $remote proto esp mode tunnel priority 100 action allow
|
||||
# to fwd decrypted packets after esp processing:
|
||||
ip -net $ns xfrm policy add src $rnet dst $lnet dir fwd tmpl src $remote dst $me proto esp mode tunnel priority 100 action allow
|
||||
do_esp_policy $ns $me $remote $lnet $rnet
|
||||
}
|
||||
|
||||
# add policies with different netmasks, to make sure kernel carries
|
||||
# the policies contained within new netmask over when search tree is
|
||||
# re-built.
|
||||
# peer netns that are supposed to be encapsulated via esp have addresses
|
||||
# in the 10.0.1.0/24 and 10.0.2.0/24 subnets, respectively.
|
||||
#
|
||||
# Adding a policy for '10.0.1.0/23' will make it necessary to
|
||||
# alter the prefix of 10.0.1.0 subnet.
|
||||
# In case new prefix overlaps with existing node, the node and all
|
||||
# policies it carries need to be merged with the existing one(s).
|
||||
#
|
||||
# Do that here.
|
||||
do_overlap()
|
||||
{
|
||||
local ns=$1
|
||||
|
||||
# adds new nodes to tree (neither network exists yet in policy database).
|
||||
ip -net $ns xfrm policy add src 10.1.0.0/24 dst 10.0.0.0/24 dir fwd priority 200 action block
|
||||
|
||||
# adds a new node in the 10.0.0.0/24 tree (dst node exists).
|
||||
ip -net $ns xfrm policy add src 10.2.0.0/24 dst 10.0.0.0/24 dir fwd priority 200 action block
|
||||
|
||||
# adds a 10.2.0.0/23 node, but for different dst.
|
||||
ip -net $ns xfrm policy add src 10.2.0.0/23 dst 10.0.1.0/24 dir fwd priority 200 action block
|
||||
|
||||
# dst now overlaps with the 10.0.1.0/24 ESP policy in fwd.
|
||||
# kernel must 'promote' existing one (10.0.0.0/24) to 10.0.0.0/23.
|
||||
# But 10.0.0.0/23 also includes existing 10.0.1.0/24, so that node
|
||||
# also has to be merged too, including source-sorted subtrees.
|
||||
# old:
|
||||
# 10.0.0.0/24 (node 1 in dst tree of the bin)
|
||||
# 10.1.0.0/24 (node in src tree of dst node 1)
|
||||
# 10.2.0.0/24 (node in src tree of dst node 1)
|
||||
# 10.0.1.0/24 (node 2 in dst tree of the bin)
|
||||
# 10.0.2.0/24 (node in src tree of dst node 2)
|
||||
# 10.2.0.0/24 (node in src tree of dst node 2)
|
||||
#
|
||||
# The next 'policy add' adds dst '10.0.0.0/23', which means
|
||||
# that dst node 1 and dst node 2 have to be merged including
|
||||
# the sub-tree. As no duplicates are allowed, policies in
|
||||
# the two '10.0.2.0/24' are also merged.
|
||||
#
|
||||
# after the 'add', internal search tree should look like this:
|
||||
# 10.0.0.0/23 (node in dst tree of bin)
|
||||
# 10.0.2.0/24 (node in src tree of dst node)
|
||||
# 10.1.0.0/24 (node in src tree of dst node)
|
||||
# 10.2.0.0/24 (node in src tree of dst node)
|
||||
#
|
||||
# 10.0.0.0/24 and 10.0.1.0/24 nodes have been merged as 10.0.0.0/23.
|
||||
ip -net $ns xfrm policy add src 10.1.0.0/24 dst 10.0.0.0/23 dir fwd priority 200 action block
|
||||
}
|
||||
|
||||
do_esp_policy_get_check() {
|
||||
@@ -160,6 +222,41 @@ check_xfrm() {
|
||||
return $lret
|
||||
}
|
||||
|
||||
check_exceptions()
|
||||
{
|
||||
logpostfix="$1"
|
||||
local lret=0
|
||||
|
||||
# ping to .254 should be excluded from the tunnel (exception is in place).
|
||||
check_xfrm 0 254
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "FAIL: expected ping to .254 to fail ($logpostfix)"
|
||||
lret=1
|
||||
else
|
||||
echo "PASS: ping to .254 bypassed ipsec tunnel ($logpostfix)"
|
||||
fi
|
||||
|
||||
# ping to .253 should use use ipsec due to direct policy exception.
|
||||
check_xfrm 1 253
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "FAIL: expected ping to .253 to use ipsec tunnel ($logpostfix)"
|
||||
lret=1
|
||||
else
|
||||
echo "PASS: direct policy matches ($logpostfix)"
|
||||
fi
|
||||
|
||||
# ping to .2 should use ipsec.
|
||||
check_xfrm 1 2
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "FAIL: expected ping to .2 to use ipsec tunnel ($logpostfix)"
|
||||
lret=1
|
||||
else
|
||||
echo "PASS: policy matches ($logpostfix)"
|
||||
fi
|
||||
|
||||
return $lret
|
||||
}
|
||||
|
||||
#check for needed privileges
|
||||
if [ "$(id -u)" -ne 0 ];then
|
||||
echo "SKIP: Need root privileges"
|
||||
@@ -270,32 +367,44 @@ do_exception ns4 10.0.3.10 10.0.3.1 10.0.1.253 10.0.1.240/28
|
||||
do_exception ns3 dead:3::1 dead:3::10 dead:2::fd dead:2:f0::/96
|
||||
do_exception ns4 dead:3::10 dead:3::1 dead:1::fd dead:1:f0::/96
|
||||
|
||||
# ping to .254 should now be excluded from the tunnel
|
||||
check_xfrm 0 254
|
||||
check_exceptions "exceptions"
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "FAIL: expected ping to .254 to fail"
|
||||
ret=1
|
||||
else
|
||||
echo "PASS: ping to .254 bypassed ipsec tunnel"
|
||||
fi
|
||||
|
||||
# ping to .253 should use use ipsec due to direct policy exception.
|
||||
check_xfrm 1 253
|
||||
# insert block policies with adjacent/overlapping netmasks
|
||||
do_overlap ns3
|
||||
|
||||
check_exceptions "exceptions and block policies"
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "FAIL: expected ping to .253 to use ipsec tunnel"
|
||||
ret=1
|
||||
else
|
||||
echo "PASS: direct policy matches"
|
||||
fi
|
||||
|
||||
# ping to .2 should use ipsec.
|
||||
check_xfrm 1 2
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "FAIL: expected ping to .2 to use ipsec tunnel"
|
||||
ret=1
|
||||
else
|
||||
echo "PASS: policy matches"
|
||||
fi
|
||||
for n in ns3 ns4;do
|
||||
ip -net $n xfrm policy set hthresh4 28 24 hthresh6 126 125
|
||||
sleep $((RANDOM%5))
|
||||
done
|
||||
|
||||
check_exceptions "exceptions and block policies after hresh changes"
|
||||
|
||||
# full flush of policy db, check everything gets freed incl. internal meta data
|
||||
ip -net ns3 xfrm policy flush
|
||||
|
||||
do_esp_policy ns3 10.0.3.1 10.0.3.10 10.0.1.0/24 10.0.2.0/24
|
||||
do_exception ns3 10.0.3.1 10.0.3.10 10.0.2.253 10.0.2.240/28
|
||||
|
||||
# move inexact policies to hash table
|
||||
ip -net ns3 xfrm policy set hthresh4 16 16
|
||||
|
||||
sleep $((RANDOM%5))
|
||||
check_exceptions "exceptions and block policies after hthresh change in ns3"
|
||||
|
||||
# restore original hthresh settings -- move policies back to tables
|
||||
for n in ns3 ns4;do
|
||||
ip -net $n xfrm policy set hthresh4 32 32 hthresh6 128 128
|
||||
sleep $((RANDOM%5))
|
||||
done
|
||||
check_exceptions "exceptions and block policies after hresh change to normal"
|
||||
|
||||
for i in 1 2 3 4;do ip netns del ns$i;done
|
||||
|
||||
|
@@ -1133,6 +1133,21 @@ void test_pkey_syscalls_bad_args(int *ptr, u16 pkey)
|
||||
pkey_assert(err);
|
||||
}
|
||||
|
||||
void become_child(void)
|
||||
{
|
||||
pid_t forkret;
|
||||
|
||||
forkret = fork();
|
||||
pkey_assert(forkret >= 0);
|
||||
dprintf3("[%d] fork() ret: %d\n", getpid(), forkret);
|
||||
|
||||
if (!forkret) {
|
||||
/* in the child */
|
||||
return;
|
||||
}
|
||||
exit(0);
|
||||
}
|
||||
|
||||
/* Assumes that all pkeys other than 'pkey' are unallocated */
|
||||
void test_pkey_alloc_exhaust(int *ptr, u16 pkey)
|
||||
{
|
||||
@@ -1141,7 +1156,7 @@ void test_pkey_alloc_exhaust(int *ptr, u16 pkey)
|
||||
int nr_allocated_pkeys = 0;
|
||||
int i;
|
||||
|
||||
for (i = 0; i < NR_PKEYS*2; i++) {
|
||||
for (i = 0; i < NR_PKEYS*3; i++) {
|
||||
int new_pkey;
|
||||
dprintf1("%s() alloc loop: %d\n", __func__, i);
|
||||
new_pkey = alloc_pkey();
|
||||
@@ -1152,20 +1167,26 @@ void test_pkey_alloc_exhaust(int *ptr, u16 pkey)
|
||||
if ((new_pkey == -1) && (errno == ENOSPC)) {
|
||||
dprintf2("%s() failed to allocate pkey after %d tries\n",
|
||||
__func__, nr_allocated_pkeys);
|
||||
break;
|
||||
} else {
|
||||
/*
|
||||
* Ensure the number of successes never
|
||||
* exceeds the number of keys supported
|
||||
* in the hardware.
|
||||
*/
|
||||
pkey_assert(nr_allocated_pkeys < NR_PKEYS);
|
||||
allocated_pkeys[nr_allocated_pkeys++] = new_pkey;
|
||||
}
|
||||
pkey_assert(nr_allocated_pkeys < NR_PKEYS);
|
||||
allocated_pkeys[nr_allocated_pkeys++] = new_pkey;
|
||||
|
||||
/*
|
||||
* Make sure that allocation state is properly
|
||||
* preserved across fork().
|
||||
*/
|
||||
if (i == NR_PKEYS*2)
|
||||
become_child();
|
||||
}
|
||||
|
||||
dprintf3("%s()::%d\n", __func__, __LINE__);
|
||||
|
||||
/*
|
||||
* ensure it did not reach the end of the loop without
|
||||
* failure:
|
||||
*/
|
||||
pkey_assert(i < NR_PKEYS*2);
|
||||
|
||||
/*
|
||||
* There are 16 pkeys supported in hardware. Three are
|
||||
* allocated by the time we get here:
|
||||
|
Reference in New Issue
Block a user