@@ -10,18 +10,23 @@ import (
1010)
1111
1212const (
13- HeaderPong uint16 = 0x0006
14- HeaderPing uint16 = 0x0007
15- HeaderPhase uint16 = 0x0008
16- HeaderKeyResponse uint16 = 0x000A
17- HeaderKeyChallenge uint16 = 0x000B
18- HeaderKeyComplete uint16 = 0x000C
13+ HeaderPong uint16 = 0x0006
14+ HeaderPing uint16 = 0x0007
15+ HeaderPhase uint16 = 0x0008
16+ HeaderKeyResponse uint16 = 0x000A
17+ HeaderKeyChallenge uint16 = 0x000B
18+ HeaderKeyComplete uint16 = 0x000C
19+ HeaderStateChecker uint16 = 0x000F
20+ HeaderRespondChannelStatus uint16 = 0x0010
21+ ChannelStatusNormal uint8 = 1
1922
2023 keySize = 32
2124 challengeSize = 32
2225 challengeResponseSize = 32
2326 encryptedTokenSize = 48
2427 nonceSize = 24
28+ channelStatusSize = 3
29+ channelStatusCountSize = 4
2530 keyChallengePayloadLen = keySize + challengeSize + 4
2631 keyResponsePayloadLen = keySize + challengeResponseSize
2732 keyCompletePayloadLen = encryptedTokenSize + nonceSize
@@ -57,6 +62,17 @@ type KeyCompletePacket struct {
5762 Nonce [nonceSize ]byte
5863}
5964
65+ type StateCheckerPacket struct {}
66+
67+ type ChannelStatus struct {
68+ Port int16
69+ Status uint8
70+ }
71+
72+ type RespondChannelStatusPacket struct {
73+ Channels []ChannelStatus
74+ }
75+
6076func EncodePhase (phase session.Phase ) ([]byte , error ) {
6177 value , err := encodePhaseValue (phase )
6278 if err != nil {
@@ -99,6 +115,68 @@ func EncodePong() []byte {
99115 return frame .Encode (HeaderPong , nil )
100116}
101117
118+ func EncodeStateChecker () []byte {
119+ return frame .Encode (HeaderStateChecker , nil )
120+ }
121+
122+ func DecodeStateChecker (f frame.Frame ) (StateCheckerPacket , error ) {
123+ if f .Header != HeaderStateChecker {
124+ return StateCheckerPacket {}, ErrUnexpectedHeader
125+ }
126+
127+ if len (f .Payload ) != 0 {
128+ return StateCheckerPacket {}, ErrInvalidPayload
129+ }
130+
131+ return StateCheckerPacket {}, nil
132+ }
133+
134+ func EncodeRespondChannelStatus (packet RespondChannelStatusPacket ) []byte {
135+ payload := make ([]byte , channelStatusCountSize + len (packet .Channels )* channelStatusSize )
136+ binary .LittleEndian .PutUint32 (payload [:channelStatusCountSize ], uint32 (len (packet .Channels )))
137+
138+ offset := channelStatusCountSize
139+ for _ , channel := range packet .Channels {
140+ binary .LittleEndian .PutUint16 (payload [offset :offset + 2 ], uint16 (channel .Port ))
141+ payload [offset + 2 ] = channel .Status
142+ offset += channelStatusSize
143+ }
144+
145+ return frame .Encode (HeaderRespondChannelStatus , payload )
146+ }
147+
148+ func DecodeRespondChannelStatus (f frame.Frame ) (RespondChannelStatusPacket , error ) {
149+ if f .Header != HeaderRespondChannelStatus {
150+ return RespondChannelStatusPacket {}, ErrUnexpectedHeader
151+ }
152+
153+ if len (f .Payload ) < channelStatusCountSize {
154+ return RespondChannelStatusPacket {}, ErrInvalidPayload
155+ }
156+
157+ count := binary .LittleEndian .Uint32 (f .Payload [:channelStatusCountSize ])
158+ if count > uint32 ((len (f .Payload )- channelStatusCountSize )/ channelStatusSize ) {
159+ return RespondChannelStatusPacket {}, ErrInvalidPayload
160+ }
161+
162+ expectedLen := channelStatusCountSize + int (count )* channelStatusSize
163+ if len (f .Payload ) != expectedLen {
164+ return RespondChannelStatusPacket {}, ErrInvalidPayload
165+ }
166+
167+ packet := RespondChannelStatusPacket {Channels : make ([]ChannelStatus , int (count ))}
168+ offset := channelStatusCountSize
169+ for i := range packet .Channels {
170+ packet .Channels [i ] = ChannelStatus {
171+ Port : int16 (binary .LittleEndian .Uint16 (f .Payload [offset : offset + 2 ])),
172+ Status : f .Payload [offset + 2 ],
173+ }
174+ offset += channelStatusSize
175+ }
176+
177+ return packet , nil
178+ }
179+
102180func EncodeKeyChallenge (packet KeyChallengePacket ) []byte {
103181 payload := make ([]byte , keyChallengePayloadLen )
104182 copy (payload [0 :keySize ], packet .ServerPublicKey [:])
0 commit comments