Simulating out of order packets on OS X

I needed a way to simulate out of order packets in order to try to reproduce an issue I’ve been seeing at work, and I figured out a fairly simple way that only involves ipfw which is built-in on 10.9 but unfortunately has been removed in 10.10. The same technique should be adaptable to pfctl though.

Step 1 – Creating a pipe

To be able to simulate out of order packets, you must create a pipe in ipfw with a rule that matches the traffic you’re trying to affect.

sudo ipfw add 1 pipe 1 ip from <host> to me

You must create another pipe if you want to affect traffic in the opposite direction.

sudo ipfw add 2 pipe 1 ip from me to <host>

Step 2 – Simulate out of order packets

ipfw lets you set a bunch of config options on traffic flowing through a pipe. You can limit the amount of bandwidth with bw <speed>, packet loss with plr <rate>, and latency with delay <time>.

So to simulate 1 second latency, we would run:

sudo ipfw pipe 1 config delay 1s

However, this doesn’t simulate out of order packets by itself. You can simulate packet loss which can induce out of order packets with:

sudo ipfw pipe 1 config plr 0.05 # 5% packet loss

But I believe I found a better solution (IMO) by constantly setting the delay to random values every couple of milliseconds.

1
sudo ruby -e "loop { \\`ipfw pipe 1 config delay #{rand(500) + 100}ms\\`; sleep 0.01 }"

where the delay is randomly set to (0-500) + 100ms every 10ms.

Step 3 – Clean up

Once you’re done with your testing, be sure to remove the rules.

sudo ipfw del 1

Conclusion

This worked well enough for me, and I hope it helps you too. If someone figures out how to do this with pfctl on 10.10, please let me know!

Comments