Giter Site home page Giter Site logo

quic-tracker / quic-tracker Goto Github PK

View Code? Open in Web Editor NEW
74.0 9.0 16.0 768 KB

A test suite for QUIC

Home Page: https://quic-tracker.info.ucl.ac.be

License: GNU Affero General Public License v3.0

Go 99.61% Dockerfile 0.39%
quic ietf test-suite tests

quic-tracker's Introduction

A test suite for QUIC

Documentation status

The test suite comprises a minimal Go implementation of QUIC which is currently draft-29 and TLS-1.3 compatible, as well as several test scenarii built upon this implementation. The test suite outputs its result as JSON files, which contains the result, the decrypted packets exchanged, as well as a pcap file and exporter secrets.

Installation

You should have Go 1.9, tcpdump, libpcap libraries and headers as well as openssl headers installed before starting.

go get -u github.com/QUIC-Tracker/quic-tracker  # This will fail because of the missing dependencies that should be build using the 4 lines below
cd $GOPATH/src/github.com/mpiraux/pigotls
make
cd $GOPATH/src/github.com/mpiraux/ls-qpack-go
make

The test suite is run using the scripts in bin/test_suite/. For help about their usage see:

go run bin/test_suite/scenario_runner.go -h
go run bin/test_suite/test_suite.go -h

Docker

Docker builds exist on Docker Hub.

docker run --network="host" mpiraux/quictracker /http_get -h
docker run --network="host" mpiraux/quictracker /scenario_runner -h
docker run --network="host" mpiraux/quictracker /test_suite -h
# Running the web app and mounting traces files from the current directory
docker run -v "$PWD:/traces" -p 5000:5000 mpiraux/quictracker flask run -h 0.0.0.0

quic-tracker's People

Contributors

dtikhonov avatar francoismichel avatar ghedo avatar haproxyfred avatar matejracek avatar mpiraux avatar piano-man avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

quic-tracker's Issues

Support for different SCID length

Since the initial packet can contain SCIDs of different lengths, it could be interesting to have tests with different values of the SCID length to check that remote servers can process connections from any SCID.

It could also be interesting to provide a plot of the ID length of the different servers

Possible issue in the initial ClientHello packet

When I try to use quic-tracker with a mozilla/neqo server, the handshake never completes and the server runs into an error. I raised the issue with the developers of neqo and according to them, the client is not behaving in the appropriate manner. I'm attaching a link to the issue for reference :-

mozilla/neqo#555 (comment)

Quic Tracker's status

Hello,

I am working on a project based on QUIC and I am interested in the project you've developed.

It came to my attention that the test suite website is not reachable anymore and the project was not updated for more than a year.

Could you please give me a continuation status about the test suite web page and the project in general?

Thank you.

zero_rtt test case against devqa.akaquic.com:443 is occasionally crashing on SIGSEGV

