diff --git a/src/iperf3.zig b/src/iperf3.zig index d53068d..7bdd523 100644 --- a/src/iperf3.zig +++ b/src/iperf3.zig @@ -49,6 +49,12 @@ pub const IPerfReturn = struct { seconds: f128, bytes: u64, bits_per_second: f128, + retransmits: ?u64 = null, + snd_cwnd: ?u64 = null, + snd_wnd: ?u64 = null, + rtt: ?u64 = null, + rttvar: ?u64 = null, + pmtu: ?u64 = null, omitted: bool, sender: bool, }, @@ -58,6 +64,7 @@ pub const IPerfReturn = struct { seconds: f128, bytes: u64, bits_per_second: f128, + retransmits: ?u64 = null, omitted: bool, sender: bool, }, @@ -71,6 +78,12 @@ pub const IPerfReturn = struct { seconds: f128, bytes: u64, bits_per_second: f128, + retransmits: ?u64 = null, + max_snd_cwnd: ?u64 = null, + max_snd_wnd: ?u64 = null, + max_rtt: ?u64 = null, + min_rtt: ?u64 = null, + mean_rtt: ?u64 = null, sender: bool, }, receiver: struct { @@ -89,6 +102,7 @@ pub const IPerfReturn = struct { seconds: f128, bytes: u64, bits_per_second: f128, + retransmits: ?u64 = null, sender: bool, } = null, sum_received: ?struct { @@ -108,17 +122,43 @@ pub const IPerfReturn = struct { remote_system: f128, } = null, receiver_tcp_congestion: ?[]const u8 = null, + sender_tcp_congestion: ?[]const u8 = null, }, @"error": ?[]const u8 = null, }; -test "test-normal" { - const input = @embedFile("test/test-normal.json"); - const result = try std.json.parseFromSlice(IPerfReturn, std.testing.allocator, input, .{}); +test "test-receiver-1" { + const input = @embedFile("test/test-receiver-1.json"); + const result = try std.json.parseFromSlice( + IPerfReturn, + std.testing.allocator, + input, + .{}, + ); + defer result.deinit(); + try std.testing.expect(result.value.@"error" == null); +} + +test "test-receiver-2" { + const input = @embedFile("test/test-receiver-2.json"); + const result = try std.json.parseFromSlice( + IPerfReturn, + std.testing.allocator, + input, + .{}, + ); + defer result.deinit(); + try std.testing.expect(result.value.@"error" == null); +} + +test "test-sender-1" { + const input = @embedFile("test/test-sender-1.json"); + const result = try std.json.parseFromSlice( + IPerfReturn, + std.testing.allocator, + input, + .{}, + ); defer result.deinit(); - // std.debug.print("{}\n", .{result.value}); - // const test_output = try std.fs.cwd().createFile("test.json", .{}); - // try std.json.stringify(result.value, .{}, test_output.writer()); - // test_output.close(); try std.testing.expect(result.value.@"error" == null); } diff --git a/src/test/test-normal.json b/src/test/test-receiver-1.json similarity index 100% rename from src/test/test-normal.json rename to src/test/test-receiver-1.json diff --git a/src/test/test-receiver-2.json b/src/test/test-receiver-2.json new file mode 100644 index 0000000..c766683 --- /dev/null +++ b/src/test/test-receiver-2.json @@ -0,0 +1,310 @@ +{ + "start": { + "connected": [{ + "socket": 5, + "local_host": "127.0.0.1", + "local_port": 5201, + "remote_host": "127.0.0.1", + "remote_port": 43398 + }], + "version": "iperf 3.14", + "system_info": "Linux localhost 6.5.5 #1-NixOS SMP PREEMPT_DYNAMIC Sat Sep 23 09:14:39 UTC 2023 x86_64", + "sock_bufsize": 0, + "sndbuf_actual": 16384, + "rcvbuf_actual": 131072, + "timestamp": { + "time": "Sun, 15 Oct 2023 04:15:59 GMT", + "timesecs": 1697343359 + }, + "accepted_connection": { + "host": "127.0.0.1", + "port": 43384 + }, + "cookie": "qrmdwiyjmzfojrcbndv2ek6wwjv6ewafzw2n", + "tcp_mss_default": 0, + "target_bitrate": 0, + "fq_rate": 0, + "test_start": { + "protocol": "TCP", + "num_streams": 1, + "blksize": 131072, + "omit": 0, + "duration": 10, + "bytes": 0, + "blocks": 0, + "reverse": 0, + "tos": 0, + "target_bitrate": 0, + "bidir": 0, + "fqrate": 0 + } + }, + "intervals": [{ + "streams": [{ + "socket": 5, + "start": 0, + "end": 1.000018, + "seconds": 1.0000180006027222, + "bytes": 7176519627, + "bits_per_second": 57411123581.172585, + "omitted": false, + "sender": false + }], + "sum": { + "start": 0, + "end": 1.000018, + "seconds": 1.0000180006027222, + "bytes": 7176519627, + "bits_per_second": 57411123581.172585, + "omitted": false, + "sender": false + } + }, { + "streams": [{ + "socket": 5, + "start": 1.000018, + "end": 2.000009, + "seconds": 0.999990999698639, + "bytes": 7434141696, + "bits_per_second": 59473668848.942688, + "omitted": false, + "sender": false + }], + "sum": { + "start": 1.000018, + "end": 2.000009, + "seconds": 0.999990999698639, + "bytes": 7434141696, + "bits_per_second": 59473668848.942688, + "omitted": false, + "sender": false + } + }, { + "streams": [{ + "socket": 5, + "start": 2.000009, + "end": 3.000004, + "seconds": 0.999994993209839, + "bytes": 7413039104, + "bits_per_second": 59304609757.736649, + "omitted": false, + "sender": false + }], + "sum": { + "start": 2.000009, + "end": 3.000004, + "seconds": 0.999994993209839, + "bytes": 7413039104, + "bits_per_second": 59304609757.736649, + "omitted": false, + "sender": false + } + }, { + "streams": [{ + "socket": 5, + "start": 3.000004, + "end": 4.000004, + "seconds": 1, + "bytes": 7397703680, + "bits_per_second": 59181629440, + "omitted": false, + "sender": false + }], + "sum": { + "start": 3.000004, + "end": 4.000004, + "seconds": 1, + "bytes": 7397703680, + "bits_per_second": 59181629440, + "omitted": false, + "sender": false + } + }, { + "streams": [{ + "socket": 5, + "start": 4.000004, + "end": 5.000017, + "seconds": 1.000012993812561, + "bytes": 7376601088, + "bits_per_second": 59012041912.588547, + "omitted": false, + "sender": false + }], + "sum": { + "start": 4.000004, + "end": 5.000017, + "seconds": 1.000012993812561, + "bytes": 7376601088, + "bits_per_second": 59012041912.588547, + "omitted": false, + "sender": false + } + }, { + "streams": [{ + "socket": 5, + "start": 5.000017, + "end": 6.000006, + "seconds": 0.99998897314071655, + "bytes": 7419592704, + "bits_per_second": 59357396157.654861, + "omitted": false, + "sender": false + }], + "sum": { + "start": 5.000017, + "end": 6.000006, + "seconds": 0.99998897314071655, + "bytes": 7419592704, + "bits_per_second": 59357396157.654861, + "omitted": false, + "sender": false + } + }, { + "streams": [{ + "socket": 5, + "start": 6.000006, + "end": 7.000011, + "seconds": 1.0000050067901611, + "bytes": 7421427712, + "bits_per_second": 59371124437.238312, + "omitted": false, + "sender": false + }], + "sum": { + "start": 6.000006, + "end": 7.000011, + "seconds": 1.0000050067901611, + "bytes": 7421427712, + "bits_per_second": 59371124437.238312, + "omitted": false, + "sender": false + } + }, { + "streams": [{ + "socket": 5, + "start": 7.000011, + "end": 8.000006, + "seconds": 0.999994993209839, + "bytes": 7382106112, + "bits_per_second": 59057144582.730438, + "omitted": false, + "sender": false + }], + "sum": { + "start": 7.000011, + "end": 8.000006, + "seconds": 0.999994993209839, + "bytes": 7382106112, + "bits_per_second": 59057144582.730438, + "omitted": false, + "sender": false + } + }, { + "streams": [{ + "socket": 5, + "start": 8.000006, + "end": 9.000014, + "seconds": 1.0000079870224, + "bytes": 7378567168, + "bits_per_second": 59028065885.515549, + "omitted": false, + "sender": false + }], + "sum": { + "start": 8.000006, + "end": 9.000014, + "seconds": 1.0000079870224, + "bytes": 7378567168, + "bits_per_second": 59028065885.515549, + "omitted": false, + "sender": false + } + }, { + "streams": [{ + "socket": 5, + "start": 9.000014, + "end": 10.000021, + "seconds": 1.0000070333480835, + "bytes": 7368278069, + "bits_per_second": 58945809965.600449, + "omitted": false, + "sender": false + }], + "sum": { + "start": 9.000014, + "end": 10.000021, + "seconds": 1.0000070333480835, + "bytes": 7368278069, + "bits_per_second": 58945809965.600449, + "omitted": false, + "sender": false + } + }, { + "streams": [{ + "socket": 5, + "start": 10.000021, + "end": 10.000122, + "seconds": 0.00010099999781232327, + "bytes": 655360, + "bits_per_second": 51909704094.669815, + "omitted": false, + "sender": false + }], + "sum": { + "start": 10.000021, + "end": 10.000122, + "seconds": 0.00010099999781232327, + "bytes": 655360, + "bits_per_second": 51909704094.669815, + "omitted": false, + "sender": false + } + }], + "end": { + "streams": [{ + "sender": { + "socket": 5, + "start": 0, + "end": 10.000122, + "seconds": 10.000122, + "bytes": 0, + "bits_per_second": 0, + "sender": false + }, + "receiver": { + "socket": 5, + "start": 0, + "end": 10.000122, + "seconds": 10.000122, + "bytes": 73768632320, + "bits_per_second": 59014185882.932236, + "sender": false + } + }], + "sum_sent": { + "start": 0, + "end": 10.000122, + "seconds": 10.000122, + "bytes": 0, + "bits_per_second": 0, + "sender": false + }, + "sum_received": { + "start": 0, + "end": 10.000122, + "seconds": 10.000122, + "bytes": 73768632320, + "bits_per_second": 59014185882.932236, + "sender": false + }, + "cpu_utilization_percent": { + "host_total": 88.9689744343579, + "host_user": 3.04800732789741, + "host_system": 85.9209771063205, + "remote_total": 0, + "remote_user": 0, + "remote_system": 0 + }, + "receiver_tcp_congestion": "cubic" + } +} diff --git a/src/test/test-sender-1.json b/src/test/test-sender-1.json new file mode 100644 index 0000000..ce5cb59 --- /dev/null +++ b/src/test/test-sender-1.json @@ -0,0 +1,367 @@ +{ + "start": { + "connected": [{ + "socket": 5, + "local_host": "127.0.0.1", + "local_port": 5201, + "remote_host": "127.0.0.1", + "remote_port": 53792 + }], + "version": "iperf 3.14", + "system_info": "Linux localhost 6.5.5 #1-NixOS SMP PREEMPT_DYNAMIC Sat Sep 23 09:14:39 UTC 2023 x86_64", + "sock_bufsize": 0, + "sndbuf_actual": 16384, + "rcvbuf_actual": 131072, + "timestamp": { + "time": "Sun, 15 Oct 2023 04:15:28 GMT", + "timesecs": 1697343328 + }, + "accepted_connection": { + "host": "127.0.0.1", + "port": 53780 + }, + "cookie": "dwrtd4tteunw6ixmyqwigqrn6axjjesxiavl", + "tcp_mss_default": 0, + "target_bitrate": 0, + "fq_rate": 0, + "test_start": { + "protocol": "TCP", + "num_streams": 1, + "blksize": 131072, + "omit": 0, + "duration": 10, + "bytes": 0, + "blocks": 0, + "reverse": 1, + "tos": 0, + "target_bitrate": 0, + "bidir": 0, + "fqrate": 0 + } + }, + "intervals": [{ + "streams": [{ + "socket": 5, + "start": 0, + "end": 1.000502, + "seconds": 1.0005019903182983, + "bytes": 7434403840, + "bits_per_second": 59445389709.898163, + "retransmits": 0, + "snd_cwnd": 1113211, + "snd_wnd": 3144704, + "rtt": 21, + "rttvar": 6, + "pmtu": 65535, + "omitted": false, + "sender": true + }], + "sum": { + "start": 0, + "end": 1.000502, + "seconds": 1.0005019903182983, + "bytes": 7434403840, + "bits_per_second": 59445389709.898163, + "retransmits": 0, + "omitted": false, + "sender": true + } + }, { + "streams": [{ + "socket": 5, + "start": 1.000502, + "end": 2.000387, + "seconds": 0.99988502264022827, + "bytes": 6927155200, + "bits_per_second": 55423614060.813721, + "retransmits": 0, + "snd_cwnd": 1113211, + "snd_wnd": 3145216, + "rtt": 32, + "rttvar": 1, + "pmtu": 65535, + "omitted": false, + "sender": true + }], + "sum": { + "start": 1.000502, + "end": 2.000387, + "seconds": 0.99988502264022827, + "bytes": 6927155200, + "bits_per_second": 55423614060.813721, + "retransmits": 0, + "omitted": false, + "sender": true + } + }, { + "streams": [{ + "socket": 5, + "start": 2.000387, + "end": 3.000241, + "seconds": 0.999854028224945, + "bytes": 6613893120, + "bits_per_second": 52918869621.332527, + "retransmits": 0, + "snd_cwnd": 1113211, + "snd_wnd": 3145216, + "rtt": 31, + "rttvar": 3, + "pmtu": 65535, + "omitted": false, + "sender": true + }], + "sum": { + "start": 2.000387, + "end": 3.000241, + "seconds": 0.999854028224945, + "bytes": 6613893120, + "bits_per_second": 52918869621.332527, + "retransmits": 0, + "omitted": false, + "sender": true + } + }, { + "streams": [{ + "socket": 5, + "start": 3.000241, + "end": 4.000234, + "seconds": 0.99999302625656128, + "bytes": 7197163520, + "bits_per_second": 57577709692.175186, + "retransmits": 0, + "snd_cwnd": 1178694, + "snd_wnd": 3145216, + "rtt": 22, + "rttvar": 5, + "pmtu": 65535, + "omitted": false, + "sender": true + }], + "sum": { + "start": 3.000241, + "end": 4.000234, + "seconds": 0.99999302625656128, + "bytes": 7197163520, + "bits_per_second": 57577709692.175186, + "retransmits": 0, + "omitted": false, + "sender": true + } + }, { + "streams": [{ + "socket": 5, + "start": 4.000234, + "end": 5.000321, + "seconds": 1.0000870227813721, + "bytes": 7333478400, + "bits_per_second": 58662722206.7507, + "retransmits": 0, + "snd_cwnd": 1309660, + "snd_wnd": 3145216, + "rtt": 25, + "rttvar": 4, + "pmtu": 65535, + "omitted": false, + "sender": true + }], + "sum": { + "start": 4.000234, + "end": 5.000321, + "seconds": 1.0000870227813721, + "bytes": 7333478400, + "bits_per_second": 58662722206.7507, + "retransmits": 0, + "omitted": false, + "sender": true + } + }, { + "streams": [{ + "socket": 5, + "start": 5.000321, + "end": 6.000227, + "seconds": 0.99990600347518921, + "bytes": 7186677760, + "bits_per_second": 57498826769.897064, + "retransmits": 0, + "snd_cwnd": 1309660, + "snd_wnd": 3145216, + "rtt": 25, + "rttvar": 3, + "pmtu": 65535, + "omitted": false, + "sender": true + }], + "sum": { + "start": 5.000321, + "end": 6.000227, + "seconds": 0.99990600347518921, + "bytes": 7186677760, + "bits_per_second": 57498826769.897064, + "retransmits": 0, + "omitted": false, + "sender": true + } + }, { + "streams": [{ + "socket": 5, + "start": 6.000227, + "end": 7.000188, + "seconds": 0.999961018562317, + "bytes": 7287603200, + "bits_per_second": 58303098338.59462, + "retransmits": 0, + "snd_cwnd": 1375143, + "snd_wnd": 3145216, + "rtt": 25, + "rttvar": 4, + "pmtu": 65535, + "omitted": false, + "sender": true + }], + "sum": { + "start": 6.000227, + "end": 7.000188, + "seconds": 0.999961018562317, + "bytes": 7287603200, + "bits_per_second": 58303098338.59462, + "retransmits": 0, + "omitted": false, + "sender": true + } + }, { + "streams": [{ + "socket": 5, + "start": 7.000188, + "end": 8.000201, + "seconds": 1.000012993812561, + "bytes": 6805258240, + "bits_per_second": 54441358519.191833, + "retransmits": 0, + "snd_cwnd": 1899007, + "snd_wnd": 3145216, + "rtt": 30, + "rttvar": 2, + "pmtu": 65535, + "omitted": false, + "sender": true + }], + "sum": { + "start": 7.000188, + "end": 8.000201, + "seconds": 1.000012993812561, + "bytes": 6805258240, + "bits_per_second": 54441358519.191833, + "retransmits": 0, + "omitted": false, + "sender": true + } + }, { + "streams": [{ + "socket": 5, + "start": 8.000201, + "end": 9.000234, + "seconds": 1.0000330209732056, + "bytes": 6675496960, + "bits_per_second": 53402212286.978951, + "retransmits": 0, + "snd_cwnd": 1899007, + "snd_wnd": 3145216, + "rtt": 29, + "rttvar": 2, + "pmtu": 65535, + "omitted": false, + "sender": true + }], + "sum": { + "start": 8.000201, + "end": 9.000234, + "seconds": 1.0000330209732056, + "bytes": 6675496960, + "bits_per_second": 53402212286.978951, + "retransmits": 0, + "omitted": false, + "sender": true + } + }, { + "streams": [{ + "socket": 5, + "start": 9.000234, + "end": 10.000062, + "seconds": 0.99982798099517822, + "bytes": 6758072320, + "bits_per_second": 54073880295.0752, + "retransmits": 0, + "snd_cwnd": 1899007, + "snd_wnd": 3145216, + "rtt": 27, + "rttvar": 1, + "pmtu": 65535, + "omitted": false, + "sender": true + }], + "sum": { + "start": 9.000234, + "end": 10.000062, + "seconds": 0.99982798099517822, + "bytes": 6758072320, + "bits_per_second": 54073880295.0752, + "retransmits": 0, + "omitted": false, + "sender": true + } + }], + "end": { + "streams": [{ + "sender": { + "socket": 5, + "start": 0, + "end": 10.000062, + "seconds": 10.000062, + "bytes": 70219202560, + "bits_per_second": 56175013762.914673, + "retransmits": 0, + "max_snd_cwnd": 1899007, + "max_snd_wnd": 3145216, + "max_rtt": 32, + "min_rtt": 21, + "mean_rtt": 26, + "sender": true + }, + "receiver": { + "socket": 5, + "start": 0, + "end": 10.000062, + "seconds": 10.000062, + "bytes": 0, + "bits_per_second": 0, + "sender": true + } + }], + "sum_sent": { + "start": 0, + "end": 10.000062, + "seconds": 10.000062, + "bytes": 70219202560, + "bits_per_second": 56175013762.914673, + "retransmits": 0, + "sender": true + }, + "sum_received": { + "start": 0, + "end": 10.000062, + "seconds": 10.000062, + "bytes": 0, + "bits_per_second": 0, + "sender": true + }, + "cpu_utilization_percent": { + "host_total": 99.994360043427662, + "host_user": 1.1998407612261386, + "host_system": 98.794509282278526, + "remote_total": 0, + "remote_user": 0, + "remote_system": 0 + }, + "sender_tcp_congestion": "cubic" + } +}