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

Reply via email to