`[44d1209ef7cdd38e/QLogAgent] base_agent.go:49: Agent started
[44d1209ef7cdd38e/SocketAgent] base_agent.go:49: Agent started
[44d1209ef7cdd38e/ParsingAgent] base_agent.go:49: Agent started
[44d1209ef7cdd38e/BufferAgent] base_agent.go:49: Agent started
[44d1209ef7cdd38e/TLSAgent] base_agent.go:49: Agent started
[44d1209ef7cdd38e/AckAgent] base_agent.go:49: Agent started
[44d1209ef7cdd38e/SendingAgent] base_agent.go:49: Agent started
[44d1209ef7cdd38e/RecoveryAgent] base_agent.go:49: Agent started
[44d1209ef7cdd38e/RTTAgent] base_agent.go:49: Agent started
[44d1209ef7cdd38e/FrameQueueAgent] base_agent.go:49: Agent started
[44d1209ef7cdd38e/FlowControlAgent] base_agent.go:49: Agent started
[44d1209ef7cdd38e/StreamAgent] base_agent.go:49: Agent started
[44d1209ef7cdd38e/ClosingAgent] base_agent.go:49: Agent started
[44d1209ef7cdd38e/HandshakeAgent] base_agent.go:49: Agent started
[44d1209ef7cdd38e/HandshakeAgent] handshake_agent.go:59: Sending first Initial packet
[CID 44d1209ef7cdd38e] connection.go:150: Sending packet {type=Initial, number=0}
[44d1209ef7cdd38e/SocketAgent] socket_agent.go:67: Received 1252 bytes from UDP socket
[44d1209ef7cdd38e/SocketAgent] socket_agent.go:67: Received 1252 bytes from UDP socket
[44d1209ef7cdd38e/SocketAgent] socket_agent.go:67: Received 1252 bytes from UDP socket
[44d1209ef7cdd38e/ParsingAgent] parse_agent.go:51: Decrypting packet number of Initial packet of length 1252 bytes
[44d1209ef7cdd38e/ParsingAgent] parse_agent.go:80: Successfully decrypted header {type=Initial, number=1}
[44d1209ef7cdd38e/ParsingAgent] parse_agent.go:137: Successfully parsed packet {type=Initial, number=1, length=1236}
[44d1209ef7cdd38e/ParsingAgent] parse_agent.go:73: Crypto state for Handshake packet of length 1252 bytes is not ready, putting it back in waiting buffer
[44d1209ef7cdd38e/ParsingAgent] parse_agent.go:73: Crypto state for Handshake packet of length 1252 bytes is not ready, putting it back in waiting buffer
[44d1209ef7cdd38e/RTTAgent] rtt_agent.go:125: LatestRTT = 27723, MinRTT = 27723, SmoothedRTT = 27723, RTTVar = 13861
[44d1209ef7cdd38e/TLSAgent] tls_agent.go:74: Received Initial packet in PN space Initial and 123 bytes from the corresponding crypto stream
[44d1209ef7cdd38e/RecoveryAgent] recovery_agent.go:65: Processing ACK frame in packet {type=Initial, number=1}
[44d1209ef7cdd38e/HandshakeAgent] handshake_agent.go:92: Received first Initial packet from server, switching DCID to 44d1209ef7cdd38e
[44d1209ef7cdd38e/TLSAgent] tls_agent.go:93: Installing handshake read crypto with secret b514eca2777a349e3a8b498c234e7747766634601596d46519d6c77e5fefce97b24eff30031f039cd36950152818d0be
[44d1209ef7cdd38e/TLSAgent] tls_agent.go:97: Installing handshake write crypto with secret cd3e546aab77230894f0695bd8127b57f0e6671613aebe448b625343475f287bcd4195627ee02f0b2a07d487d4fa2895
[44d1209ef7cdd38e/BufferAgent] buffer_agent.go:44: Encryption level Handshake is available, putting back 2 unprocessed payloads into the buffer
[44d1209ef7cdd38e/ParsingAgent] parse_agent.go:51: Decrypting packet number of Handshake packet of length 1252 bytes
[44d1209ef7cdd38e/ParsingAgent] parse_agent.go:80: Successfully decrypted header {type=Handshake, number=2}
[44d1209ef7cdd38e/ParsingAgent] parse_agent.go:137: Successfully parsed packet {type=Handshake, number=2, length=1236}
[44d1209ef7cdd38e/ParsingAgent] parse_agent.go:51: Decrypting packet number of Handshake packet of length 1252 bytes
[44d1209ef7cdd38e/ParsingAgent] parse_agent.go:80: Successfully decrypted header {type=Handshake, number=3}
[44d1209ef7cdd38e/ParsingAgent] parse_agent.go:137: Successfully parsed packet {type=Handshake, number=3, length=1236}
[44d1209ef7cdd38e/TLSAgent] tls_agent.go:74: Received Handshake packet in PN space Handshake and 2411 bytes from the corresponding crypto stream
[44d1209ef7cdd38e/TLSAgent] tls_agent.go:74: Received Handshake packet in PN space Handshake and 0 bytes from the corresponding crypto stream
[CID 44d1209ef7cdd38e] connection.go:150: Sending packet {type=Initial, number=1}
[CID 44d1209ef7cdd38e] connection.go:150: Sending packet {type=Handshake, number=0}
[44d1209ef7cdd38e/SendingAgent] send_agent.go:101: Chose Handshake as new encryption level for Best
[CID 44d1209ef7cdd38e] connection.go:150: Sending packet {type=Handshake, number=1}
[44d1209ef7cdd38e/SocketAgent] socket_agent.go:67: Received 1252 bytes from UDP socket
[44d1209ef7cdd38e/SocketAgent] socket_agent.go:67: Received 951 bytes from UDP socket
[44d1209ef7cdd38e/ParsingAgent] parse_agent.go:51: Decrypting packet number of Handshake packet of length 1252 bytes
[44d1209ef7cdd38e/ParsingAgent] parse_agent.go:80: Successfully decrypted header {type=Handshake, number=4}
[44d1209ef7cdd38e/ParsingAgent] parse_agent.go:137: Successfully parsed packet {type=Handshake, number=4, length=1236}
[44d1209ef7cdd38e/ParsingAgent] parse_agent.go:51: Decrypting packet number of Handshake packet of length 951 bytes
[44d1209ef7cdd38e/ParsingAgent] parse_agent.go:80: Successfully decrypted header {type=Handshake, number=5}
[44d1209ef7cdd38e/ParsingAgent] parse_agent.go:137: Successfully parsed packet {type=Handshake, number=5, length=935}
[44d1209ef7cdd38e/TLSAgent] tls_agent.go:74: Received Handshake packet in PN space Handshake and 2109 bytes from the corresponding crypto stream
[44d1209ef7cdd38e/TLSAgent] tls_agent.go:109: Handshake has completed, installing protected crypto {read=9c783daf263c340316632542e3141a0eaac7d12786d25d703d0dfb4f43c327dcd8f09beb5cbb8e7e39206e77585dbba1, write=abd2d08500e2de0bf0e3720fd1aa273447794c523f8e89ea2c3874b72e15fe3a473bdc8e23a5ce43a0abb7fb4d70fd6e}
[44d1209ef7cdd38e/FrameQueueAgent] frame_queue_agent.go:122: Received a 0x06 frame for encryption level Handshake
[44d1209ef7cdd38e/TLSAgent] tls_agent.go:74: Received Handshake packet in PN space Handshake and 0 bytes from the corresponding crypto stream
[44d1209ef7cdd38e/RecoveryAgent] recovery_agent.go:110: Handshake has completed, emptying the two retransmission buffers
[44d1209ef7cdd38e/RecoveryAgent] recovery_agent.go:110: Handshake has completed, emptying the two retransmission buffers
[CID 44d1209ef7cdd38e] connection.go:150: Sending packet {type=Handshake, number=2}
[44d1209ef7cdd38e/SendingAgent] send_agent.go:81: Preparing a packet for encryption level 1RTT resulted in an empty packet, discarding
[44d1209ef7cdd38e/SocketAgent] socket_agent.go:67: Received 280 bytes from UDP socket
[44d1209ef7cdd38e/SocketAgent] socket_agent.go:67: Received 296 bytes from UDP socket
[44d1209ef7cdd38e/SocketAgent] socket_agent.go:67: Received 72 bytes from UDP socket
[44d1209ef7cdd38e/ParsingAgent] parse_agent.go:51: Decrypting packet number of 1-RTT Protected packet of length 280 bytes
[44d1209ef7cdd38e/ParsingAgent] parse_agent.go:80: Successfully decrypted header {type=1-RTT Protected, number=6}
[44d1209ef7cdd38e/ParsingAgent] parse_agent.go:137: Successfully parsed packet {type=1-RTT Protected, number=6, length=264}
[44d1209ef7cdd38e/ParsingAgent] parse_agent.go:51: Decrypting packet number of 1-RTT Protected packet of length 296 bytes
[44d1209ef7cdd38e/ParsingAgent] parse_agent.go:80: Successfully decrypted header {type=1-RTT Protected, number=7}
[44d1209ef7cdd38e/ParsingAgent] parse_agent.go:137: Successfully parsed packet {type=1-RTT Protected, number=7, length=280}
[44d1209ef7cdd38e/SocketAgent] socket_agent.go:67: Received 33 bytes from UDP socket
[44d1209ef7cdd38e/ParsingAgent] parse_agent.go:51: Decrypting packet number of 1-RTT Protected packet of length 72 bytes
[44d1209ef7cdd38e/ParsingAgent] parse_agent.go:80: Successfully decrypted header {type=1-RTT Protected, number=8}
[44d1209ef7cdd38e/TLSAgent] tls_agent.go:74: Received 1-RTT Protected packet in PN space Application data and 514 bytes from the corresponding crypto stream
[44d1209ef7cdd38e/ParsingAgent] parse_agent.go:137: Successfully parsed packet {type=1-RTT Protected, number=8, length=56}
[44d1209ef7cdd38e/ParsingAgent] parse_agent.go:51: Decrypting packet number of 1-RTT Protected packet of length 33 bytes
[44d1209ef7cdd38e/ParsingAgent] parse_agent.go:80: Successfully decrypted header {type=1-RTT Protected, number=9}
[44d1209ef7cdd38e/ParsingAgent] parse_agent.go:137: Successfully parsed packet {type=1-RTT Protected, number=9, length=17}
[44d1209ef7cdd38e/TLSAgent] tls_agent.go:74: Received 1-RTT Protected packet in PN space Application data and 0 bytes from the corresponding crypto stream
[44d1209ef7cdd38e/TLSAgent] tls_agent.go:74: Received 1-RTT Protected packet in PN space Application data and 0 bytes from the corresponding crypto stream
[44d1209ef7cdd38e/TLSAgent] tls_agent.go:74: Received 1-RTT Protected packet in PN space Application data and 0 bytes from the corresponding crypto stream
[44d1209ef7cdd38e/FlowControlAgent] flow_control_agent.go:74: Initialised stream 3 read limit to 16384 bytes
[44d1209ef7cdd38e/SendingAgent] send_agent.go:151: Dropping encryption level Initial
[44d1209ef7cdd38e/SendingAgent] send_agent.go:151: Dropping encryption level Handshake
[44d1209ef7cdd38e/RecoveryAgent] recovery_agent.go:115: Dropping Initial encryption level, emptying the retransmission buffer
[44d1209ef7cdd38e/RecoveryAgent] recovery_agent.go:119: Dropping Handshake encryption level, emptying the retransmission buffer
[44d1209ef7cdd38e/HandshakeAgent] handshake_agent.go:177: New status HandshakeStatus{Completed=true, Error=%!s()}
[44d1209ef7cdd38e/FrameQueueAgent] frame_queue_agent.go:122: Received a 0x1d frame for encryption level Best
[44d1209ef7cdd38e/SendingAgent] send_agent.go:101: Chose 1RTT as new encryption level for Best
[CID 44d1209ef7cdd38e] connection.go:150: Sending packet {type=1-RTT Protected, number=0}
[44d1209ef7cdd38e/RecoveryAgent] recovery_agent.go:99: Connection is closing, emptying retransmit buffers
[44d1209ef7cdd38e/ClosingAgent] closing_agent.go:40: Agent terminated
[44d1209ef7cdd38e/RecoveryAgent] recovery_agent.go:132: Agent terminated
[44d1209ef7cdd38e/FlowControlAgent] flow_control_agent.go:276: Agent terminated
[44d1209ef7cdd38e/QLogAgent] qlog_agent.go:44: Agent terminated
[44d1209ef7cdd38e/SocketAgent] socket_agent.go:37: Closing UDP socket because of error read udp 172.24.73.222:39694->3.127.187.4:443: use of closed network connection
[44d1209ef7cdd38e/SocketAgent] socket_agent.go:90: Agent terminated
[44d1209ef7cdd38e/TLSAgent] tls_agent.go:140: Agent terminated
[44d1209ef7cdd38e/AckAgent] ack_agent.go:83: Agent terminated
[44d1209ef7cdd38e/SendingAgent] send_agent.go:200: Agent terminated
[44d1209ef7cdd38e/BufferAgent] buffer_agent.go:53: Agent terminated
[44d1209ef7cdd38e/FrameQueueAgent] frame_queue_agent.go:142: Agent terminated
[44d1209ef7cdd38e/ParsingAgent] parse_agent.go:156: Agent terminated
[44d1209ef7cdd38e/RTTAgent] rtt_agent.go:80: Agent terminated
[44d1209ef7cdd38e/StreamAgent] stream_agent.go:72: Agent terminated
[44d1209ef7cdd38e/HandshakeAgent] handshake_agent.go:166: Agent terminated
[1373f7b3f2060612/QLogAgent] base_agent.go:49: Agent started
[1373f7b3f2060612/SocketAgent] base_agent.go:49: Agent started
[1373f7b3f2060612/ParsingAgent] base_agent.go:49: Agent started
[1373f7b3f2060612/BufferAgent] base_agent.go:49: Agent started
[1373f7b3f2060612/TLSAgent] base_agent.go:49: Agent started
[1373f7b3f2060612/AckAgent] base_agent.go:49: Agent started
[1373f7b3f2060612/SendingAgent] base_agent.go:49: Agent started
[1373f7b3f2060612/RecoveryAgent] base_agent.go:49: Agent started
[1373f7b3f2060612/RTTAgent] base_agent.go:49: Agent started
[1373f7b3f2060612/FrameQueueAgent] base_agent.go:49: Agent started
[1373f7b3f2060612/FlowControlAgent] base_agent.go:49: Agent started
[1373f7b3f2060612/StreamAgent] base_agent.go:49: Agent started
[1373f7b3f2060612/ClosingAgent] base_agent.go:49: Agent started
[1373f7b3f2060612/RecoveryAgent] recovery_agent.go:132: Agent terminated
[1373f7b3f2060612/HandshakeAgent] base_agent.go:49: Agent started
[1373f7b3f2060612/HTTP3Agent] base_agent.go:49: Agent started
[1373f7b3f2060612/QPACKAgent] base_agent.go:49: Agent started
[1373f7b3f2060612/SendingAgent] send_agent.go:101: Chose 1RTT as new encryption level for BestAppData
[1373f7b3f2060612/SendingAgent] send_agent.go:101: Chose 1RTT as new encryption level for BestAppData
[1373f7b3f2060612/HandshakeAgent] handshake_agent.go:59: Sending first Initial packet
[1373f7b3f2060612/QPACKAgent] qpack_agent.go:158: Encoded 5 headers in 65 bytes, with 0 additional bytes on the encoder stream
[1373f7b3f2060612/HTTP3Agent] http3_agent.go:192: Sent a 65-byte long block of headers on stream 0
[1373f7b3f2060612/SendingAgent] send_agent.go:101: Chose 1RTT as new encryption level for BestAppData
picotls error code 513
[1373f7b3f2060612/SendingAgent] asm_amd64.s:522: Agent terminated
panic: runtime error: invalid memory address or nil pointer dereference
[signal SIGSEGV: segmentation violation code=0x1 addr=0x0 pc=0x45d8c0]

goroutine 142 [running]:
github.com/QUIC-Tracker/quic-tracker.(*InitialPacket).Header(0x0, 0xc00046fd20, 0x8)
:1 +0x4e
github.com/QUIC-Tracker/quic-tracker/agents.(*SendingAgent).Run.func2(0xc000254320, 0xc0001611a0, 0xc0003c67e0, 0xc0003c6810, 0xc0003c6870, 0xc0003c6840, 0xc000174460, 0xc000318480, 0xc0004040fe, 0xc000161260, ...)
/go/src/github.com/QUIC-Tracker/quic-tracker/agents/send_agent.go:164 +0x74c
created by github.com/QUIC-Tracker/quic-tracker/agents.(*SendingAgent).Run
/go/src/github.com/QUIC-Tracker/quic-tracker/agents/send_agent.go:90 +0x59d
exit status 2`

