Browse Source

Add missing quic-go source files

Rod Hynes 7 years ago
parent
commit
9a56ee6368

+ 1 - 1
vendor/github.com/lucas-clemente/quic-go/Changelog.md

@@ -1,6 +1,6 @@
 # Changelog
 
-## v0.8.0 (unreleased)
+## v0.8.0 (2018-06-26)
 
 - Add support for unidirectional streams (for IETF QUIC).
 - Add a `quic.Config` option for the maximum number of incoming streams.

+ 96 - 0
vendor/github.com/lucas-clemente/quic-go/client_multiplexer.go

@@ -0,0 +1,96 @@
+package quic
+
+import (
+	"bytes"
+	"net"
+	"strings"
+	"sync"
+	"time"
+
+	"github.com/lucas-clemente/quic-go/internal/protocol"
+	"github.com/lucas-clemente/quic-go/internal/utils"
+	"github.com/lucas-clemente/quic-go/internal/wire"
+)
+
+var (
+	clientMuxerOnce sync.Once
+	clientMuxer     *clientMultiplexer
+)
+
+// The clientMultiplexer listens on multiple net.PacketConns and dispatches
+// incoming packets to the session handler.
+type clientMultiplexer struct {
+	mutex sync.Mutex
+
+	conns map[net.PacketConn]packetHandlerManager
+
+	logger utils.Logger
+}
+
+func getClientMultiplexer() *clientMultiplexer {
+	clientMuxerOnce.Do(func() {
+		clientMuxer = &clientMultiplexer{
+			conns:  make(map[net.PacketConn]packetHandlerManager),
+			logger: utils.DefaultLogger.WithPrefix("client muxer"),
+		}
+	})
+	return clientMuxer
+}
+
+func (m *clientMultiplexer) Add(c net.PacketConn, connID protocol.ConnectionID, handler packetHandler) {
+	m.mutex.Lock()
+	defer m.mutex.Unlock()
+	sessions, ok := m.conns[c]
+	if !ok {
+		sessions = newPacketHandlerMap()
+		m.conns[c] = sessions
+	}
+	sessions.Add(connID, handler)
+	if ok {
+		return
+	}
+
+	// If we didn't know this packet conn before, listen for incoming packets
+	// and dispatch them to the right sessions.
+	go m.listen(c, sessions)
+}
+
+func (m *clientMultiplexer) listen(c net.PacketConn, sessions packetHandlerManager) {
+	for {
+		data := *getPacketBuffer()
+		data = data[:protocol.MaxReceivePacketSize]
+		// The packet size should not exceed protocol.MaxReceivePacketSize bytes
+		// If it does, we only read a truncated packet, which will then end up undecryptable
+		n, addr, err := c.ReadFrom(data)
+		if err != nil {
+			if !strings.HasSuffix(err.Error(), "use of closed network connection") {
+				sessions.Close(err)
+			}
+			return
+		}
+		data = data[:n]
+		rcvTime := time.Now()
+
+		r := bytes.NewReader(data)
+		hdr, err := wire.ParseHeaderSentByServer(r)
+		// drop the packet if we can't parse the header
+		if err != nil {
+			m.logger.Debugf("error parsing packet from %s: %s", addr, err)
+			continue
+		}
+		hdr.Raw = data[:len(data)-r.Len()]
+		packetData := data[len(data)-r.Len():]
+
+		client, ok := sessions.Get(hdr.DestConnectionID)
+		if !ok {
+			m.logger.Debugf("received a packet with an unexpected connection ID %s", hdr.DestConnectionID)
+			continue
+		}
+		client.handlePacket(&receivedPacket{
+			remoteAddr: addr,
+			header:     hdr,
+			data:       packetData,
+			rcvTime:    rcvTime,
+		})
+	}
+}

+ 78 - 0
vendor/github.com/lucas-clemente/quic-go/packet_handler_map.go

