1. $(atf_get_srcdir)/utils.subr 2 3atf_test_case "hfsc" "cleanup" 4hfsc_head() 5{ 6 atf_set descr 'Basic HFSC test' 7 atf_set require.user root 8} 9 10hfsc_body() 11{ 12 altq_init 13 is_altq_supported hfsc 14 15 epair=$(vnet_mkepair) 16 vnet_mkjail altq_hfsc ${epair}b 17 18 ifconfig ${epair}a 192.0.2.1/24 up 19 jexec altq_hfsc ifconfig ${epair}b 192.0.2.2/24 up 20 21 # Sanity check 22 atf_check -s exit:0 -o ignore ping -i .1 -c 3 -s 1200 192.0.2.2 23 24 jexec altq_hfsc pfctl -e 25 pft_set_rules altq_hfsc \ 26 "altq on ${epair}b bandwidth 100b hfsc queue { default }" \ 27 "queue default hfsc(default linkshare 80b)" \ 28 "pass proto icmp " 29 30 # single ping succeeds just fine 31 atf_check -s exit:0 -o ignore ping -c 1 192.0.2.2 32 33 # "Saturate the link" 34 ping -i .1 -c 5 -s 1200 192.0.2.2 35 36 # We should now be hitting the limits and get this packet dropped. 37 atf_check -s exit:2 -o ignore ping -c 1 -s 1200 192.0.2.2 38} 39 40hfsc_cleanup() 41{ 42 altq_cleanup 43} 44 45atf_test_case "match" "cleanup" 46match_head() 47{ 48 atf_set descr 'Basic match keyword test' 49 atf_set require.user root 50} 51 52match_body() 53{ 54 altq_init 55 is_altq_supported hfsc 56 57 epair=$(vnet_mkepair) 58 vnet_mkjail altq_match ${epair}b 59 60 ifconfig ${epair}a 192.0.2.1/24 up 61 jexec altq_match ifconfig ${epair}b 192.0.2.2/24 up 62 63 # Sanity check 64 atf_check -s exit:0 -o ignore ping -i .1 -c 3 -s 1200 192.0.2.2 65 66 jexec altq_match pfctl -e 67 pft_set_rules altq_match \ 68 "altq on ${epair}b bandwidth 100000000b hfsc queue { default, slow }" \ 69 "queue default hfsc(default linkshare 80000000b)" \ 70 "queue slow hfsc(linkshare 80b upperlimit 80b)" \ 71 "match proto icmp queue slow" \ 72 "pass" 73 74 # single ping succeeds just fine 75 atf_check -s exit:0 -o ignore ping -c 1 192.0.2.2 76 77 # "Saturate the link" 78 ping -i .1 -c 5 -s 1200 192.0.2.2 79 80 # We should now be hitting the limits and get this packet dropped. 81 atf_check -s exit:2 -o ignore ping -c 1 -s 1200 192.0.2.2 82} 83 84match_cleanup() 85{ 86 altq_cleanup 87} 88 89atf_test_case "cbq_vlan" "cleanup" 90cbq_vlan_head() 91{ 92 atf_set descr 'CBQ over VLAN test' 93 atf_set require.user root 94} 95 96cbq_vlan_body() 97{ 98 altq_init 99 is_altq_supported cbq 100 101 epair=$(vnet_mkepair) 102 vnet_mkjail altq_cbq_vlan ${epair}b 103 104 vlan=$(vnet_mkvlan) 105 ifconfig ${vlan} vlan 42 vlandev ${epair}a 106 ifconfig ${vlan} 192.0.2.1/24 up 107 ifconfig ${epair}a up 108 109 vlanj=$(jexec altq_cbq_vlan ifconfig vlan create) 110 echo ${vlanj} >> created_interfaces.lst 111 112 jexec altq_cbq_vlan ifconfig ${epair}b up 113 jexec altq_cbq_vlan ifconfig ${vlanj} vlan 42 vlandev ${epair}b 114 jexec altq_cbq_vlan ifconfig ${vlanj} 192.0.2.2/24 up 115 116 # Sanity check 117 atf_check -s exit:0 -o ignore ping -i .1 -c 3 -s 1200 192.0.2.2 118 119 jexec altq_cbq_vlan pfctl -e 120 pft_set_rules altq_cbq_vlan \ 121 "altq on ${vlanj} bandwidth 14000b cbq queue { default }" \ 122 "queue default bandwidth 14000b cbq(default) { slow } " \ 123 "queue slow bandwidth 6000b cbq(borrow)" \ 124 "match proto icmp queue slow" \ 125 "match proto tcp queue default" \ 126 "pass" 127 128 # single ping succeeds just fine 129 atf_check -s exit:0 -o ignore ping -c 1 192.0.2.2 130 131 # "Saturate the link" 132 ping -i .01 -c 50 -s 1200 192.0.2.2 133 134 # We should now be hitting the limits and get these packet dropped. 135 rcv=$(ping -i .1 -c 5 -s 1200 192.0.2.2 | tr "," "\n" | awk '/packets received/ { print $1; }') 136 echo "Received $rcv packets" 137 if [ ${rcv} -gt 1 ] 138 then 139 atf_fail "Received ${rcv} packets in a saturated link" 140 fi 141} 142 143cbq_vlan_cleanup() 144{ 145 altq_cleanup 146} 147 148atf_test_case "codel_bridge" "cleanup" 149codel_bridge_head() 150{ 151 atf_set descr 'codel over if_bridge test' 152 atf_set require.user root 153} 154 155codel_bridge_body() 156{ 157 altq_init 158 is_altq_supported codel 159 if ! kldstat -q -m if_bridge; then 160 atf_skip "This test requires if_bridge" 161 fi 162 163 epair=$(vnet_mkepair) 164 ifconfig ${epair}a 192.0.2.1/24 up 165 166 vnet_mkjail altq_codel_bridge ${epair}b 167 168 bridge=$(jexec altq_codel_bridge ifconfig bridge create) 169 jexec altq_codel_bridge ifconfig ${bridge} addm ${epair}b 170 jexec altq_codel_bridge ifconfig ${epair}b up 171 jexec altq_codel_bridge ifconfig ${bridge} 192.0.2.2/24 up 172 173 # Sanity check 174 atf_check -s exit:0 -o ignore ping -i .1 -c 3 -s 1200 192.0.2.2 175 176 jexec altq_codel_bridge pfctl -e 177 pft_set_rules altq_codel_bridge \ 178 "altq on ${bridge} bandwidth 1000b codelq queue { slow }" \ 179 "match queue slow" \ 180 "pass" 181 182 # "Saturate the link" 183 ping -i .1 -c 5 -s 1200 192.0.2.2 184 185 # We should now be hitting the limits and get these packet dropped. 186 rcv=$(ping -i .1 -c 5 -s 1200 192.0.2.2 | tr "," "\n" | awk '/packets received/ { print $1; }') 187 echo "Received $rcv packets" 188 if [ ${rcv} -gt 1 ] 189 then 190 atf_fail "Received ${rcv} packets in a saturated link" 191 fi 192} 193 194codel_bridge_cleanup() 195{ 196 altq_cleanup 197} 198 199atf_test_case "prioritise" "cleanup" 200prioritise_head() 201{ 202 atf_set descr "Test prioritising one type of traffic over the other" 203 atf_set require.user root 204} 205 206prioritise_body() 207{ 208 altq_init 209 is_altq_supported cbq 210 211 epair=$(vnet_mkepair) 212 vnet_mkjail altq_prioritise ${epair}b 213 214 ifconfig ${epair}a 192.0.2.1/24 up 215 jexec altq_prioritise ifconfig ${epair}b 192.0.2.2/24 up 216 217 jexec altq_prioritise /usr/sbin/inetd -p inetd-altq.pid \ 218 $(atf_get_srcdir)/../pf/echo_inetd.conf 219 220 # Sanity check 221 atf_check -s exit:0 -o ignore ping -i .1 -c 3 -s 1200 192.0.2.2 222 223 jexec altq_prioritise pfctl -e 224 pft_set_rules altq_prioritise \ 225 "altq on ${epair}b bandwidth 6000b cbq queue { default, slow }" \ 226 "queue default priority 7 cbq(default)" \ 227 "queue slow priority 1 cbq" \ 228 "match proto icmp queue slow" \ 229 "match proto tcp queue default" \ 230 "pass" 231 232 # single ping succeeds just fine 233 atf_check -s exit:0 -o ignore ping -c 1 192.0.2.2 234 235 # Unsaturated TCP succeeds 236 reply=$(echo "foo" | nc -w 5 -N 192.0.2.2 7) 237 if [ "$reply" != "foo" ]; 238 then 239 atf_fail "Unsaturated echo failed" 240 fi 241 242 # "Saturate the link" 243 ping -i .01 -c 50 -s 1200 192.0.2.2 244 245 # We should now be hitting the limits and get these packet dropped. 246 rcv=$(ping -i .1 -c 5 -s 1200 192.0.2.2 | tr "," "\n" | awk '/packets received/ { print $1; }') 247 echo "Received $rcv packets" 248 if [ ${rcv} -gt 1 ] 249 then 250 atf_fail "Received ${rcv} packets in a saturated link" 251 fi 252 253 # TCP should still pass 254 for i in `seq 1 10` 255 do 256 reply=$(echo "foo_${i}" | nc -w 5 -N 192.0.2.2 7) 257 if [ "$reply" != "foo_${i}" ]; 258 then 259 atf_fail "Prioritised echo failed ${i}" 260 fi 261 262 done 263 264 # Now reverse priority 265 pft_set_rules altq_prioritise \ 266 "altq on ${epair}b bandwidth 6000b cbq queue { default, slow }" \ 267 "queue default priority 7 cbq(default)" \ 268 "queue slow priority 1 cbq" \ 269 "match proto tcp queue slow" \ 270 "match proto icmp queue default" \ 271 "pass" 272 273 atf_check -s exit:0 -o ignore ping -c 1 192.0.2.2 274 ping -i .01 -c 50 -s 1200 192.0.2.2 275 for i in `seq 1 10` 276 do 277 reply=$(echo "foo_${i}" | nc -w 5 -N 192.0.2.2 7) 278 if [ "$reply" == "foo_${i}" ]; 279 then 280 atf_fail "Unexpected echo success" 281 fi 282 283 done 284} 285 286prioritise_cleanup() 287{ 288 altq_cleanup 289} 290 291atf_init_test_cases() 292{ 293 atf_add_test_case "hfsc" 294 atf_add_test_case "match" 295 atf_add_test_case "cbq_vlan" 296 atf_add_test_case "codel_bridge" 297 atf_add_test_case "prioritise" 298} 299