ietf_quic_hosts.txt refers unreachable quic.westus.cloudapp.azure.com

https://quic-tracker.info.ucl.ac.be/grid shows that Padding only test case is passing against quic.westus.cloudapp.azure.com:4433 though the server seems unreachable, because the hostname get's resolved to a broadcast address:

host quic.westus.cloudapp.azure.com
quic.westus.cloudapp.azure.com has address 255.255.255.255

When checking details: https://quic-tracker.info.ucl.ac.be/traces/20221009/79
it shows
"host":"quic.westus.cloudapp.azure.com:4433",
"ip":"255.255.255.255",

Hidden assumption about existence of a git repository

Hi,

when using quic-tracker outside of a git repository the following breaks:

Commit: GitCommit(),

quic-tracker/trace.go

Lines 112 to 123 in 7f2ccb9

func GitCommit() string {
var (
cmdOut []byte
err error
)
cmdName := "git"
cmdArgs := []string{"rev-parse", "--verify", "HEAD"}
if cmdOut, err = exec.Command(cmdName, cmdArgs...).Output(); err != nil {
panic(err)
}
return strings.TrimSpace(string(cmdOut))
}

The code assumes that there is a git repository and panics if there is not...
I actually like the idea about versioning this way but maybe do not panic and instead change the commit to "NOT IN A GIT" or something?

Installation failed: can't make

In file included from ./pigotls.go:10:0:
./picotls/include/picotls/openssl.h:25:10: fatal error: openssl/opensslv.h: No such file or directory
#include <openssl/opensslv.h>

Format of hosts file

Using the docker build, I'm trying to run the test_suite but having trouble with the hosts file.

$ docker run --network="host" quictracker/quictracker /test_suite -hosts ./hosts.txt
panic: open ./hosts.txt: no such file or directory

goroutine 1 [running]:
main.main()
	/go/src/github.com/QUIC-Tracker/quic-tracker/bin/test_suite/test_suite.go:50 +0x13e7
Wed Jul 29 15:38:33 CEST 2020
$ cat hosts.txt
quic.rocks      /       443

I'm not sure the format is correct (an example would be useful in the readme) however it seems it's unable to find the file in the first place.

Error while running testcases

@mpiraux @piano-man

i am running below testcases and getting below error

command

go run bin/test_suite/test_suite.go -hosts host.txt -parallel=true -debug=true -parallel-scenarios=true -randomise=true

hostst.txt

127.0.0.1:4434  /index.html     4434    h3
127.0.0.1:4434  /index.html     4434    h3

/home/vagrant/quic_services/ngtcp2/examples/qtlsserver --timeout=100h --show-secret --htdocs=/var/www/html/ 0.0.0.0 4434 /home/vagrant/quic_services/openssl/example.key /home/vagrant/quic_services/openssl/example.crt

