mirror of
https://github.com/bjdgyc/anylink.git
synced 2025-08-08 23:48:03 +08:00
添加 github.com/pion/dtls 代码
This commit is contained in:
50
dtls-2.0.9/pkg/protocol/handshake/header.go
Normal file
50
dtls-2.0.9/pkg/protocol/handshake/header.go
Normal file
@@ -0,0 +1,50 @@
|
||||
package handshake
|
||||
|
||||
import (
|
||||
"encoding/binary"
|
||||
|
||||
"github.com/pion/dtls/v2/internal/util"
|
||||
)
|
||||
|
||||
// HeaderLength msg_len for Handshake messages assumes an extra
|
||||
// 12 bytes for sequence, fragment and version information vs TLS
|
||||
const HeaderLength = 12
|
||||
|
||||
// Header is the static first 12 bytes of each RecordLayer
|
||||
// of type Handshake. These fields allow us to support message loss, reordering, and
|
||||
// message fragmentation,
|
||||
//
|
||||
// https://tools.ietf.org/html/rfc6347#section-4.2.2
|
||||
type Header struct {
|
||||
Type Type
|
||||
Length uint32 // uint24 in spec
|
||||
MessageSequence uint16
|
||||
FragmentOffset uint32 // uint24 in spec
|
||||
FragmentLength uint32 // uint24 in spec
|
||||
}
|
||||
|
||||
// Marshal encodes the Header
|
||||
func (h *Header) Marshal() ([]byte, error) {
|
||||
out := make([]byte, HeaderLength)
|
||||
|
||||
out[0] = byte(h.Type)
|
||||
util.PutBigEndianUint24(out[1:], h.Length)
|
||||
binary.BigEndian.PutUint16(out[4:], h.MessageSequence)
|
||||
util.PutBigEndianUint24(out[6:], h.FragmentOffset)
|
||||
util.PutBigEndianUint24(out[9:], h.FragmentLength)
|
||||
return out, nil
|
||||
}
|
||||
|
||||
// Unmarshal populates the header from encoded data
|
||||
func (h *Header) Unmarshal(data []byte) error {
|
||||
if len(data) < HeaderLength {
|
||||
return errBufferTooSmall
|
||||
}
|
||||
|
||||
h.Type = Type(data[0])
|
||||
h.Length = util.BigEndianUint24(data[1:])
|
||||
h.MessageSequence = binary.BigEndian.Uint16(data[4:])
|
||||
h.FragmentOffset = util.BigEndianUint24(data[6:])
|
||||
h.FragmentLength = util.BigEndianUint24(data[9:])
|
||||
return nil
|
||||
}
|
Reference in New Issue
Block a user