Skip to content

Commit 7838a92

Browse files
committed
kcp: introduce rekey support
1 parent 8d368db commit 7838a92

File tree

10 files changed

+985
-49
lines changed

10 files changed

+985
-49
lines changed

tsshd/bus.go

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,8 @@ func handleBusEvent(stream Stream) {
129129
err = handleAliveEvent(stream, heartbeatTimeout, intervalTime)
130130
case "setting":
131131
err = handleSettingEvent(stream)
132+
case "rekey":
133+
err = handleRekeyEvent(stream)
132134
default:
133135
if err := handleUnknownEvent(stream, command); err != nil {
134136
warning("handle bus command [%s] failed: %v. You may need to upgrade tsshd.", command, err)
@@ -220,6 +222,14 @@ func handleSettingEvent(stream Stream) error {
220222
return nil
221223
}
222224

225+
func handleRekeyEvent(stream Stream) error {
226+
var msg rekeyMessage
227+
if err := recvMessage(stream, &msg); err != nil {
228+
return fmt.Errorf("recv rekey message failed: %v", err)
229+
}
230+
return globalProtoServer.handleRekeyEvent(&msg)
231+
}
232+
223233
func handleUnknownEvent(stream Stream, command string) error {
224234
var msg struct{}
225235
if err := recvMessage(stream, &msg); err != nil {

tsshd/client.go

Lines changed: 26 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -136,11 +136,7 @@ func NewSshUdpClient(opts *UdpClientOptions) (*SshUdpClient, error) {
136136
return nil, err
137137
}
138138

139-
mtu := uint16(0)
140-
if opts.ProxyClient != nil {
141-
mtu = opts.ProxyClient.GetMaxDatagramSize()
142-
}
143-
udpClient.protoClient, err = newProtoClient(tsshdAddr, opts.ServerInfo, mtu, opts.ConnectTimeout)
139+
udpClient.protoClient, err = newProtoClient(udpClient, opts, tsshdAddr)
144140
if err != nil {
145141
return nil, err
146142
}
@@ -426,6 +422,10 @@ func (c *SshUdpClient) GetLastReconnectError() error {
426422
// GetMaxDatagramSize returns the maximum payload size (in bytes) that
427423
// can be sent in a single datagram over this SshUdpClient.
428424
func (c *SshUdpClient) GetMaxDatagramSize() uint16 {
425+
return getMaxDatagramSizeFunc(c)
426+
}
427+
428+
var getMaxDatagramSizeFunc = func(c *SshUdpClient) uint16 {
429429
return c.protoClient.getUdpForwarder().conn.GetMaxDatagramSize()
430430
}
431431

@@ -519,6 +519,12 @@ func (c *SshUdpClient) keepAlive(intervalTime time.Duration) {
519519
}
520520
}
521521

522+
func (c *SshUdpClient) isBusStreamInited() bool {
523+
c.busMutex.Lock()
524+
defer c.busMutex.Unlock()
525+
return c.busStream != nil
526+
}
527+
522528
func (c *SshUdpClient) sendBusCommand(command string) error {
523529
c.busMutex.Lock()
524530
defer c.busMutex.Unlock()
@@ -556,6 +562,8 @@ func (c *SshUdpClient) handleBusEvent() {
556562
c.handleAliveEvent()
557563
case "discard":
558564
c.handleDiscardEvent()
565+
case "rekey":
566+
c.handleRekeyEvent()
559567
default:
560568
if err := handleUnknownEvent(c.busStream, command); err != nil {
561569
c.warning("handle bus command [%s] failed: %v. You may need to upgrade tssh.", command, err)
@@ -665,6 +673,19 @@ func (c *SshUdpClient) handleDiscardEvent() {
665673
}
666674
}
667675

676+
func (c *SshUdpClient) handleRekeyEvent() {
677+
var msg rekeyMessage
678+
if err := recvMessage(c.busStream, &msg); err != nil {
679+
c.warning("recv rekey message failed: %v", err)
680+
return
681+
}
682+
683+
if err := c.protoClient.handleRekeyEvent(&msg); err != nil {
684+
c.warning("rekey failed: %v", err)
685+
return
686+
}
687+
}
688+
668689
// SshUdpSession represents a connection to a remote command or shell
669690
type SshUdpSession struct {
670691
id uint64

tsshd/datagram.go

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,6 @@ import (
3535
"sync/atomic"
3636
)
3737

38-
var globalUdpForwarder *udpForwarder
39-
4038
var udpForwardChannelID atomic.Uint64
4139

4240
// PacketConn represents a connection capable of sending and receiving packet-based data.
@@ -349,7 +347,7 @@ func handleDialUdpEvent(stream Stream) {
349347
}
350348

351349
id := udpForwardChannelID.Add(1)
352-
pconn := newPacketConn(stream, id, globalUdpForwarder, globalServerProxy.clientChecker)
350+
pconn := newPacketConn(stream, id, globalProtoServer.getUdpForwarder(), globalServerProxy.clientChecker)
353351

354352
resp := dialUdpResponse{ID: id}
355353
if err := sendResponse(stream, &resp); err != nil { // ack ok

0 commit comments

Comments
 (0)