Received packet: local=[127.0.0.1]:4434 remote=[127.0.0.1]:41108 if=lo ecn=0x0 1252 bytes
Sent packet: local=[127.0.0.1]:4434 remote=[127.0.0.1]:41108 ecn=0x0 31 bytes
Received packet: local=[127.0.0.1]:4434 remote=[127.0.0.1]:41108 if=lo ecn=0x0 1252 bytes
Sent packet: local=[127.0.0.1]:4434 remote=[127.0.0.1]:41108 ecn=0x0 31 bytes
Received packet: local=[127.0.0.1]:4434 remote=[127.0.0.1]:35212 if=lo ecn=0x0 1252 bytes
Sent packet: local=[127.0.0.1]:4434 remote=[127.0.0.1]:35212 ecn=0x0 31 bytes
Received packet: local=[127.0.0.1]:4434 remote=[127.0.0.1]:35212 if=lo ecn=0x0 1252 bytes
Sent packet: local=[127.0.0.1]:4434 remote=[127.0.0.1]:35212 ecn=0x0 31 bytes
Received packet: local=[127.0.0.1]:4434 remote=[127.0.0.1]:36919 if=lo ecn=0x0 1252 bytes
Sent packet: local=[127.0.0.1]:4434 remote=[127.0.0.1]:36919 ecn=0x0 31 bytes
Received packet: local=[127.0.0.1]:4434 remote=[127.0.0.1]:42560 if=lo ecn=0x0 1252 bytes
Sent packet: local=[127.0.0.1]:4434 remote=[127.0.0.1]:42560 ecn=0x0 31 bytes
Received packet: local=[127.0.0.1]:4434 remote=[127.0.0.1]:51088 if=lo ecn=0x0 1252 bytes
Sent packet: local=[127.0.0.1]:4434 remote=[127.0.0.1]:51088 ecn=0x0 31 bytes
Received packet: local=[127.0.0.1]:4434 remote=[127.0.0.1]:52207 if=lo ecn=0x0 1252 bytes
Sent packet: local=[127.0.0.1]:4434 remote=[127.0.0.1]:52207 ecn=0x0 31 bytes
Received packet: local=[127.0.0.1]:4434 remote=[127.0.0.1]:52207 if=lo ecn=0x0 1252 bytes
Sent packet: local=[127.0.0.1]:4434 remote=[127.0.0.1]:52207 ecn=0x0 31 bytes
Received packet: local=[127.0.0.1]:4434 remote=[127.0.0.1]:41641 if=lo ecn=0x0 1252 bytes
Sent packet: local=[127.0.0.1]:4434 remote=[127.0.0.1]:41641 ecn=0x0 31 bytes
Received packet: local=[127.0.0.1]:4434 remote=[127.0.0.1]:41641 if=lo ecn=0x0 1252 bytes
Sent packet: local=[127.0.0.1]:4434 remote=[127.0.0.1]:41641 ecn=0x0 31 bytes
Received packet: local=[127.0.0.1]:4434 remote=[127.0.0.1]:47511 if=lo ecn=0x0 1252 bytes
Sent packet: local=[127.0.0.1]:4434 remote=[127.0.0.1]:47511 ecn=0x0 31 bytes
Received packet: local=[127.0.0.1]:4434 remote=[127.0.0.1]:45088 if=lo ecn=0x0 1252 bytes
Sent packet: local=[127.0.0.1]:4434 remote=[127.0.0.1]:45088 ecn=0x0 31 bytes
Received packet: local=[127.0.0.1]:4434 remote=[127.0.0.1]:45287 if=lo ecn=0x0 1252 bytes
Sent packet: local=[127.0.0.1]:4434 remote=[127.0.0.1]:45287 ecn=0x0 31 bytes
Received packet: local=[127.0.0.1]:4434 remote=[127.0.0.1]:58351 if=lo ecn=0x0 1252 bytes
Sent packet: local=[127.0.0.1]:4434 remote=[127.0.0.1]:58351 ecn=0x0 31 bytes
Received packet: local=[127.0.0.1]:4434 remote=[127.0.0.1]:40467 if=lo ecn=0x0 1252 bytes
Sent packet: local=[127.0.0.1]:4434 remote=[127.0.0.1]:40467 ecn=0x0 31 bytes
Received packet: local=[127.0.0.1]:4434 remote=[127.0.0.1]:38290 if=lo ecn=0x0 1252 bytes
Sent packet: local=[127.0.0.1]:4434 remote=[127.0.0.1]:38290 ecn=0x0 31 bytes
Received packet: local=[127.0.0.1]:4434 remote=[127.0.0.1]:45573 if=lo ecn=0x0 1252 bytes
Sent packet: local=[127.0.0.1]:4434 remote=[127.0.0.1]:45573 ecn=0x0 31 bytes
Received packet: local=[127.0.0.1]:4434 remote=[127.0.0.1]:51795 if=lo ecn=0x0 1252 bytes
Sent packet: local=[127.0.0.1]:4434 remote=[127.0.0.1]:51795 ecn=0x0 31 bytes
Received packet: local=[127.0.0.1]:4434 remote=[127.0.0.1]:35502 if=lo ecn=0x0 1252 bytes
Sent packet: local=[127.0.0.1]:4434 remote=[127.0.0.1]:35502 ecn=0x0 31 bytes
Received packet: local=[127.0.0.1]:4434 remote=[127.0.0.1]:50885 if=lo ecn=0x0 1252 bytes
Sent packet: local=[127.0.0.1]:4434 remote=[127.0.0.1]:50885 ecn=0x0 23 bytes
Received packet: local=[127.0.0.1]:4434 remote=[127.0.0.1]:54144 if=lo ecn=0x0 1252 bytes
Sent packet: local=[127.0.0.1]:4434 remote=[127.0.0.1]:54144 ecn=0x0 31 bytes
Received packet: local=[127.0.0.1]:4434 remote=[127.0.0.1]:33123 if=lo ecn=0x0 1252 bytes
Sent packet: local=[127.0.0.1]:4434 remote=[127.0.0.1]:33123 ecn=0x0 31 bytes
Received packet: local=[127.0.0.1]:4434 remote=[127.0.0.1]:52230 if=lo ecn=0x0 1252 bytes
Sent packet: local=[127.0.0.1]:4434 remote=[127.0.0.1]:52230 ecn=0x0 23 bytes
Received packet: local=[127.0.0.1]:4434 remote=[127.0.0.1]:55569 if=lo ecn=0x0 1252 bytes
Sent packet: local=[127.0.0.1]:4434 remote=[127.0.0.1]:55569 ecn=0x0 31 bytes
Received packet: local=[127.0.0.1]:4434 remote=[127.0.0.1]:34010 if=lo ecn=0x0 1252 bytes
Sent packet: local=[127.0.0.1]:4434 remote=[127.0.0.1]:34010 ecn=0x0 31 bytes
Received packet: local=[127.0.0.1]:4434 remote=[127.0.0.1]:44124 if=lo ecn=0x0 1252 bytes
Sent packet: local=[127.0.0.1]:4434 remote=[127.0.0.1]:44124 ecn=0x0 31 bytes
Received packet: local=[127.0.0.1]:4434 remote=[127.0.0.1]:57526 if=lo ecn=0x0 1252 bytes
Sent packet: local=[127.0.0.1]:4434 remote=[127.0.0.1]:57526 ecn=0x0 31 bytes
Received packet: local=[127.0.0.1]:4434 remote=[127.0.0.1]:43752 if=lo ecn=0x0 1252 bytes
Sent packet: local=[127.0.0.1]:4434 remote=[127.0.0.1]:43752 ecn=0x0 31 bytes
Received packet: local=[127.0.0.1]:4434 remote=[127.0.0.1]:59889 if=lo ecn=0x0 1252 bytes
Sent packet: local=[127.0.0.1]:4434 remote=[127.0.0.1]:59889 ecn=0x0 31 bytes
Received packet: local=[127.0.0.1]:4434 remote=[127.0.0.1]:47795 if=lo ecn=0x0 1252 bytes
Sent packet: local=[127.0.0.1]:4434 remote=[127.0.0.1]:47795 ecn=0x0 31 bytes
Received packet: local=[127.0.0.1]:4434 remote=[127.0.0.1]:55854 if=lo ecn=0x0 1252 bytes
Sent packet: local=[127.0.0.1]:4434 remote=[127.0.0.1]:55854 ecn=0x0 31 bytes
Received packet: local=[127.0.0.1]:4434 remote=[127.0.0.1]:47968 if=lo ecn=0x0 1252 bytes
Sent packet: local=[127.0.0.1]:4434 remote=[127.0.0.1]:47968 ecn=0x0 31 bytes
Received packet: local=[127.0.0.1]:4434 remote=[127.0.0.1]:41162 if=lo ecn=0x0 1252 bytes
Sent packet: local=[127.0.0.1]:4434 remote=[127.0.0.1]:41162 ecn=0x0 31 bytes
Received packet: local=[127.0.0.1]:4434 remote=[127.0.0.1]:43736 if=lo ecn=0x0 1252 bytes
Sent packet: local=[127.0.0.1]:4434 remote=[127.0.0.1]:43736 ecn=0x0 31 bytes
Received packet: local=[127.0.0.1]:4434 remote=[127.0.0.1]:57012 if=lo ecn=0x0 1252 bytes
Sent packet: local=[127.0.0.1]:4434 remote=[127.0.0.1]:57012 ecn=0x0 31 bytes
Received packet: local=[127.0.0.1]:4434 remote=[127.0.0.1]:59798 if=lo ecn=0x0 1252 bytes
Sent packet: local=[127.0.0.1]:4434 remote=[127.0.0.1]:59798 ecn=0x0 31 bytes
Received packet: local=[127.0.0.1]:4434 remote=[127.0.0.1]:58007 if=lo ecn=0x0 1252 bytes
Sent packet: local=[127.0.0.1]:4434 remote=[127.0.0.1]:58007 ecn=0x0 31 bytes
Received packet: local=[127.0.0.1]:4434 remote=[127.0.0.1]:56329 if=lo ecn=0x0 1252 bytes
Sent packet: local=[127.0.0.1]:4434 remote=[127.0.0.1]:56329 ecn=0x0 31 bytes
Received packet: local=[127.0.0.1]:4434 remote=[127.0.0.1]:58583 if=lo ecn=0x0 1252 bytes
Sent packet: local=[127.0.0.1]:4434 remote=[127.0.0.1]:58583 ecn=0x0 31 bytes
Received packet: local=[127.0.0.1]:4434 remote=[127.0.0.1]:50775 if=lo ecn=0x0 1252 bytes
Sent packet: local=[127.0.0.1]:4434 remote=[127.0.0.1]:50775 ecn=0x0 31 bytes
Received packet: local=[127.0.0.1]:4434 remote=[127.0.0.1]:56274 if=lo ecn=0x0 1252 bytes
Sent packet: local=[127.0.0.1]:4434 remote=[127.0.0.1]:56274 ecn=0x0 31 bytes
Received packet: local=[127.0.0.1]:4434 remote=[127.0.0.1]:44634 if=lo ecn=0x0 1252 bytes
Sent packet: local=[127.0.0.1]:4434 remote=[127.0.0.1]:44634 ecn=0x0 31 bytes
Received packet: local=[127.0.0.1]:4434 remote=[127.0.0.1]:33138 if=lo ecn=0x0 1252 bytes
Sent packet: local=[127.0.0.1]:4434 remote=[127.0.0.1]:33138 ecn=0x0 31 bytes
Received packet: local=[127.0.0.1]:4434 remote=[127.0.0.1]:56994 if=lo ecn=0x0 1252 bytes
Sent packet: local=[127.0.0.1]:4434 remote=[127.0.0.1]:56994 ecn=0x0 31 bytes
Received packet: local=[127.0.0.1]:4434 remote=[127.0.0.1]:57712 if=lo ecn=0x0 1252 bytes
Sent packet: local=[127.0.0.1]:4434 remote=[127.0.0.1]:57712 ecn=0x0 31 bytes
Received packet: local=[127.0.0.1]:4434 remote=[127.0.0.1]:49061 if=lo ecn=0x0 1252 bytes
Sent packet: local=[127.0.0.1]:4434 remote=[127.0.0.1]:49061 ecn=0x0 31 bytes
Received packet: local=[127.0.0.1]:4434 remote=[127.0.0.1]:42272 if=lo ecn=0x0 1252 bytes
Sent packet: local=[127.0.0.1]:4434 remote=[127.0.0.1]:42272 ecn=0x0 31 bytes
Received packet: local=[127.0.0.1]:4434 remote=[127.0.0.1]:52215 if=lo ecn=0x0 1252 bytes
Sent packet: local=[127.0.0.1]:4434 remote=[127.0.0.1]:52215 ecn=0x0 31 bytes
Received packet: local=[127.0.0.1]:4434 remote=[127.0.0.1]:44788 if=lo ecn=0x0 1252 bytes
Sent packet: local=[127.0.0.1]:4434 remote=[127.0.0.1]:44788 ecn=0x0 31 bytes
Received packet: local=[127.0.0.1]:4434 remote=[127.0.0.1]:60647 if=lo ecn=0x0 1252 bytes
Sent packet: local=[127.0.0.1]:4434 remote=[127.0.0.1]:60647 ecn=0x0 31 bytes
Received packet: local=[127.0.0.1]:4434 remote=[127.0.0.1]:56298 if=lo ecn=0x0 1252 bytes
Sent packet: local=[127.0.0.1]:4434 remote=[127.0.0.1]:56298 ecn=0x0 31 bytes
Received packet: local=[127.0.0.1]:4434 remote=[127.0.0.1]:48224 if=lo ecn=0x0 1252 bytes
Sent packet: local=[127.0.0.1]:4434 remote=[127.0.0.1]:48224 ecn=0x0 31 bytes
Received packet: local=[127.0.0.1]:4434 remote=[127.0.0.1]:38402 if=lo ecn=0x0 1252 bytes
Sent packet: local=[127.0.0.1]:4434 remote=[127.0.0.1]:38402 ecn=0x0 31 bytes
Received packet: local=[127.0.0.1]:4434 remote=[127.0.0.1]:45580 if=lo ecn=0x0 1252 bytes
Sent packet: local=[127.0.0.1]:4434 remote=[127.0.0.1]:45580 ecn=0x0 31 bytes
Received packet: local=[127.0.0.1]:4434 remote=[127.0.0.1]:44420 if=lo ecn=0x0 1252 bytes
Sent packet: local=[127.0.0.1]:4434 remote=[127.0.0.1]:44420 ecn=0x0 31 bytes

handshake output

