mirror of
https://github.com/status-im/status-go.git
synced 2025-02-27 14:10:54 +00:00
Update vendor Integrate rendezvous into status node Add a test with failover using rendezvous Use multiple servers in client Use discovery V5 by default and test that node can be started with rendezvous discovet Fix linter Update rendezvous client to one with instrumented stream Address feedback Fix test with updated topic limits Apply several suggestions Change log to debug for request errors because we continue execution Remove web3js after rebase Update rendezvous package
166 lines
4.1 KiB
Go
166 lines
4.1 KiB
Go
package yamux
|
|
|
|
import (
|
|
"encoding/binary"
|
|
"fmt"
|
|
)
|
|
|
|
type YamuxError struct {
|
|
msg string
|
|
}
|
|
|
|
func (ye YamuxError) Error() string {
|
|
return ye.msg
|
|
}
|
|
|
|
var (
|
|
// ErrInvalidVersion means we received a frame with an
|
|
// invalid version
|
|
ErrInvalidVersion = &YamuxError{"invalid protocol version"}
|
|
|
|
// ErrInvalidMsgType means we received a frame with an
|
|
// invalid message type
|
|
ErrInvalidMsgType = &YamuxError{"invalid msg type"}
|
|
|
|
// ErrSessionShutdown is used if there is a shutdown during
|
|
// an operation
|
|
ErrSessionShutdown = &YamuxError{"session shutdown"}
|
|
|
|
// ErrStreamsExhausted is returned if we have no more
|
|
// stream ids to issue
|
|
ErrStreamsExhausted = &YamuxError{"streams exhausted"}
|
|
|
|
// ErrDuplicateStream is used if a duplicate stream is
|
|
// opened inbound
|
|
ErrDuplicateStream = &YamuxError{"duplicate stream initiated"}
|
|
|
|
// ErrReceiveWindowExceeded indicates the window was exceeded
|
|
ErrRecvWindowExceeded = &YamuxError{"recv window exceeded"}
|
|
|
|
// ErrTimeout is used when we reach an IO deadline
|
|
ErrTimeout = &YamuxError{"i/o deadline reached"}
|
|
|
|
// ErrStreamClosed is returned when using a closed stream
|
|
ErrStreamClosed = &YamuxError{"stream closed"}
|
|
|
|
// ErrUnexpectedFlag is set when we get an unexpected flag
|
|
ErrUnexpectedFlag = &YamuxError{"unexpected flag"}
|
|
|
|
// ErrRemoteGoAway is used when we get a go away from the other side
|
|
ErrRemoteGoAway = &YamuxError{"remote end is not accepting connections"}
|
|
|
|
// ErrConnectionReset is sent if a stream is reset. This can happen
|
|
// if the backlog is exceeded, or if there was a remote GoAway.
|
|
ErrConnectionReset = &YamuxError{"stream reset"}
|
|
|
|
// ErrConnectionWriteTimeout indicates that we hit the "safety valve"
|
|
// timeout writing to the underlying stream connection.
|
|
ErrConnectionWriteTimeout = &YamuxError{"connection write timeout"}
|
|
|
|
// ErrKeepAliveTimeout is sent if a missed keepalive caused the stream close
|
|
ErrKeepAliveTimeout = &YamuxError{"keepalive timeout"}
|
|
)
|
|
|
|
const (
|
|
// protoVersion is the only version we support
|
|
protoVersion uint8 = 0
|
|
)
|
|
|
|
const (
|
|
// Data is used for data frames. They are followed
|
|
// by length bytes worth of payload.
|
|
typeData uint8 = iota
|
|
|
|
// WindowUpdate is used to change the window of
|
|
// a given stream. The length indicates the delta
|
|
// update to the window.
|
|
typeWindowUpdate
|
|
|
|
// Ping is sent as a keep-alive or to measure
|
|
// the RTT. The StreamID and Length value are echoed
|
|
// back in the response.
|
|
typePing
|
|
|
|
// GoAway is sent to terminate a session. The StreamID
|
|
// should be 0 and the length is an error code.
|
|
typeGoAway
|
|
)
|
|
|
|
const (
|
|
// SYN is sent to signal a new stream. May
|
|
// be sent with a data payload
|
|
flagSYN uint16 = 1 << iota
|
|
|
|
// ACK is sent to acknowledge a new stream. May
|
|
// be sent with a data payload
|
|
flagACK
|
|
|
|
// FIN is sent to half-close the given stream.
|
|
// May be sent with a data payload.
|
|
flagFIN
|
|
|
|
// RST is used to hard close a given stream.
|
|
flagRST
|
|
)
|
|
|
|
const (
|
|
// initialStreamWindow is the initial stream window size
|
|
initialStreamWindow uint32 = 256 * 1024
|
|
)
|
|
|
|
const (
|
|
// goAwayNormal is sent on a normal termination
|
|
goAwayNormal uint32 = iota
|
|
|
|
// goAwayProtoErr sent on a protocol error
|
|
goAwayProtoErr
|
|
|
|
// goAwayInternalErr sent on an internal error
|
|
goAwayInternalErr
|
|
)
|
|
|
|
const (
|
|
sizeOfVersion = 1
|
|
sizeOfType = 1
|
|
sizeOfFlags = 2
|
|
sizeOfStreamID = 4
|
|
sizeOfLength = 4
|
|
headerSize = sizeOfVersion + sizeOfType + sizeOfFlags +
|
|
sizeOfStreamID + sizeOfLength
|
|
)
|
|
|
|
type header []byte
|
|
|
|
func (h header) Version() uint8 {
|
|
return h[0]
|
|
}
|
|
|
|
func (h header) MsgType() uint8 {
|
|
return h[1]
|
|
}
|
|
|
|
func (h header) Flags() uint16 {
|
|
return binary.BigEndian.Uint16(h[2:4])
|
|
}
|
|
|
|
func (h header) StreamID() uint32 {
|
|
return binary.BigEndian.Uint32(h[4:8])
|
|
}
|
|
|
|
func (h header) Length() uint32 {
|
|
return binary.BigEndian.Uint32(h[8:12])
|
|
}
|
|
|
|
func (h header) String() string {
|
|
return fmt.Sprintf("Vsn:%d Type:%d Flags:%d StreamID:%d Length:%d",
|
|
h.Version(), h.MsgType(), h.Flags(), h.StreamID(), h.Length())
|
|
}
|
|
|
|
func (h header) encode(msgType uint8, flags uint16, streamID uint32, length uint32) {
|
|
h[0] = protoVersion
|
|
h[1] = msgType
|
|
binary.BigEndian.PutUint16(h[2:4], flags)
|
|
binary.BigEndian.PutUint32(h[4:8], streamID)
|
|
binary.BigEndian.PutUint32(h[8:12], length)
|
|
}
|