@@ -0,0 +1,78 @@
+package quic
+
+import (
+	"sync"
+	"time"
+
+	"github.com/lucas-clemente/quic-go/internal/protocol"
+)
+
+// The packetHandlerMap stores packetHandlers, identified by connection ID.
+// It is used:
+// * by the server to store sessions
+// * when multiplexing outgoing connections to store clients
+type packetHandlerMap struct {
+	mutex sync.RWMutex
+
+	handlers map[string] /* string(ConnectionID)*/ packetHandler
+	closed   bool
+
+	deleteClosedSessionsAfter time.Duration
+}
+
+var _ packetHandlerManager = &packetHandlerMap{}
+
+func newPacketHandlerMap() packetHandlerManager {
+	return &packetHandlerMap{
+		handlers:                  make(map[string]packetHandler),
+		deleteClosedSessionsAfter: protocol.ClosedSessionDeleteTimeout,
+	}
+}
+
+func (h *packetHandlerMap) Get(id protocol.ConnectionID) (packetHandler, bool) {
+	h.mutex.RLock()
+	sess, ok := h.handlers[string(id)]
+	h.mutex.RUnlock()
+	return sess, ok
+}
+
+func (h *packetHandlerMap) Add(id protocol.ConnectionID, handler packetHandler) {
+	h.mutex.Lock()
+	h.handlers[string(id)] = handler
+	h.mutex.Unlock()
+}
+
+func (h *packetHandlerMap) Remove(id protocol.ConnectionID) {
+	h.mutex.Lock()
+	h.handlers[string(id)] = nil
+	h.mutex.Unlock()
+
+	time.AfterFunc(h.deleteClosedSessionsAfter, func() {
+		h.mutex.Lock()
+		delete(h.handlers, string(id))
+		h.mutex.Unlock()
+	})
+}
+
+func (h *packetHandlerMap) Close(err error) {
+	h.mutex.Lock()
+	if h.closed {
+		h.mutex.Unlock()
+		return
+	}
+	h.closed = true
+
+	var wg sync.WaitGroup
+	for _, handler := range h.handlers {
+		if handler != nil {
+			wg.Add(1)
+			go func(handler packetHandler) {
+				// session.Close() blocks until the CONNECTION_CLOSE has been sent and the run-loop has stopped
+				_ = handler.Close(err)
+				wg.Done()
+			}(handler)
+		}
+	}
+	h.mutex.Unlock()
+	wg.Wait()
+}

+ 21 - 21
vendor/vendor.json