root@ubuntu:/tmp# cat handshake/127.0.0.1\:4434
[aa7a88c5281831c0/QLogAgent] base_agent.go:49: Agent started
[aa7a88c5281831c0/SocketAgent] base_agent.go:49: Agent started
[aa7a88c5281831c0/ParsingAgent] base_agent.go:49: Agent started
[aa7a88c5281831c0/BufferAgent] base_agent.go:49: Agent started
[aa7a88c5281831c0/TLSAgent] base_agent.go:49: Agent started
[aa7a88c5281831c0/AckAgent] base_agent.go:49: Agent started
[aa7a88c5281831c0/SendingAgent] base_agent.go:49: Agent started
[aa7a88c5281831c0/RecoveryAgent] base_agent.go:49: Agent started
[aa7a88c5281831c0/RTTAgent] base_agent.go:49: Agent started
[aa7a88c5281831c0/FrameQueueAgent] base_agent.go:49: Agent started
[aa7a88c5281831c0/FlowControlAgent] base_agent.go:49: Agent started
[aa7a88c5281831c0/StreamAgent] base_agent.go:49: Agent started
[aa7a88c5281831c0/ClosingAgent] base_agent.go:49: Agent started
[aa7a88c5281831c0/HandshakeAgent] base_agent.go:49: Agent started
[aa7a88c5281831c0/HandshakeAgent] handshake_agent.go:59: Sending first Initial packet
[CID aa7a88c5281831c0] connection.go:150: Sending packet {type=Initial, number=0}
[aa7a88c5281831c0/SocketAgent] socket_agent.go:67: Received 31 bytes from UDP socket
[CID aa7a88c5281831c0] connection.go:206: No appropriate version was found in the VN packet
[CID aa7a88c5281831c0] connection.go:207: Versions received: [5a1a6aba 00000001]
[aa7a88c5281831c0/RecoveryAgent] recovery_agent.go:87: Received a VN packet, emptying Initial retransmit buffer
[aa7a88c5281831c0/HandshakeAgent] handshake_agent.go:67: Agent terminated
[aa7a88c5281831c0/HandshakeAgent] handshake_agent.go:177: New status HandshakeStatus{Completed=false, Error=no appropriate version found}
[aa7a88c5281831c0/QLogAgent] qlog_agent.go:44: Agent terminated
[aa7a88c5281831c0/SocketAgent] socket_agent.go:37: Closing UDP socket because of error read udp 127.0.0.1:45088->127.0.0.1:4434: use of closed network connection
[aa7a88c5281831c0/SocketAgent] socket_agent.go:90: Agent terminated
[aa7a88c5281831c0/BufferAgent] buffer_agent.go:53: Agent terminated
[aa7a88c5281831c0/AckAgent] ack_agent.go:83: Agent terminated
[aa7a88c5281831c0/SendingAgent] send_agent.go:200: Agent terminated
[aa7a88c5281831c0/TLSAgent] tls_agent.go:140: Agent terminated
[aa7a88c5281831c0/RTTAgent] rtt_agent.go:80: Agent terminated
[aa7a88c5281831c0/StreamAgent] stream_agent.go:72: Agent terminated
[aa7a88c5281831c0/ClosingAgent] closing_agent.go:55: Agent terminated
[aa7a88c5281831c0/FrameQueueAgent] frame_queue_agent.go:142: Agent terminated
[aa7a88c5281831c0/FlowControlAgent] flow_control_agent.go:276: Agent terminated
[aa7a88c5281831c0/ParsingAgent] parse_agent.go:156: Agent terminated
[aa7a88c5281831c0/RecoveryAgent] recovery_agent.go:132: Agent terminated
panic: runtime error: invalid memory address or nil pointer dereference
[signal SIGSEGV: segmentation violation code=0x1 addr=0x0 pc=0x4b0eb1]

goroutine 1 [running]:
os.(*Process).signal(0x3b9aca00?, {0x65e880?, 0x65d448?})
        /usr/local/go/src/os/exec_unix.go:63 +0x31
os.(*Process).Signal(...)
        /usr/local/go/src/os/exec.go:140
github.com/QUIC-Tracker/quic-tracker.StopPcapCapture(0xc00012e480, 0xc000212160)
        /root/go/src/github.com/QUIC-Tracker/quic-tracker/pcap_capture.go:30 +0x87
github.com/QUIC-Tracker/quic-tracker.(*Trace).AddPcap(...)
        /root/go/src/github.com/QUIC-Tracker/quic-tracker/trace.go:49
main.main()
        /root/go/src/github.com/QUIC-Tracker/quic-tracker/bin/test_suite/scenario_runner.go:66 +0x9a6
exit status 2

root@ubuntu:~/go/src/github.com/QUIC-Tracker/quic-tracker/bin/fuzzer# go run modular_differential_fuzzer.go -hosts hosts.txt -parallel=true -debug=true -fuzz 1
true
2
1
starting fuzzer with generator  stream_reassembly  against  127.0.0.1:4434
starting fuzzer with generator  stream_reassembly  against  127.0.0.1:4434
exit status 1: [d96327b0819b7822/QLogAgent] base_agent.go:49: Agent started
[d96327b0819b7822/SocketAgent] base_agent.go:49: Agent started
[d96327b0819b7822/ParsingAgent] base_agent.go:49: Agent started
[d96327b0819b7822/BufferAgent] base_agent.go:49: Agent started
[d96327b0819b7822/TLSAgent] base_agent.go:49: Agent started
[d96327b0819b7822/AckAgent] base_agent.go:49: Agent started
[d96327b0819b7822/SendingAgent] base_agent.go:49: Agent started
[d96327b0819b7822/RecoveryAgent] base_agent.go:49: Agent started
[d96327b0819b7822/RTTAgent] base_agent.go:49: Agent started
[d96327b0819b7822/FrameQueueAgent] base_agent.go:49: Agent started
[d96327b0819b7822/FlowControlAgent] base_agent.go:49: Agent started
[d96327b0819b7822/StreamAgent] base_agent.go:49: Agent started
[d96327b0819b7822/ClosingAgent] base_agent.go:49: Agent started
[d96327b0819b7822/HandshakeAgent] base_agent.go:49: Agent started
[d96327b0819b7822/HandshakeAgent] handshake_agent.go:58: Sending first Initial packet
[CID d96327b0819b7822] connection.go:205: Sending packet {type=Initial, number=0}
[d96327b0819b7822/SocketAgent] socket_agent.go:67: Received 31 bytes from UDP socket
[CID d96327b0819b7822] connection.go:312: No appropriate version was found in the VN packet
[CID d96327b0819b7822] connection.go:313: Versions received: [aada1ada 00000001]
[d96327b0819b7822/HandshakeAgent] handshake_agent.go:66: Agent terminated
[d96327b0819b7822/SendingAgent] send_agent.go:200: Agent terminated
[d96327b0819b7822/RecoveryAgent] recovery_agent.go:87: Received a VN packet, emptying Initial retransmit buffer
[d96327b0819b7822/RTTAgent] rtt_agent.go:80: Agent terminated
[d96327b0819b7822/FlowControlAgent] flow_control_agent.go:276: Agent terminated
[d96327b0819b7822/QLogAgent] qlog_agent.go:44: Agent terminated
[d96327b0819b7822/BufferAgent] buffer_agent.go:53: Agent terminated
[d96327b0819b7822/StreamAgent] stream_agent.go:72: Agent terminated
[d96327b0819b7822/RecoveryAgent] recovery_agent.go:132: Agent terminated
[d96327b0819b7822/SocketAgent] socket_agent.go:37: Closing UDP socket because of error read udp 127.0.0.1:50527->127.0.0.1:4434: use of closed network connection
[d96327b0819b7822/HandshakeAgent] handshake_agent.go:161: New status HandshakeStatus{Completed=false, Error=no appropriate version found}
[d96327b0819b7822/SocketAgent] socket_agent.go:90: Agent terminated
[d96327b0819b7822/TLSAgent] tls_agent.go:140: Agent terminated
[d96327b0819b7822/FrameQueueAgent] frame_queue_agent.go:142: Agent terminated
[d96327b0819b7822/ClosingAgent] closing_agent.go:55: Agent terminated
[d96327b0819b7822/ParsingAgent] parse_agent.go:152: Agent terminated
[d96327b0819b7822/AckAgent] ack_agent.go:83: Agent terminated
panic: runtime error: invalid memory address or nil pointer dereference
[signal SIGSEGV: segmentation violation code=0x1 addr=0x0 pc=0x4b0c31]

goroutine 1 [running]:
os.(*Process).signal(0x3b9aca00?, {0x635498?, 0x632af8?})
        /usr/local/go/src/os/exec_unix.go:63 +0x31
os.(*Process).Signal(...)
        /usr/local/go/src/os/exec.go:140
github.com/QUIC-Tracker/quic-tracker.StopPcapCapture(0xc00011a400, 0xc0001582c0)
        /root/go/src/github.com/QUIC-Tracker/quic-tracker/pcap_capture.go:30 +0x87
github.com/QUIC-Tracker/quic-tracker.(*Trace).AddPcap(...)
        /root/go/src/github.com/QUIC-Tracker/quic-tracker/trace.go:49
main.main()
        /root/go/src/github.com/QUIC-Tracker/quic-tracker/bin/fuzzer/fuzzer_runner.go:72 +0xadd
exit status 2

