17cc426fbSAlan Somers# 24d846d26SWarner Losh# SPDX-License-Identifier: BSD-2-Clause 37cc426fbSAlan Somers# 47cc426fbSAlan Somers# Copyright (C) 2019 Jan Sucan <jansucan@FreeBSD.org> 57cc426fbSAlan Somers# All rights reserved. 67cc426fbSAlan Somers# 77cc426fbSAlan Somers# Redistribution and use in source and binary forms, with or without 87cc426fbSAlan Somers# modification, are permitted provided that the following conditions 97cc426fbSAlan Somers# are met: 107cc426fbSAlan Somers# 1. Redistributions of source code must retain the above copyright 117cc426fbSAlan Somers# notice, this list of conditions and the following disclaimer. 127cc426fbSAlan Somers# 2. Redistributions in binary form must reproduce the above copyright 137cc426fbSAlan Somers# notice, this list of conditions and the following disclaimer in the 147cc426fbSAlan Somers# documentation and/or other materials provided with the distribution. 157cc426fbSAlan Somers# 167cc426fbSAlan Somers# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 177cc426fbSAlan Somers# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 187cc426fbSAlan Somers# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 197cc426fbSAlan Somers# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 207cc426fbSAlan Somers# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 217cc426fbSAlan Somers# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 227cc426fbSAlan Somers# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 237cc426fbSAlan Somers# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 247cc426fbSAlan Somers# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 257cc426fbSAlan Somers# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 267cc426fbSAlan Somers# SUCH DAMAGE. 277cc426fbSAlan Somers# 287cc426fbSAlan Somers 29fcae0b54SJose Luis Duranrequire_ipv4() 30fcae0b54SJose Luis Duran{ 319ce201f2SAlan Somers if ! getaddrinfo -f inet localhost 1>/dev/null 2>&1; then 329ce201f2SAlan Somers atf_skip "IPv4 is not configured" 339ce201f2SAlan Somers fi 349ce201f2SAlan Somers} 35fcae0b54SJose Luis Duranrequire_ipv6() 36fcae0b54SJose Luis Duran{ 379ce201f2SAlan Somers if ! getaddrinfo -f inet6 localhost 1>/dev/null 2>&1; then 389ce201f2SAlan Somers atf_skip "IPv6 is not configured" 399ce201f2SAlan Somers fi 409ce201f2SAlan Somers} 419ce201f2SAlan Somers 427cc426fbSAlan Somersatf_test_case ping_c1_s56_t1 43fcae0b54SJose Luis Duranping_c1_s56_t1_head() 44fcae0b54SJose Luis Duran{ 457cc426fbSAlan Somers atf_set "descr" "Stop after receiving 1 ECHO_RESPONSE packet" 467cc426fbSAlan Somers} 47fcae0b54SJose Luis Duranping_c1_s56_t1_body() 48fcae0b54SJose Luis Duran{ 499ce201f2SAlan Somers require_ipv4 507cc426fbSAlan Somers atf_check -s exit:0 -o save:std.out -e empty \ 513cde9171SAlan Somers ping -4 -c 1 -s 56 -t 1 localhost 527cc426fbSAlan Somers check_ping_statistics std.out $(atf_get_srcdir)/ping_c1_s56_t1.out 537cc426fbSAlan Somers} 547cc426fbSAlan Somers 555af718a5SMike Karelsatf_test_case ping_c1_s56_t1_S127 56fcae0b54SJose Luis Duranping_c1_s56_t1_S127_head() 57fcae0b54SJose Luis Duran{ 585af718a5SMike Karels atf_set "descr" "Check that ping -S 127.0.0.1 localhost succeeds" 595af718a5SMike Karels} 60fcae0b54SJose Luis Duranping_c1_s56_t1_S127_body() 61fcae0b54SJose Luis Duran{ 625af718a5SMike Karels require_ipv4 635af718a5SMike Karels require_ipv6 645af718a5SMike Karels atf_check -s exit:0 -o save:std.out -e empty \ 655af718a5SMike Karels ping -c 1 -s 56 -t 1 -S 127.0.0.1 localhost 665af718a5SMike Karels check_ping_statistics std.out $(atf_get_srcdir)/ping_c1_s56_t1_S127.out 675af718a5SMike Karels} 685af718a5SMike Karels 693cde9171SAlan Somersatf_test_case ping_6_c1_s8_t1 70fcae0b54SJose Luis Duranping_6_c1_s8_t1_head() 71fcae0b54SJose Luis Duran{ 723cde9171SAlan Somers atf_set "descr" "Stop after receiving 1 ECHO_RESPONSE packet" 733cde9171SAlan Somers} 74fcae0b54SJose Luis Duranping_6_c1_s8_t1_body() 75fcae0b54SJose Luis Duran{ 769ce201f2SAlan Somers require_ipv6 773cde9171SAlan Somers atf_check -s exit:0 -o save:std.out -e empty \ 783cde9171SAlan Somers ping -6 -c 1 -s 8 -t 1 localhost 793cde9171SAlan Somers check_ping_statistics std.out $(atf_get_srcdir)/ping_6_c1_s8_t1.out 803cde9171SAlan Somers} 813cde9171SAlan Somers 825af718a5SMike Karelsatf_test_case ping_c1_s8_t1_S1 83fcae0b54SJose Luis Duranping_c1_s8_t1_S1_head() 84fcae0b54SJose Luis Duran{ 855af718a5SMike Karels atf_set "descr" "Check that ping -S ::1 localhost succeeds" 865af718a5SMike Karels} 87fcae0b54SJose Luis Duranping_c1_s8_t1_S1_body() 88fcae0b54SJose Luis Duran{ 895af718a5SMike Karels require_ipv4 905af718a5SMike Karels require_ipv6 915af718a5SMike Karels atf_check -s exit:0 -o save:std.out -e empty \ 925af718a5SMike Karels ping -c 1 -s 8 -t 1 -S ::1 localhost 935af718a5SMike Karels check_ping_statistics std.out $(atf_get_srcdir)/ping_c1_s8_t1_S1.out 945af718a5SMike Karels} 955af718a5SMike Karels 96d2624517SAlan Somersatf_test_case ping6_c1_s8_t1 97fcae0b54SJose Luis Duranping6_c1_s8_t1_head() 98fcae0b54SJose Luis Duran{ 99d2624517SAlan Somers atf_set "descr" "Use IPv6 when invoked as ping6" 100d2624517SAlan Somers} 101fcae0b54SJose Luis Duranping6_c1_s8_t1_body() 102fcae0b54SJose Luis Duran{ 1039ce201f2SAlan Somers require_ipv6 104d2624517SAlan Somers atf_check -s exit:0 -o save:std.out -e empty \ 105d2624517SAlan Somers ping6 -c 1 -s 8 -t 1 localhost 106d2624517SAlan Somers check_ping_statistics std.out $(atf_get_srcdir)/ping_6_c1_s8_t1.out 107d2624517SAlan Somers} 108d2624517SAlan Somers 109*fc7143b4SDag-Erling Smørgravatf_test_case ping_c1t6 110fcae0b54SJose Luis Duranping_c1t6_head() 111fcae0b54SJose Luis Duran{ 1129ce201f2SAlan Somers atf_set "descr" "-t6 is not interpreted as -t -6 by ping" 1139ce201f2SAlan Somers} 114fcae0b54SJose Luis Duranping_c1t6_body() 115fcae0b54SJose Luis Duran{ 1169ce201f2SAlan Somers require_ipv4 1179ce201f2SAlan Somers atf_check -s exit:0 -o ignore -e empty ping -c1 -t6 127.0.0.1 1189ce201f2SAlan Somers} 1199ce201f2SAlan Somers 120*fc7143b4SDag-Erling Smørgravatf_test_case ping_c1t4 121fcae0b54SJose Luis Duranping6_c1t4_head() 122fcae0b54SJose Luis Duran{ 1239ce201f2SAlan Somers atf_set "descr" "-t4 is not interpreted as -t -4 by ping6" 1249ce201f2SAlan Somers} 125fcae0b54SJose Luis Duranping6_c1t4_body() 126fcae0b54SJose Luis Duran{ 1279ce201f2SAlan Somers require_ipv6 1289ce201f2SAlan Somers atf_check -s exit:0 -o ignore -e empty ping6 -c1 -t4 ::1 1299ce201f2SAlan Somers} 1309ce201f2SAlan Somers 131*fc7143b4SDag-Erling Smørgravatf_test_case ping_46 132fcae0b54SJose Luis Duranping_46_head() 133fcae0b54SJose Luis Duran{ 134d481443aSJose Luis Duran atf_set "descr" "-4 and -6 cannot be used simultaneously" 1359ce201f2SAlan Somers} 136fcae0b54SJose Luis Duranping_46_body() 137fcae0b54SJose Luis Duran{ 138d481443aSJose Luis Duran require_ipv4 139d481443aSJose Luis Duran require_ipv6 140d481443aSJose Luis Duran atf_check -s exit:1 \ 1417fd2c91aSDag-Erling Smørgrav -e match:"illegal option -- 6" \ 142d481443aSJose Luis Duran ping -4 -6 localhost 1439ce201f2SAlan Somers} 1449ce201f2SAlan Somers 145*fc7143b4SDag-Erling Smørgravatf_test_case ping_64 1467fd2c91aSDag-Erling Smørgravping_64_head() 147fcae0b54SJose Luis Duran{ 148d481443aSJose Luis Duran atf_set "descr" "-4 and -6 cannot be used simultaneously" 1499ce201f2SAlan Somers} 1507fd2c91aSDag-Erling Smørgravping_64_body() 151fcae0b54SJose Luis Duran{ 152d481443aSJose Luis Duran require_ipv4 153d481443aSJose Luis Duran require_ipv6 154d481443aSJose Luis Duran atf_check -s exit:1 \ 1557fd2c91aSDag-Erling Smørgrav -e match:"illegal option -- 4" \ 1567fd2c91aSDag-Erling Smørgrav ping -6 -4 localhost 1577fd2c91aSDag-Erling Smørgrav} 1587fd2c91aSDag-Erling Smørgrav 159*fc7143b4SDag-Erling Smørgravatf_test_case ping6_4 1607fd2c91aSDag-Erling Smørgravping6_4_head() 1617fd2c91aSDag-Erling Smørgrav{ 1627fd2c91aSDag-Erling Smørgrav atf_set "descr" "ping6 does not accept -4" 1637fd2c91aSDag-Erling Smørgrav} 1647fd2c91aSDag-Erling Smørgravping6_4_body() 1657fd2c91aSDag-Erling Smørgrav{ 1667fd2c91aSDag-Erling Smørgrav require_ipv4 1677fd2c91aSDag-Erling Smørgrav require_ipv6 1687fd2c91aSDag-Erling Smørgrav atf_check -s exit:1 \ 1697fd2c91aSDag-Erling Smørgrav -e match:"illegal option -- 4" \ 1707fd2c91aSDag-Erling Smørgrav ping6 -4 localhost 1719ce201f2SAlan Somers} 1729ce201f2SAlan Somers 173c4ffb80eSDag-Erling Smørgravatf_test_case ping_nohost 174c4ffb80eSDag-Erling Smørgravping_nohost_head() 175c4ffb80eSDag-Erling Smørgrav{ 176c4ffb80eSDag-Erling Smørgrav atf_set "descr" "ping a nonexistent host" 177c4ffb80eSDag-Erling Smørgrav} 178c4ffb80eSDag-Erling Smørgravping_nohost_body() 179c4ffb80eSDag-Erling Smørgrav{ 180c4ffb80eSDag-Erling Smørgrav atf_check -s exit:68 -e match:"cannot resolve" \ 181c4ffb80eSDag-Erling Smørgrav ping nonexistent.in-addr.arpa. 182c4ffb80eSDag-Erling Smørgrav} 183c4ffb80eSDag-Erling Smørgrav 184c4ffb80eSDag-Erling Smørgravatf_test_case ping4_nohost 185c4ffb80eSDag-Erling Smørgravping4_nohost_head() 186c4ffb80eSDag-Erling Smørgrav{ 187c4ffb80eSDag-Erling Smørgrav atf_set "descr" "ping -4 a nonexistent host" 188c4ffb80eSDag-Erling Smørgrav} 189c4ffb80eSDag-Erling Smørgravping4_nohost_body() 190c4ffb80eSDag-Erling Smørgrav{ 191c4ffb80eSDag-Erling Smørgrav atf_check -s exit:68 -e match:"cannot resolve" \ 192c4ffb80eSDag-Erling Smørgrav ping -4 nonexistent.in-addr.arpa. 193c4ffb80eSDag-Erling Smørgrav} 194c4ffb80eSDag-Erling Smørgrav 195c4ffb80eSDag-Erling Smørgravatf_test_case ping6_nohost 196c4ffb80eSDag-Erling Smørgravping6_nohost_head() 197c4ffb80eSDag-Erling Smørgrav{ 198c4ffb80eSDag-Erling Smørgrav atf_set "descr" "ping -6 a nonexistent host" 199c4ffb80eSDag-Erling Smørgrav} 200c4ffb80eSDag-Erling Smørgravping6_nohost_body() 201c4ffb80eSDag-Erling Smørgrav{ 202c4ffb80eSDag-Erling Smørgrav atf_check -s exit:68 -e match:"cannot resolve" \ 203c4ffb80eSDag-Erling Smørgrav ping -6 nonexistent.in-addr.arpa. 204c4ffb80eSDag-Erling Smørgrav} 205c4ffb80eSDag-Erling Smørgrav 206e35cfc60SAlan Somersatf_test_case "inject_opts" "cleanup" 207e35cfc60SAlan Somersinject_opts_head() 208e35cfc60SAlan Somers{ 209e35cfc60SAlan Somers atf_set "descr" "Inject an ECHO REPLY with IP options" 210e35cfc60SAlan Somers atf_set "require.user" "root" 211e35cfc60SAlan Somers atf_set "require.progs" "python3" "scapy" 212e35cfc60SAlan Somers} 213e35cfc60SAlan Somersinject_opts_body() 214e35cfc60SAlan Somers{ 215e35cfc60SAlan Somers atf_check -s exit:0 -o match:"wrong total length" -o match:"NOP" python3 $(atf_get_srcdir)/injection.py opts 216e35cfc60SAlan Somers} 217e35cfc60SAlan Somersinject_opts_cleanup() 218e35cfc60SAlan Somers{ 219e35cfc60SAlan Somers ifconfig `cat tun.txt` destroy 220e35cfc60SAlan Somers} 221e35cfc60SAlan Somers 222e35cfc60SAlan Somersatf_test_case "inject_pip" "cleanup" 223e35cfc60SAlan Somersinject_pip_head() 224e35cfc60SAlan Somers{ 225e35cfc60SAlan Somers atf_set "descr" "Inject an ICMP error with a quoted packet with IP options" 226e35cfc60SAlan Somers atf_set "require.user" "root" 227e35cfc60SAlan Somers atf_set "require.progs" "python3" "scapy" 228e35cfc60SAlan Somers} 229e35cfc60SAlan Somersinject_pip_body() 230e35cfc60SAlan Somers{ 23120b41303SJose Luis Duran atf_check -s exit:2 -o match:"Destination Host Unreachable" -o match:"(01){40}" python3 $(atf_get_srcdir)/injection.py pip 232e35cfc60SAlan Somers} 233e35cfc60SAlan Somersinject_pip_cleanup() 234e35cfc60SAlan Somers{ 235e35cfc60SAlan Somers ifconfig `cat tun.txt` destroy 236e35cfc60SAlan Somers} 237e35cfc60SAlan Somers 238e35cfc60SAlan Somers# This is redundant with the ping_ tests, but it serves to ensure that scapy.py 239e35cfc60SAlan Somers# is working correctly. 240e35cfc60SAlan Somersatf_test_case "inject_reply" "cleanup" 241e35cfc60SAlan Somersinject_reply_head() 242e35cfc60SAlan Somers{ 243e35cfc60SAlan Somers atf_set "descr" "Basic ping test with packet injection" 244e35cfc60SAlan Somers atf_set "require.user" "root" 245e35cfc60SAlan Somers atf_set "require.progs" "python3" "scapy" 246e35cfc60SAlan Somers} 247e35cfc60SAlan Somersinject_reply_body() 248e35cfc60SAlan Somers{ 249e35cfc60SAlan Somers atf_check -s exit:0 -o match:"1 packets transmitted, 1 packets received" python3 $(atf_get_srcdir)/injection.py reply 250e35cfc60SAlan Somers} 251e35cfc60SAlan Somersinject_reply_cleanup() 252e35cfc60SAlan Somers{ 253e35cfc60SAlan Somers ifconfig `cat tun.txt` destroy 254e35cfc60SAlan Somers} 255e35cfc60SAlan Somers 256fcae0b54SJose Luis Duranatf_init_test_cases() 257fcae0b54SJose Luis Duran{ 2587cc426fbSAlan Somers atf_add_test_case ping_c1_s56_t1 2595af718a5SMike Karels atf_add_test_case ping_c1_s56_t1_S127 2603cde9171SAlan Somers atf_add_test_case ping_6_c1_s8_t1 2615af718a5SMike Karels atf_add_test_case ping_c1_s8_t1_S1 262d2624517SAlan Somers atf_add_test_case ping6_c1_s8_t1 2639ce201f2SAlan Somers atf_add_test_case ping_c1t6 2649ce201f2SAlan Somers atf_add_test_case ping6_c1t4 2659ce201f2SAlan Somers atf_add_test_case ping_46 2667fd2c91aSDag-Erling Smørgrav atf_add_test_case ping_64 2677fd2c91aSDag-Erling Smørgrav atf_add_test_case ping6_4 268c4ffb80eSDag-Erling Smørgrav atf_add_test_case ping_nohost 269c4ffb80eSDag-Erling Smørgrav atf_add_test_case ping4_nohost 270c4ffb80eSDag-Erling Smørgrav atf_add_test_case ping6_nohost 271e35cfc60SAlan Somers atf_add_test_case inject_opts 272e35cfc60SAlan Somers atf_add_test_case inject_pip 273e35cfc60SAlan Somers atf_add_test_case inject_reply 2747cc426fbSAlan Somers} 2757cc426fbSAlan Somers 276fcae0b54SJose Luis Durancheck_ping_statistics() 277fcae0b54SJose Luis Duran{ 2787cc426fbSAlan Somers sed -e 's/0.[0-9]\{3\}//g' \ 2797cc426fbSAlan Somers -e 's/[1-9][0-9]*.[0-9]\{3\}//g' \ 2807cc426fbSAlan Somers -e 's/localhost ([0-9]\{1,3\}\(\.[0-9]\{1,3\}\)\{1,3\})/localhost/' \ 2817cc426fbSAlan Somers -e 's/from [0-9]\{1,3\}\(\.[0-9]\{1,3\}\)\{1,3\}/from/' \ 2827cc426fbSAlan Somers -e 's/ttl=[0-9][0-9]*/ttl=/' \ 2833cde9171SAlan Somers -e 's/hlim=[0-9][0-9]*/hlim=/' \ 2847cc426fbSAlan Somers "$1" >"$1".filtered 2857cc426fbSAlan Somers atf_check -s exit:0 diff -u "$1".filtered "$2" 2867cc426fbSAlan Somers} 287