@@ -123,10 +123,10 @@
 			"revisionTime": "2017-10-27T16:34:21Z"
 		},
 		{
-			"checksumSHA1": "bmA5gu03Z9vpvTxj2Jb2DEJMhTs=",
+			"checksumSHA1": "26ynUbB0vZuG+xhYS8+61i5+Ds0=",
 			"path": "github.com/lucas-clemente/quic-go",
-			"revision": "3aa6c99943fdcd448b02f22eaecfd26ca59bb0de",
-			"revisionTime": "2018-06-25T13:05:42Z"
+			"revision": "3f9212b5f73c2679268447584e76cd7c9edf8e98",
+			"revisionTime": "2018-06-27T02:56:43Z"
 		},
 		{
 			"checksumSHA1": "OA9E+y7g05x/mWJJHmA7oPxWKQo=",
@@ -137,56 +137,56 @@
 		{
 			"checksumSHA1": "q5Mmgdu/11zEFx8Qew7wt0BvR34=",
 			"path": "github.com/lucas-clemente/quic-go/internal/ackhandler",
-			"revision": "3aa6c99943fdcd448b02f22eaecfd26ca59bb0de",
-			"revisionTime": "2018-06-25T13:05:42Z"
+			"revision": "3f9212b5f73c2679268447584e76cd7c9edf8e98",
+			"revisionTime": "2018-06-27T02:56:43Z"
 		},
 		{
 			"checksumSHA1": "i1yfut7QQqMehw5yE9llhWNnrxk=",
 			"path": "github.com/lucas-clemente/quic-go/internal/congestion",
-			"revision": "3aa6c99943fdcd448b02f22eaecfd26ca59bb0de",
-			"revisionTime": "2018-06-25T13:05:42Z"
+			"revision": "3f9212b5f73c2679268447584e76cd7c9edf8e98",
+			"revisionTime": "2018-06-27T02:56:43Z"
 		},
 		{
 			"checksumSHA1": "8CRRInUpwdxqXFGWnrW1KTUYOUE=",
 			"path": "github.com/lucas-clemente/quic-go/internal/crypto",
-			"revision": "3aa6c99943fdcd448b02f22eaecfd26ca59bb0de",
-			"revisionTime": "2018-06-25T13:05:42Z"
+			"revision": "3f9212b5f73c2679268447584e76cd7c9edf8e98",
+			"revisionTime": "2018-06-27T02:56:43Z"
 		},
 		{
 			"checksumSHA1": "rnRicg73lPAeRh9Nko6a0CZQS5I=",
 			"path": "github.com/lucas-clemente/quic-go/internal/flowcontrol",
-			"revision": "3aa6c99943fdcd448b02f22eaecfd26ca59bb0de",
-			"revisionTime": "2018-06-25T13:05:42Z"
+			"revision": "3f9212b5f73c2679268447584e76cd7c9edf8e98",
+			"revisionTime": "2018-06-27T02:56:43Z"
 		},
 		{
 			"checksumSHA1": "VDAmO1aQcHrZGfHBolw4bMjlCIo=",
 			"path": "github.com/lucas-clemente/quic-go/internal/handshake",
-			"revision": "3aa6c99943fdcd448b02f22eaecfd26ca59bb0de",
-			"revisionTime": "2018-06-25T13:05:42Z"
+			"revision": "3f9212b5f73c2679268447584e76cd7c9edf8e98",
+			"revisionTime": "2018-06-27T02:56:43Z"
 		},
 		{
 			"checksumSHA1": "WcERuY6LQVVwsulsp733jXwSXrE=",
 			"path": "github.com/lucas-clemente/quic-go/internal/protocol",
-			"revision": "3aa6c99943fdcd448b02f22eaecfd26ca59bb0de",
-			"revisionTime": "2018-06-25T13:05:42Z"
+			"revision": "3f9212b5f73c2679268447584e76cd7c9edf8e98",
+			"revisionTime": "2018-06-27T02:56:43Z"
 		},
 		{
 			"checksumSHA1": "0vSbWIQ7O34u4kDMR+FHr7/FINk=",
 			"path": "github.com/lucas-clemente/quic-go/internal/utils",
-			"revision": "3aa6c99943fdcd448b02f22eaecfd26ca59bb0de",
-			"revisionTime": "2018-06-25T13:05:42Z"
+			"revision": "3f9212b5f73c2679268447584e76cd7c9edf8e98",
+			"revisionTime": "2018-06-27T02:56:43Z"
 		},
 		{
 			"checksumSHA1": "XffpGTFqeLH70f+ToHMqmmt4wjE=",
 			"path": "github.com/lucas-clemente/quic-go/internal/wire",
-			"revision": "3aa6c99943fdcd448b02f22eaecfd26ca59bb0de",
-			"revisionTime": "2018-06-25T13:05:42Z"
+			"revision": "3f9212b5f73c2679268447584e76cd7c9edf8e98",
+			"revisionTime": "2018-06-27T02:56:43Z"
 		},
 		{
 			"checksumSHA1": "bFSC4TOZGOZGBJEFmLAT3V4ieoo=",
 			"path": "github.com/lucas-clemente/quic-go/qerr",
-			"revision": "3aa6c99943fdcd448b02f22eaecfd26ca59bb0de",
-			"revisionTime": "2018-06-25T13:05:42Z"
+			"revision": "3f9212b5f73c2679268447584e76cd7c9edf8e98",
+			"revisionTime": "2018-06-27T02:56:43Z"
 		},
 		{
 			"checksumSHA1": "sY8sshVIEXnJgg3S6C5FcN33Vq4=",