exit status 1
EOF
starting fuzzer with generator  flow_control_stream_reassembly  against  127.0.0.1:4434
exit status 1: [a50356f409c6d0fd/QLogAgent] base_agent.go:49: Agent started
[a50356f409c6d0fd/SocketAgent] base_agent.go:49: Agent started
[a50356f409c6d0fd/ParsingAgent] base_agent.go:49: Agent started
[a50356f409c6d0fd/BufferAgent] base_agent.go:49: Agent started
[a50356f409c6d0fd/TLSAgent] base_agent.go:49: Agent started
[a50356f409c6d0fd/AckAgent] base_agent.go:49: Agent started
[a50356f409c6d0fd/SendingAgent] base_agent.go:49: Agent started
[a50356f409c6d0fd/RecoveryAgent] base_agent.go:49: Agent started
[a50356f409c6d0fd/RTTAgent] base_agent.go:49: Agent started
[a50356f409c6d0fd/FrameQueueAgent] base_agent.go:49: Agent started
[a50356f409c6d0fd/FlowControlAgent] base_agent.go:49: Agent started
[a50356f409c6d0fd/StreamAgent] base_agent.go:49: Agent started
[a50356f409c6d0fd/ClosingAgent] base_agent.go:49: Agent started
[a50356f409c6d0fd/HandshakeAgent] base_agent.go:49: Agent started
[a50356f409c6d0fd/HandshakeAgent] handshake_agent.go:58: Sending first Initial packet
[CID a50356f409c6d0fd] connection.go:205: Sending packet {type=Initial, number=0}
[a50356f409c6d0fd/SocketAgent] socket_agent.go:67: Received 31 bytes from UDP socket
[a50356f409c6d0fd/RecoveryAgent] recovery_agent.go:87: Received a VN packet, emptying Initial retransmit buffer
[CID a50356f409c6d0fd] connection.go:312: No appropriate version was found in the VN packet
[CID a50356f409c6d0fd] connection.go:313: Versions received: [ea6a8aaa 00000001]
[a50356f409c6d0fd/HandshakeAgent] handshake_agent.go:66: Agent terminated
[a50356f409c6d0fd/ParsingAgent] parse_agent.go:152: Agent terminated
[a50356f409c6d0fd/BufferAgent] buffer_agent.go:53: Agent terminated
[a50356f409c6d0fd/TLSAgent] tls_agent.go:140: Agent terminated
[a50356f409c6d0fd/AckAgent] ack_agent.go:83: Agent terminated
[a50356f409c6d0fd/RecoveryAgent] recovery_agent.go:132: Agent terminated
[a50356f409c6d0fd/FlowControlAgent] flow_control_agent.go:276: Agent terminated
[a50356f409c6d0fd/StreamAgent] stream_agent.go:72: Agent terminated
[a50356f409c6d0fd/HandshakeAgent] handshake_agent.go:161: New status HandshakeStatus{Completed=false, Error=no appropriate version found}
[a50356f409c6d0fd/ClosingAgent] closing_agent.go:55: Agent terminated
[a50356f409c6d0fd/QLogAgent] qlog_agent.go:44: Agent terminated
[a50356f409c6d0fd/SocketAgent] socket_agent.go:37: Closing UDP socket because of error read udp 127.0.0.1:44567->127.0.0.1:4434: use of closed network connection
[a50356f409c6d0fd/SocketAgent] socket_agent.go:90: Agent terminated
[a50356f409c6d0fd/SendingAgent] send_agent.go:200: Agent terminated
[a50356f409c6d0fd/RTTAgent] rtt_agent.go:80: Agent terminated
[a50356f409c6d0fd/FrameQueueAgent] frame_queue_agent.go:142: Agent terminated
panic: runtime error: invalid memory address or nil pointer dereference
[signal SIGSEGV: segmentation violation code=0x1 addr=0x0 pc=0x4b0c31]

goroutine 1 [running]:
os.(*Process).signal(0x3b9aca00?, {0x635498?, 0x632af8?})
        /usr/local/go/src/os/exec_unix.go:63 +0x31
os.(*Process).Signal(...)
        /usr/local/go/src/os/exec.go:140
github.com/QUIC-Tracker/quic-tracker.StopPcapCapture(0xc00019a400, 0xc0001d82c0)
        /root/go/src/github.com/QUIC-Tracker/quic-tracker/pcap_capture.go:30 +0x87
github.com/QUIC-Tracker/quic-tracker.(*Trace).AddPcap(...)
        /root/go/src/github.com/QUIC-Tracker/quic-tracker/trace.go:49
main.main()
        /root/go/src/github.com/QUIC-Tracker/quic-tracker/bin/fuzzer/fuzzer_runner.go:72 +0xadd
exit status 2

exit status 1
EOF
starting fuzzer with generator  flow_control_stream_reassembly  against  127.0.0.1:4434
exit status 1: [0bd43a77746cfbd2/QLogAgent] base_agent.go:49: Agent started
[0bd43a77746cfbd2/SocketAgent] base_agent.go:49: Agent started
[0bd43a77746cfbd2/ParsingAgent] base_agent.go:49: Agent started
[0bd43a77746cfbd2/BufferAgent] base_agent.go:49: Agent started
[0bd43a77746cfbd2/TLSAgent] base_agent.go:49: Agent started
[0bd43a77746cfbd2/AckAgent] base_agent.go:49: Agent started
[0bd43a77746cfbd2/SendingAgent] base_agent.go:49: Agent started
[0bd43a77746cfbd2/RecoveryAgent] base_agent.go:49: Agent started
[0bd43a77746cfbd2/RTTAgent] base_agent.go:49: Agent started
[0bd43a77746cfbd2/FrameQueueAgent] base_agent.go:49: Agent started
[0bd43a77746cfbd2/FlowControlAgent] base_agent.go:49: Agent started
[0bd43a77746cfbd2/StreamAgent] base_agent.go:49: Agent started
[0bd43a77746cfbd2/ClosingAgent] base_agent.go:49: Agent started
[0bd43a77746cfbd2/HandshakeAgent] base_agent.go:49: Agent started
[0bd43a77746cfbd2/HandshakeAgent] handshake_agent.go:58: Sending first Initial packet
[CID 0bd43a77746cfbd2] connection.go:205: Sending packet {type=Initial, number=0}
[0bd43a77746cfbd2/SocketAgent] socket_agent.go:67: Received 31 bytes from UDP socket
[CID 0bd43a77746cfbd2] connection.go:312: No appropriate version was found in the VN packet
[CID 0bd43a77746cfbd2] connection.go:313: Versions received: [8a6ada6a 00000001]
[0bd43a77746cfbd2/HandshakeAgent] handshake_agent.go:66: Agent terminated
[0bd43a77746cfbd2/FlowControlAgent] flow_control_agent.go:276: Agent terminated
[0bd43a77746cfbd2/AckAgent] ack_agent.go:83: Agent terminated
[0bd43a77746cfbd2/SendingAgent] send_agent.go:200: Agent terminated
[0bd43a77746cfbd2/HandshakeAgent] handshake_agent.go:161: New status HandshakeStatus{Completed=false, Error=no appropriate version found}
[0bd43a77746cfbd2/RecoveryAgent] recovery_agent.go:87: Received a VN packet, emptying Initial retransmit buffer
[0bd43a77746cfbd2/RecoveryAgent] recovery_agent.go:132: Agent terminated
[0bd43a77746cfbd2/RTTAgent] rtt_agent.go:80: Agent terminated
[0bd43a77746cfbd2/StreamAgent] stream_agent.go:72: Agent terminated
[0bd43a77746cfbd2/SocketAgent] socket_agent.go:37: Closing UDP socket because of error read udp 127.0.0.1:54538->127.0.0.1:4434: use of closed network connection
[0bd43a77746cfbd2/SocketAgent] socket_agent.go:90: Agent terminated
[0bd43a77746cfbd2/ParsingAgent] parse_agent.go:152: Agent terminated
[0bd43a77746cfbd2/TLSAgent] tls_agent.go:140: Agent terminated
[0bd43a77746cfbd2/FrameQueueAgent] frame_queue_agent.go:142: Agent terminated
[0bd43a77746cfbd2/QLogAgent] qlog_agent.go:44: Agent terminated
[0bd43a77746cfbd2/BufferAgent] buffer_agent.go:53: Agent terminated
[0bd43a77746cfbd2/ClosingAgent] closing_agent.go:55: Agent terminated
panic: runtime error: invalid memory address or nil pointer dereference
[signal SIGSEGV: segmentation violation code=0x1 addr=0x0 pc=0x4b0c31]

goroutine 1 [running]:
os.(*Process).signal(0x3b9aca00?, {0x635498?, 0x632af8?})
        /usr/local/go/src/os/exec_unix.go:63 +0x31
os.(*Process).Signal(...)
        /usr/local/go/src/os/exec.go:140
github.com/QUIC-Tracker/quic-tracker.StopPcapCapture(0xc000080800, 0xc0000dc2c0)
        /root/go/src/github.com/QUIC-Tracker/quic-tracker/pcap_capture.go:30 +0x87
github.com/QUIC-Tracker/quic-tracker.(*Trace).AddPcap(...)
        /root/go/src/github.com/QUIC-Tracker/quic-tracker/trace.go:49
