Thanks for your patience...some late nights and mornings this week :) but the
initial revision is pushed: https://github.com/peteheist/irtt
I'm not posting pre-built binaries yet, if ever. Let me know if you'd like that
and I'll see, but so far you have to install Go 1.9.1 (https://golang.org/dl/)
and you should be able to download and install it with:
go install github.com/peteheist/irtt/cmd/irtt
build.sh can be used for various things, to cross-compile to a few platforms,
strip symbols, etc. (Sure, I could have a Makefile, but there's also a
reasonable argument from some of Go's core developers that Makefiles can be
overkill for Go's build commands, especially for small projects.)
It's totally undocumented so far, save the usage. So I'll be working on that
this weekend along with testing / bugs / whatever else I can get done. If
anyone gets a chance to try it before this Wednesday, I could try to nail any
show stoppers before my old man's in town, which will slow things down for 10
days.
I'm also trying to ascertain if this project is still needed given the iperf2
changes, so if not, let me know, no hard feelings and I'll save some time. :)
Some recent changes:
- Added "handshake" and test parameter negotiation. The client tells the server
what it wants, the server tells the client what it'll actually get, and they
agree on a fixed packet format, which minimizes the packet size based on the
selected options. (Dave was right that this is a real PITA to take too far,
taking OWAMP as an example, but at least it should be helpful for users that
they don't try running a test that will exceed the server's minimum interval or
duration.)
- Added hard restrictions on server to enforce minimal interval and test
duration. It's a token bucket-ey like thing with burst, but I want to get
smarter on rate limiting options in general.
- Re-organized / improved JSON output per Toke's great feedback. Must document.
- Re-wrote packet buffer manipulation code. It's pretty performant, but not as
maintainable as I'd like, so will probably end up re-writing it again.
- Added subcommands to the executable as the usage was getting out of hand. So
you now need to do "irtt server" or "irtt client" for example to run the server
or client.
- Added some utility subcommands: "bench" to test HMAC and fill performance,
"clock" to test wall vs monotonic clock and "sleep" to test sleep accuracy.
- Added a basic out-of-order packet metric (late packets, meaning a seqno
arrives with a number lower than the seqno of the previous arrival).
- Added context.Context support for proper cancellation.
- Optimized pattern fill to make it pretty much equivalent to Go's copy
builtin. Performance can be tested with "irtt bench" but it has great
performance particularly what buffers get larger.
- As a security measure, made "pattern fill" on the server the default. I think
it should prevent on-path attackers from reflecting traffic to arbitrary
addresses.
- Added a -thread option to client and server to lock packet handling
Goroutines to OS threads, although this is off by default. Need to test that
more if it does anything useful.
- Squashed some bugs, did some basic load testing and nailed what hopefully
were the only two race conditions (thank you Go's race detector).
There's so much in my TODO list I won't list everything, but for starters:
- Docs.
- Implement received packets feedback from the server. I'm planning a total
count along with 64-bit bitfield of receipt status of previous 64 seqnos) to
get a decent per-packet estimate of upstream / downstream loss.
- Add server bitrate limiting.
- Allow specifying two out of three of interval, bitrate and packet length to
the client (Toke's idea).
- Add more server limiting and protection, like per-IP limits and new
connection rate limits so someone doesn't just flood the server with new
connection requests.
- Make server initiated close more robust, instead of a single packet to the
client, which could be lost.
- Maybe redo my event logging (you'll see lines prefixed with [tag] from both
client and server...). I've hemmed and hawed over this several times but am
still not satisfied for various reasons.
- Add an optional auth mode to negotiate an HMAC key using (probably NaCl's)
public / private key encryption, providing more protection against on-path
attacks.
- Add a subcommand to produce CSV from JSON.
- Add ability for client to request random fill from server (server may deny).
- Show IPDV in client's verbose output.
- Use Go's "unsafe" package for faster packet buffer manipulation, although it
really might be good enough, and we might rather want to feel "safe", so I'll
see after more profiling.
- Timerfd?
- Non-isochronous send schedules? I'm listening about the videoconferencing
traffic idea Dave, just need to figure out how to make it work.
- Zero downtime restarts.
4am and time to quit. We can continue discussion in the IRTT repo...
Thanks again both for your kind help and feedback on this. I hope it's useful,
and if not, it sure was fun anyway!
--
You are receiving this because you are subscribed to this thread.
Reply to this email directly or view it on GitHub:
https://github.com/tohojo/flent/issues/106#issuecomment-336603091
_______________________________________________
Flent-users mailing list
Flent-users@flent.org
http://flent.org/mailman/listinfo/flent-users_flent.org