-
Notifications
You must be signed in to change notification settings - Fork 0
/
quic_raw.go
104 lines (80 loc) · 3.21 KB
/
quic_raw.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
package quic
// 2021/04: mostly commented out, using the H3 library directly ( with a smaller patch).
// May need it back for performance.
// 2020/09:
// - still not merged mtls patch for HTTP3,
// - missing push
// - low level QUIC works great !!!
// Modified QUIC, using a hack specific to Android P2P to work around its limitations.
// Also adds instrumentation (expvar)
// v2: if wifi connection is DIRECT-, client will listen on 0xFF.. multicast on port+1.
// AP: if destination zone is p2p, will use the MC address and port+1 when dialing
// multiple connections may use different ports - MC is next port. Requires knowing
// the dest is the AP - recorded during discovery.
// AP: as server, if zone is p2p, use port+1 an MC.
// AP: as client, same process - the GW will have a port+1
// v3: bypass QUIC and avoid the hack, create a dedicated UDP bridge.
// should work with both h2 and QUIC, including envoy.
// AP-client: connect to localhost:XXXX (one port per client). Ap client port different.
// Client-AP: connect localhost:5221 (reserved).
// AP listens on UDP:5222, Client on TCP/UDP 127.0.0.1:5221 and UDP :5220
// Need to implement wifi-like ACK for each packet - this seems to be the main problem
// with broadcast. A second problem is the power/bw.
/*
Low level quic:
- stream: StreamID, reader, cancelRead, SetReadDeadline
writer+closer, CancelWrite, SetWriteDeadline
-
*/
/*
env variable for debug:
Mint:
- MINT_LOG=*|crypto,handshake,negotiation,io,frame,verbose
Client:
- QUIC_GO_LOG_LEVEL=debug|info|error
*/
/*
Notes on the mint library:
- supports AES-GCM with 12-bytes TAG, required by QUIC (aes12 packet)
- fnv-1a hash - for older version (may be used in chrome), unprotected packets hash
- quic-go-certificates - common compressed certs
- buffer_pool.go - receive buffer pooled. Client also uses same
-
Code:
- main receive loop server.go/serve() ->
Packet:
0x80 - long header = 1
0x40 - has connection id, true in all cases for us
Includes binaries for client-linux-debug from chrome (quic-clients)
Alternative - minimal, also simpler: https://github.com/bifurcation/mint
No h2, but we may not need this.
*/
/*
May 2018: quic uses mint. client-state-machine implements the handshake.
- without insecureSkipVerify, uses RootCAs, ServerName in x509 cert.Verify(VerifyOptions)
- either way, calls VerifyPeerCertificate
*/
// tlsconfig.hostname can override the SNI
//ctls.VerifyPeerCertificate = verify(destHost)
//qtorig := &h2quic.RoundTripper{
// // RoundTripStart: h2.QuicDialer,
//
// TLSClientConfig: tlsConf,
//
// QuicConfig: quickConfig(),
// // holds a map of clients by hostname
//}
// TODO: initial handshake (WorkloadID, POST for messages, etc)
// TODO: Quick stream has an explicit CancelWrite that sends RST, and Close
// sends FIN.
// H3 spec:
// - CONNECT is not allowed to have path or scheme
// - we should use CONNECT
// - each stream starts with a 'type' (int)
// - Frame format: type(i) len(i) val
// -
// QUIC_GO_LOG_LEVEL
//if streams.MetricsClientTransportWrapper != nil {
// qrtt = streams.MetricsClientTransportWrapper(qrtt)
//}
// -------- Wrappers around quic structs to intercept and modify the routing using multicast -----------