main.main()
        /root/go/src/github.com/QUIC-Tracker/quic-tracker/bin/fuzzer/fuzzer_runner.go:72 +0xadd
exit status 2

exit status 1
EOF
starting fuzzer with generator  overlapping_offset  against  127.0.0.1:4434
exit status 1: [a1fc59d2e9a31692/QLogAgent] base_agent.go:49: Agent started
[a1fc59d2e9a31692/SocketAgent] base_agent.go:49: Agent started
[a1fc59d2e9a31692/ParsingAgent] base_agent.go:49: Agent started
[a1fc59d2e9a31692/BufferAgent] base_agent.go:49: Agent started
[a1fc59d2e9a31692/TLSAgent] base_agent.go:49: Agent started
[a1fc59d2e9a31692/AckAgent] base_agent.go:49: Agent started
[a1fc59d2e9a31692/SendingAgent] base_agent.go:49: Agent started
[a1fc59d2e9a31692/RecoveryAgent] base_agent.go:49: Agent started
[a1fc59d2e9a31692/RTTAgent] base_agent.go:49: Agent started
[a1fc59d2e9a31692/FrameQueueAgent] base_agent.go:49: Agent started
[a1fc59d2e9a31692/FlowControlAgent] base_agent.go:49: Agent started
[a1fc59d2e9a31692/StreamAgent] base_agent.go:49: Agent started
[a1fc59d2e9a31692/ClosingAgent] base_agent.go:49: Agent started
[a1fc59d2e9a31692/HandshakeAgent] base_agent.go:49: Agent started
[a1fc59d2e9a31692/HandshakeAgent] handshake_agent.go:58: Sending first Initial packet
[CID a1fc59d2e9a31692] connection.go:205: Sending packet {type=Initial, number=0}
[a1fc59d2e9a31692/SocketAgent] socket_agent.go:67: Received 31 bytes from UDP socket
[a1fc59d2e9a31692/RecoveryAgent] recovery_agent.go:87: Received a VN packet, emptying Initial retransmit buffer
[CID a1fc59d2e9a31692] connection.go:312: No appropriate version was found in the VN packet
[CID a1fc59d2e9a31692] connection.go:313: Versions received: [daaada3a 00000001]
[a1fc59d2e9a31692/HandshakeAgent] handshake_agent.go:66: Agent terminated
[a1fc59d2e9a31692/AckAgent] ack_agent.go:83: Agent terminated
[a1fc59d2e9a31692/ParsingAgent] parse_agent.go:152: Agent terminated
[a1fc59d2e9a31692/SendingAgent] send_agent.go:200: Agent terminated
[a1fc59d2e9a31692/FrameQueueAgent] frame_queue_agent.go:142: Agent terminated
[a1fc59d2e9a31692/HandshakeAgent] handshake_agent.go:161: New status HandshakeStatus{Completed=false, Error=no appropriate version found}
[a1fc59d2e9a31692/FlowControlAgent] flow_control_agent.go:276: Agent terminated
[a1fc59d2e9a31692/SocketAgent] socket_agent.go:37: Closing UDP socket because of error read udp 127.0.0.1:57947->127.0.0.1:4434: use of closed network connection
[a1fc59d2e9a31692/SocketAgent] socket_agent.go:90: Agent terminated
[a1fc59d2e9a31692/RecoveryAgent] recovery_agent.go:132: Agent terminated
[a1fc59d2e9a31692/QLogAgent] qlog_agent.go:44: Agent terminated
[a1fc59d2e9a31692/BufferAgent] buffer_agent.go:53: Agent terminated
[a1fc59d2e9a31692/TLSAgent] tls_agent.go:140: Agent terminated
[a1fc59d2e9a31692/RTTAgent] rtt_agent.go:80: Agent terminated
[a1fc59d2e9a31692/StreamAgent] stream_agent.go:72: Agent terminated
[a1fc59d2e9a31692/ClosingAgent] closing_agent.go:55: Agent terminated
panic: runtime error: invalid memory address or nil pointer dereference
[signal SIGSEGV: segmentation violation code=0x1 addr=0x0 pc=0x4b0c31]

goroutine 1 [running]:
os.(*Process).signal(0x3b9aca00?, {0x635498?, 0x632af8?})
        /usr/local/go/src/os/exec_unix.go:63 +0x31
os.(*Process).Signal(...)
        /usr/local/go/src/os/exec.go:140
github.com/QUIC-Tracker/quic-tracker.StopPcapCapture(0xc000080c00, 0xc0001f2000)
        /root/go/src/github.com/QUIC-Tracker/quic-tracker/pcap_capture.go:30 +0x87
github.com/QUIC-Tracker/quic-tracker.(*Trace).AddPcap(...)
        /root/go/src/github.com/QUIC-Tracker/quic-tracker/trace.go:49
main.main()
        /root/go/src/github.com/QUIC-Tracker/quic-tracker/bin/fuzzer/fuzzer_runner.go:72 +0xadd
exit status 2

exit status 1
EOF
starting fuzzer with generator  overlapping_offset  against  127.0.0.1:4434
exit status 1: [c513bd1b429de727/QLogAgent] base_agent.go:49: Agent started
[c513bd1b429de727/SocketAgent] base_agent.go:49: Agent started
[c513bd1b429de727/ParsingAgent] base_agent.go:49: Agent started
[c513bd1b429de727/BufferAgent] base_agent.go:49: Agent started
[c513bd1b429de727/TLSAgent] base_agent.go:49: Agent started
[c513bd1b429de727/AckAgent] base_agent.go:49: Agent started
[c513bd1b429de727/SendingAgent] base_agent.go:49: Agent started
[c513bd1b429de727/RecoveryAgent] base_agent.go:49: Agent started
[c513bd1b429de727/RTTAgent] base_agent.go:49: Agent started
[c513bd1b429de727/FrameQueueAgent] base_agent.go:49: Agent started
[c513bd1b429de727/FlowControlAgent] base_agent.go:49: Agent started
[c513bd1b429de727/StreamAgent] base_agent.go:49: Agent started
[c513bd1b429de727/ClosingAgent] base_agent.go:49: Agent started
[c513bd1b429de727/HandshakeAgent] base_agent.go:49: Agent started
[c513bd1b429de727/HandshakeAgent] handshake_agent.go:58: Sending first Initial packet
[CID c513bd1b429de727] connection.go:205: Sending packet {type=Initial, number=0}
[c513bd1b429de727/SocketAgent] socket_agent.go:67: Received 31 bytes from UDP socket
[CID c513bd1b429de727] connection.go:312: No appropriate version was found in the VN packet
[c513bd1b429de727/RecoveryAgent] recovery_agent.go:87: Received a VN packet, emptying Initial retransmit buffer
[CID c513bd1b429de727] connection.go:313: Versions received: [dacada5a 00000001]
[c513bd1b429de727/HandshakeAgent] handshake_agent.go:66: Agent terminated
[c513bd1b429de727/ParsingAgent] parse_agent.go:152: Agent terminated
[c513bd1b429de727/SendingAgent] send_agent.go:200: Agent terminated
[c513bd1b429de727/RecoveryAgent] recovery_agent.go:132: Agent terminated
[c513bd1b429de727/FlowControlAgent] flow_control_agent.go:276: Agent terminated
[c513bd1b429de727/HandshakeAgent] handshake_agent.go:161: New status HandshakeStatus{Completed=false, Error=no appropriate version found}
[c513bd1b429de727/TLSAgent] tls_agent.go:140: Agent terminated
[c513bd1b429de727/AckAgent] ack_agent.go:83: Agent terminated
[c513bd1b429de727/ClosingAgent] closing_agent.go:55: Agent terminated
[c513bd1b429de727/SocketAgent] socket_agent.go:37: Closing UDP socket because of error read udp 127.0.0.1:49640->127.0.0.1:4434: use of closed network connection
[c513bd1b429de727/SocketAgent] socket_agent.go:90: Agent terminated
[c513bd1b429de727/RTTAgent] rtt_agent.go:80: Agent terminated
[c513bd1b429de727/StreamAgent] stream_agent.go:72: Agent terminated
[c513bd1b429de727/QLogAgent] qlog_agent.go:44: Agent terminated
[c513bd1b429de727/BufferAgent] buffer_agent.go:53: Agent terminated
[c513bd1b429de727/FrameQueueAgent] frame_queue_agent.go:142: Agent terminated
panic: runtime error: invalid memory address or nil pointer dereference
[signal SIGSEGV: segmentation violation code=0x1 addr=0x0 pc=0x4b0c31]

goroutine 1 [running]:
os.(*Process).signal(0x3b9aca00?, {0x635498?, 0x632af8?})
        /usr/local/go/src/os/exec_unix.go:63 +0x31
os.(*Process).Signal(...)
        /usr/local/go/src/os/exec.go:140
github.com/QUIC-Tracker/quic-tracker.StopPcapCapture(0xc00019c400, 0xc0000ec2c0)
        /root/go/src/github.com/QUIC-Tracker/quic-tracker/pcap_capture.go:30 +0x87
github.com/QUIC-Tracker/quic-tracker.(*Trace).AddPcap(...)
        /root/go/src/github.com/QUIC-Tracker/quic-tracker/trace.go:49
main.main()
        /root/go/src/github.com/QUIC-Tracker/quic-tracker/bin/fuzzer/fuzzer_runner.go:72 +0xadd
exit status 2

