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 160 epair=$(vnet_mkepair) 161 ifconfig ${epair}a 192.0.2.1/24 up 162 163 vnet_mkjail altq_codel_bridge ${epair}b 164 165 bridge=$(jexec altq_codel_bridge ifconfig bridge create) 166 jexec altq_codel_bridge ifconfig ${bridge} addm ${epair}b 167 jexec altq_codel_bridge ifconfig ${epair}b up 168 jexec altq_codel_bridge ifconfig ${bridge} 192.0.2.2/24 up 169 170 # Sanity check 171 atf_check -s exit:0 -o ignore ping -i .1 -c 3 -s 1200 192.0.2.2 172 173 jexec altq_codel_bridge pfctl -e 174 pft_set_rules altq_codel_bridge \ 175 "altq on ${bridge} bandwidth 1000b codelq queue { slow }" \ 176 "match queue slow" \ 177 "pass" 178 179 # "Saturate the link" 180 ping -i .1 -c 5 -s 1200 192.0.2.2 181 182 # We should now be hitting the limits and get these packet dropped. 183 rcv=$(ping -i .1 -c 5 -s 1200 192.0.2.2 | tr "," "\n" | awk '/packets received/ { print $1; }') 184 echo "Received $rcv packets" 185 if [ ${rcv} -gt 1 ] 186 then 187 atf_fail "Received ${rcv} packets in a saturated link" 188 fi 189} 190 191codel_bridge_cleanup() 192{ 193 altq_cleanup 194} 195 196atf_test_case "prioritise" "cleanup" 197prioritise_head() 198{ 199 atf_set descr "Test prioritising one type of traffic over the other" 200 atf_set require.user root 201} 202 203prioritise_body() 204{ 205 altq_init 206 is_altq_supported cbq 207 208 epair=$(vnet_mkepair) 209 vnet_mkjail altq_prioritise ${epair}b 210 211 ifconfig ${epair}a 192.0.2.1/24 up 212 jexec altq_prioritise ifconfig ${epair}b 192.0.2.2/24 up 213 214 jexec altq_prioritise /usr/sbin/inetd -p inetd-altq.pid \ 215 $(atf_get_srcdir)/../pf/echo_inetd.conf 216 217 # Sanity check 218 atf_check -s exit:0 -o ignore ping -i .1 -c 3 -s 1200 192.0.2.2 219 220 jexec altq_prioritise pfctl -e 221 pft_set_rules altq_prioritise \ 222 "altq on ${epair}b bandwidth 6000b cbq queue { default, slow }" \ 223 "queue default priority 7 cbq(default)" \ 224 "queue slow priority 1 cbq" \ 225 "match proto icmp queue slow" \ 226 "match proto tcp queue default" \ 227 "pass" 228 229 # single ping succeeds just fine 230 atf_check -s exit:0 -o ignore ping -c 1 192.0.2.2 231 232 # Unsaturated TCP succeeds 233 reply=$(echo "foo" | nc -w 5 -N 192.0.2.2 7) 234 if [ "$reply" != "foo" ]; 235 then 236 atf_fail "Unsaturated echo failed" 237 fi 238 239 # "Saturate the link" 240 ping -i .01 -c 50 -s 1200 192.0.2.2 241 242 # We should now be hitting the limits and get these packet dropped. 243 rcv=$(ping -i .1 -c 5 -s 1200 192.0.2.2 | tr "," "\n" | awk '/packets received/ { print $1; }') 244 echo "Received $rcv packets" 245 if [ ${rcv} -gt 1 ] 246 then 247 atf_fail "Received ${rcv} packets in a saturated link" 248 fi 249 250 # TCP should still pass 251 for i in `seq 1 10` 252 do 253 reply=$(echo "foo_${i}" | nc -w 5 -N 192.0.2.2 7) 254 if [ "$reply" != "foo_${i}" ]; 255 then 256 atf_fail "Prioritised echo failed ${i}" 257 fi 258 259 done 260 261 # Now reverse priority 262 pft_set_rules altq_prioritise \ 263 "altq on ${epair}b bandwidth 6000b cbq queue { default, slow }" \ 264 "queue default priority 7 cbq(default)" \ 265 "queue slow priority 1 cbq" \ 266 "match proto tcp queue slow" \ 267 "match proto icmp queue default" \ 268 "pass" 269 270 atf_check -s exit:0 -o ignore ping -c 1 192.0.2.2 271 ping -i .01 -c 50 -s 1200 192.0.2.2 272 for i in `seq 1 10` 273 do 274 reply=$(echo "foo_${i}" | nc -w 5 -N 192.0.2.2 7) 275 if [ "$reply" == "foo_${i}" ]; 276 then 277 atf_fail "Unexpected echo success" 278 fi 279 280 done 281} 282 283prioritise_cleanup() 284{ 285 altq_cleanup 286} 287 288atf_init_test_cases() 289{ 290 atf_add_test_case "hfsc" 291 atf_add_test_case "match" 292 atf_add_test_case "cbq_vlan" 293 atf_add_test_case "codel_bridge" 294 atf_add_test_case "prioritise" 295} 296