diff --git a/errorcodes/error_codes.go b/errorcodes/error_codes.go new file mode 100644 index 00000000..7f063f8a --- /dev/null +++ b/errorcodes/error_codes.go @@ -0,0 +1,32 @@ +package errorcodes + +import "github.com/lucas-clemente/quic-go/protocol" + +const ( + QUIC_NO_ERROR = protocol.ErrorCode(0) + QUIC_STREAM_DATA_AFTER_TERMINATION = protocol.ErrorCode(2) + // QUIC_SERVER_ERROR_PROCESSING_STREAM= There was some server error which halted stream processing. + // QUIC_MULTIPLE_TERMINATION_OFFSETS= The sender received two mismatching fin or reset offsets for a single stream. + // QUIC_BAD_APPLICATION_PAYLOAD= The sender received bad application data. + QUIC_INVALID_PACKET_HEADER = protocol.ErrorCode(3) + QUIC_INVALID_FRAME_DATA = protocol.ErrorCode(4) + QUIC_INVALID_FEC_DATA = protocol.ErrorCode(5) + QUIC_INVALID_RST_STREAM_DATA = protocol.ErrorCode(6) + QUIC_INVALID_CONNECTION_CLOSE_DATA = protocol.ErrorCode(7) + QUIC_INVALID_ACK_DATA = protocol.ErrorCode(9) + QUIC_DECRYPTION_FAILURE = protocol.ErrorCode(12) + QUIC_ENCRYPTION_FAILURE = protocol.ErrorCode(13) + QUIC_PACKET_TOO_LARGE = protocol.ErrorCode(14) + // QUIC_PACKET_FOR_NONEXISTENT_STREAM= Data was sent for a stream which did not exist. + // QUIC_CLIENT_GOING_AWAY= The client is going away (browser close, etc.) + // QUIC_SERVER_GOING_AWAY= The server is going away (restart etc.) + QUIC_INVALID_STREAM_ID = protocol.ErrorCode(17) + QUIC_TOO_MANY_OPEN_STREAMS = protocol.ErrorCode(18) + // QUIC_CONNECTION_TIMED_OUT= We hit our pre-negotiated (or default) timeout + QUIC_CRYPTO_TAGS_OUT_OF_ORDER = protocol.ErrorCode(29) + QUIC_CRYPTO_TOO_MANY_ENTRIES = protocol.ErrorCode(30) + QUIC_CRYPTO_INVALID_VALUE_LENGTH = protocol.ErrorCode(31) + QUIC_CRYPTO_MESSAGE_AFTER_HANDSHAKE_COMPLETE = protocol.ErrorCode(32) + QUIC_INVALID_CRYPTO_MESSAGE_TYPE = protocol.ErrorCode(33) + // QUIC_SEQUENCE_NUMBER_LIMIT_REACHED= Transmitting an additional packet would cause a packet number to be reused. +) diff --git a/server.go b/server.go index 181da035..3eb816c9 100644 --- a/server.go +++ b/server.go @@ -59,9 +59,11 @@ func (s *Server) ListenAndServe(address string) error { } data = data[:n] r := bytes.NewReader(data) + // ToDo: check packet size and send errorcodes.QUIC_PACKET_TOO_LARGE if packet is too large publicHeader, err := ParsePublicHeader(r) if err != nil { + // ToDo: send errorcodes.QUIC_INVALID_PACKET_HEADER fmt.Printf("Could not parse public header") continue } diff --git a/session.go b/session.go index 9df216ad..b1e7c6cc 100644 --- a/session.go +++ b/session.go @@ -8,6 +8,7 @@ import ( "net" "sync" + "github.com/lucas-clemente/quic-go/errorcodes" "github.com/lucas-clemente/quic-go/frames" "github.com/lucas-clemente/quic-go/handshake" "github.com/lucas-clemente/quic-go/protocol" @@ -140,6 +141,7 @@ func (s *Session) HandlePacket(addr *net.UDPAddr, publicHeaderBinary []byte, pub err = fmt.Errorf("unknown frame type: %x", typeByte) } if err != nil { + s.Close(errorcodes.QUIC_INVALID_FRAME_DATA) return err } } @@ -228,6 +230,14 @@ func (s *Session) handleRstStreamFrame(r *bytes.Reader) error { return nil } +// Close closes the connection by sending a ConnectionClose frame +func (s *Session) Close(errorCode protocol.ErrorCode) error { + frame := &frames.ConnectionCloseFrame{ + ErrorCode: errorCode, + } + return s.SendFrame(frame) +} + // SendFrame sends a frame to the client func (s *Session) SendFrame(frame frames.Frame) error { streamframe, ok := frame.(*frames.StreamFrame)