exit status 1
EOF
exit status 1: [c20c05700b5bcd2d/QLogAgent] base_agent.go:49: Agent started
[c20c05700b5bcd2d/SocketAgent] base_agent.go:49: Agent started
[c20c05700b5bcd2d/ParsingAgent] base_agent.go:49: Agent started
[c20c05700b5bcd2d/BufferAgent] base_agent.go:49: Agent started
[c20c05700b5bcd2d/TLSAgent] base_agent.go:49: Agent started
[c20c05700b5bcd2d/AckAgent] base_agent.go:49: Agent started
[c20c05700b5bcd2d/SendingAgent] base_agent.go:49: Agent started
[c20c05700b5bcd2d/RecoveryAgent] base_agent.go:49: Agent started
[c20c05700b5bcd2d/RTTAgent] base_agent.go:49: Agent started
[c20c05700b5bcd2d/FrameQueueAgent] base_agent.go:49: Agent started
[c20c05700b5bcd2d/FlowControlAgent] base_agent.go:49: Agent started
[c20c05700b5bcd2d/StreamAgent] base_agent.go:49: Agent started
[c20c05700b5bcd2d/ClosingAgent] base_agent.go:49: Agent started
[c20c05700b5bcd2d/HandshakeAgent] base_agent.go:49: Agent started
[c20c05700b5bcd2d/HandshakeAgent] handshake_agent.go:58: Sending first Initial packet
[CID c20c05700b5bcd2d] connection.go:205: Sending packet {type=Initial, number=0}
[c20c05700b5bcd2d/SocketAgent] socket_agent.go:67: Received 31 bytes from UDP socket
[c20c05700b5bcd2d/RecoveryAgent] recovery_agent.go:87: Received a VN packet, emptying Initial retransmit buffer
[CID c20c05700b5bcd2d] connection.go:312: No appropriate version was found in the VN packet
[CID c20c05700b5bcd2d] connection.go:313: Versions received: [4afa4afa 00000001]
[c20c05700b5bcd2d/HandshakeAgent] handshake_agent.go:66: Agent terminated
[c20c05700b5bcd2d/RecoveryAgent] recovery_agent.go:132: Agent terminated
[c20c05700b5bcd2d/FrameQueueAgent] frame_queue_agent.go:142: Agent terminated
[c20c05700b5bcd2d/QLogAgent] qlog_agent.go:44: Agent terminated
[c20c05700b5bcd2d/SendingAgent] send_agent.go:200: Agent terminated
[c20c05700b5bcd2d/HandshakeAgent] handshake_agent.go:161: New status HandshakeStatus{Completed=false, Error=no appropriate version found}
[c20c05700b5bcd2d/RTTAgent] rtt_agent.go:80: Agent terminated
[c20c05700b5bcd2d/FlowControlAgent] flow_control_agent.go:276: Agent terminated
[c20c05700b5bcd2d/ParsingAgent] parse_agent.go:152: Agent terminated
[c20c05700b5bcd2d/BufferAgent] buffer_agent.go:53: Agent terminated
[c20c05700b5bcd2d/AckAgent] ack_agent.go:83: Agent terminated
[c20c05700b5bcd2d/StreamAgent] stream_agent.go:72: Agent terminated
[c20c05700b5bcd2d/ClosingAgent] closing_agent.go:55: Agent terminated
[c20c05700b5bcd2d/SocketAgent] socket_agent.go:37: Closing UDP socket because of error read udp 127.0.0.1:59402->127.0.0.1:4434: use of closed network connection
[c20c05700b5bcd2d/SocketAgent] socket_agent.go:90: Agent terminated
[c20c05700b5bcd2d/TLSAgent] tls_agent.go:140: Agent terminated
panic: runtime error: invalid memory address or nil pointer dereference
[signal SIGSEGV: segmentation violation code=0x1 addr=0x0 pc=0x4b0c31]

goroutine 1 [running]:
os.(*Process).signal(0x3b9aca00?, {0x635498?, 0x632af8?})
        /usr/local/go/src/os/exec_unix.go:63 +0x31
os.(*Process).Signal(...)
        /usr/local/go/src/os/exec.go:140
github.com/QUIC-Tracker/quic-tracker.StopPcapCapture(0xc00004f800, 0xc000144420)
        /root/go/src/github.com/QUIC-Tracker/quic-tracker/pcap_capture.go:30 +0x87
github.com/QUIC-Tracker/quic-tracker.(*Trace).AddPcap(...)
        /root/go/src/github.com/QUIC-Tracker/quic-tracker/trace.go:49
main.main()
        /root/go/src/github.com/QUIC-Tracker/quic-tracker/bin/fuzzer/fuzzer_runner.go:72 +0xadd
exit status 2

exit status 1
EOF
root@ubuntu:~/go/src/github.com/QUIC-Tracker/quic-tracker/bin/fuzzer#

am i missing anything here?

Distributed scanning of targets

It would be really nice if quic-tracker could also have information about the general accessibility of QUIC hosts from different ASNs, there's really no public information about that available online and the data could become really valuable for providing better service to people (for ex. selectively not sending Alt-Src to clients or e-mailing ISPs that seem to block QUIC).

Coalesce 0-RTT packets with Initial

In the 0-RTT test I see packets consistently arriving in the wrong order (0-RTT first, then Initial). It's not quite clear to me if the problem is my server or not, but it would be nice if quic-tracker could coalesce those packets together, so we wouldn't have to workaround this while debugging the 0-RTT test failures.

Changes 4 days ago created lots of crashes of scenarios

Hello, we're currently running an instance of quic-tracker via docker on our internal network. Things have been working fine for the past year, but 4 days ago we started getting a lot of a grey squares saying the test crashed.

There's no information data in the traces/dissector page, neither on the console, even though we are running things with the -debug flag set. Is there any way to get more info about the crash?

Since it's doesn't seem to be tied to any one server that's being tested. And the instance you run doesn't seem to be effected. It seems like it has something to do with the combination of the network we're running from (possibly docker?) and the new expectations you've added to the code.

New test: stateless reset

The idea would be to create a connection to the server, close it, wait a bit, then send a Short header packet using the encryption keys and connection IDs from the closed connection. If the server sends something back in response, check that is matches the stateless reset token from the previous connection.

Not sure how feasible this is though...

Installation instructions in README.rst are incorrect

Issuing go get command does not result in the package being installed:

[dmitri@ubuntu-dmitri proj]$ go get github.com/QUIC-Tracker/quic-tracker
# github.com/mpiraux/ls-qpack-go
gcc: error: ../go/src/github.com/mpiraux/ls-qpack-go/ls-qpack/libls-qpack.a: No such file or directory
gcc: error: ../go/src/github.com/mpiraux/ls-qpack-go/ls-qpack/bin/CMakeFiles/interop-encode.dir/__/deps/xxhash/xxhash.c.o: No such file or directory
# github.com/mpiraux/pigotls
gcc: error: ../go/src/github.com/mpiraux/pigotls/picotls/libpicotls-core.a: No such file or directory
gcc: error: ../go/src/github.com/mpiraux/pigotls/picotls/libpicotls-openssl.a: No such file or directory
[dmitri@ubuntu-dmitri proj]$

I use go 1.9.7

Viewing/processing test_suite results

I'm able to run the full test suite against a QUIC server, and the JSON output contains all of the details of the tests, however I'm not sure what to do with these data after the suite is complete. I was under the impression that the docker image also provided the web interface to view results, is this the case or is there another process that perhaps isn't documented?

Also as a side node, the publicly available instance https://quic-tracker.info.ucl.ac.be/traces is currently throwing exceptions when you try to view some of the trace results. For example: https://quic-tracker.info.ucl.ac.be/traces/20200729/300

New test: multi-packet ClientHello

The next draft will allow splitting ClientHello messages across Initial packets, so it'd be nice if quic-tracker had a test for it. For example, the TLS padding extension could be added to the ClientHello message by quic-tracker such that the message would be bigger than MTU.

It would also be nice if quic-tracker could swap those packets (send second packet first, then the first one after a delay), to see if the server can process that.

Runtime error on executing test_suite.go

I get the following error on executing test_suite.go
Any specific reason for this ?

starting ack_ecn against quic.tech
starting ack_only against quic.tech
starting address_validation against quic.tech
starting connection_migration against quic.tech
starting connection_migration_v4_v6 against quic.tech
starting flow_control against quic.tech
starting handshake against quic.tech
starting handshake_v6 against quic.tech
panic: runtime error: index out of range [1] with length 1
goroutine 1 [running]:
main.main()
/root/go/src/github.com/QUIC-Tracker/quic-tracker/bin/test_suite/test_suite.go:108 +0x1470
exit status 2

How to install Quic-Tracker?

Hello,
I have been trying to install the quic-tracker in VMware as per the given instructions in the README file. However, I am unable to build it.
Can you guide me on how to build it?

Interface Conversion Error

The error I'm running into is this :-

panic: interface conversion: quictracker.Frame is quictracker.MaxDataFrame, not *quictracker.MaxDataFrame

To provide context,
I have a function which receives a pointer to a frame i.e. frame *Frame. I then determine the type of the frame using (*frame).FrameType() which evaluates to MaxDataType. Following this, when I try to extract the MaximumData value using (*frame).(*MaxDataFrame).MaximumData, I run into the error above.

I'm unable to figure out the correct way of extracting MaximumData value from the frame.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.