libndp/tests/basic/send_monitor_nd.sh

134 lines
3.8 KiB
Bash
Raw Normal View History

#!/bin/sh
ret=0
nsuccess=0
nfail=0
NETNS_0="ns-$(mktemp -u XXXXXX)"
NETNS_1="ns-$(mktemp -u XXXXXX)"
# $1: return value
# $2: log message
libndp_log() {
local rc=$1
local msg="$2"
if [ $rc -eq 0 ]; then
printf "[libndp gating]: %-30s [ PASS ]\n" "$msg"
nsuccess=$((nsuccess+1))
else
printf "[libndp gating]: %-30s [ FAIL ]\n" "$msg"
nfail=$((nfail+1)) && ret=1
fi
}
install_tcpreplay() {
which tcpreplay && return 0
wget https://github.com/appneta/tcpreplay/releases/download/v4.3.0/tcpreplay-4.3.0.tar.xz
tar xf tcpreplay-4.3.0.tar.xz
cd tcpreplay-4.3.0
./configure && make && make install
cd ../
which tcpreplay
}
clean_up() {
ip netns del ${NETNS_0} &> /dev/null
ip netns del ${NETNS_1} &> /dev/null
ip link del veth0 &> /dev/null
ip link del veth1 &> /dev/null
}
trap clean_up EXIT
setup() {
install_tcpreplay &> tcpreplay.log || \
{ libndp_log $? "Install tcpreplay" && cat tcpreplay.log; return 1; }
clean_up
ip netns add "${NETNS_0}"
ip netns add "${NETNS_1}"
ip -netns "${NETNS_0}" link set lo up
ip -netns "${NETNS_1}" link set lo up
ip link add type veth
ip link set veth0 netns "${NETNS_0}"
ip link set veth1 netns "${NETNS_1}"
ip -netns "${NETNS_0}" link set veth0 addr 00:00:00:00:00:01
ip -netns "${NETNS_1}" link set veth1 addr 00:00:00:00:00:02
ip -netns "${NETNS_0}" link set veth0 up
ip -netns "${NETNS_1}" link set veth1 up
}
monitor_nd()
{
ip netns exec "${NETNS_1}" unbuffer ndptool -i veth1 monitor &> monitor.log &
sleep 2
# TODO: maybe fuzz the pcap file and see if ndptool still works
ip netns exec "${NETNS_0}" tcpreplay -l 2 -i veth0 nd.pcap
sleep 2 && kill -9 $!
grep -q "Type: NS" monitor.log; libndp_log $? "Monitor NS"
grep -q "Type: NA" monitor.log; libndp_log $? "Monitor NA"
# commit this due to bug 1082933
# grep -q "Type: RS" monitor.log; libndp_log $? "Monitor RS"
grep -q "Type: RA" monitor.log; libndp_log $? "Monitor RA"
# TODO: add ICMPv6 redirect support
}
send_nd()
{
ip netns exec "${NETNS_1}" tcpdump -i veth1 -nn -l &> rs.log &
sleep 2
ip netns exec "${NETNS_0}" ndptool -i veth0 -t rs send
sleep 2 && kill -9 $!
#ip netns exec "${NETNS_0}" ndptool -i veth0 -t ra send
ip netns exec "${NETNS_1}" tcpdump -i veth1 -nn -l &> ns.log &
sleep 2
ip netns exec "${NETNS_0}" ndptool -i veth0 -t ns send
sleep 2 && kill -9 $!
ip netns exec "${NETNS_1}" tcpdump -i veth1 -nn -l &> ns_t.log &
sleep 2
ip netns exec "${NETNS_0}" ndptool -i veth0 -t ns -T fe80::200:ff:fe00:2 send
sleep 2 && kill -9 $!
#ip netns exec "${NETNS_0}" ndptool -i veth0 -t na send
ip netns exec "${NETNS_1}" tcpdump -i veth1 -nn -l &> na_d_t.log &
sleep 2
ip netns exec "${NETNS_0}" ndptool -i veth0 -t na -D fe80::200:ff:fe00:2 -T fe80::200:ff:fe00:1 send
sleep 2 && kill -9 $!
ip netns exec "${NETNS_1}" tcpdump -i veth1 -nn -l &> na_u.log &
sleep 2
ip netns exec "${NETNS_0}" ndptool -i veth0 -U -t na send
sleep 2 && kill -9 $!
grep -q "fe80::200:ff:fe00:1 > ff02::2: ICMP6, router solicitation" rs.log; libndp_log $? "Send RS"
grep -q "fe80::200:ff:fe00:1 > ff02::1: ICMP6, neighbor solicitation, who has ::" ns.log; libndp_log $? "Send NS"
grep -q "fe80::200:ff:fe00:1 > ff02::1:ff00:2: ICMP6, neighbor solicitation, who has fe80::200:ff:fe00:2" ns_t.log; libndp_log $? "Send NS with target"
grep -q "fe80::200:ff:fe00:1 > fe80::200:ff:fe00:2: ICMP6, neighbor advertisement, tgt is fe80::200:ff:fe00:1" na_d_t.log; libndp_log $? "Send NA with dest and target"
grep -q "fe80::200:ff:fe00:1 > ff02::1: ICMP6, neighbor advertisement, tgt is ::" na_u.log; libndp_log $? "Send unsolicited NA"
}
setup || exit 1
monitor_nd
send_nd
printf "\nTests passed: %3d\n" ${nsuccess}
printf "Tests failed: %3d\n" ${nfail}
if [ ${nfail} -ne 0 ]; then
echo -e "\nDEBUG INFO:\n"
for log in `ls *.log`; do
echo "# cat $log"
cat $log
done
fi
exit $ret