mirror of https://gogs.blitter.com/RLabs/xs
(non-working) begin of total tunnel redesign
This commit is contained in:
parent
fcbdb77c79
commit
8ee0aea0b4
|
@ -45,18 +45,47 @@ const (
|
|||
// This indicate channel-related or internal errors
|
||||
type CSExtendedCode uint32
|
||||
|
||||
// Channel Status Op bytes - to distinguish packet types
|
||||
// Channel Status/Op bytes - packet types
|
||||
const (
|
||||
// Main connection/session control
|
||||
CSONone = iota // No error, normal packet
|
||||
CSOHmacInvalid // HMAC mismatch detected on remote end
|
||||
CSOTermSize // set term size (rows:cols)
|
||||
CSOTunReq // client tunnel open request (dstport)
|
||||
CSOTunAck // server tunnel open ack (tunport)
|
||||
CSOTunData // packet contains [rport:data]
|
||||
CSOTunClose // request to close connection (tunnel stays open)
|
||||
CSOTunRefused // tunnel has died or could not be established to rport
|
||||
CSOExitStatus // Remote cmd exit status
|
||||
CSOChaff // Dummy packet, do not pass beyond decryption
|
||||
|
||||
// Tunnel setup/control/status
|
||||
CSOTunSetup // client -> server tunnel setup request (dstport)
|
||||
CSOTunInUse // server -> client: tunnel rport is in use
|
||||
CSOTunSetupAck // server -> client tunnel setup ack
|
||||
CSOTunAccept // client -> server: tunnel client got an Accept()
|
||||
// (Do we need a CSOTunAcceptAck server->client?)
|
||||
CSOTunRefused // server -> client: tunnel rport connection refused
|
||||
CSOTunData // packet contains tunnel data [rport:data]
|
||||
CSOTunDisconn // server -> client: tunnel rport disconnected
|
||||
CSOTunHangup // client -> server: tunnel lport hung up
|
||||
)
|
||||
|
||||
// TunEndpoint.tunCtl control values
|
||||
const (
|
||||
TunCtl_AcceptedClient = 'a' // client side has accept()ed a conn
|
||||
// [CSOTunAccept]
|
||||
// status: client listen() worker accepted conn on lport
|
||||
// action:server side should dial() rport on client's behalf
|
||||
|
||||
TunCtl_LostClient = 'h' // client side has hung up
|
||||
// [CSOTunHangup]
|
||||
// status: client side conn hung up from lport
|
||||
// action:server side should hang up on rport, on client's behalf
|
||||
|
||||
TunCtl_ConnRefused = 'r' // server side couldn't complete tunnel
|
||||
// [CSOTunRefused]
|
||||
// status:server side could not dial() remote side
|
||||
|
||||
TunCtl_LostConn = 'l' // server side disconnected
|
||||
// [CSOTunDisconn]
|
||||
// status:server side lost connection to rport
|
||||
// action:client should disconnect accepted lport connection
|
||||
)
|
||||
|
||||
// Channel status Op byte type
|
||||
|
|
|
@ -810,10 +810,12 @@ func (hc Conn) Read(b []byte) (n int, err error) {
|
|||
hc.SetStatus(CSETruncCSO)
|
||||
}
|
||||
hc.Close()
|
||||
} else if ctrlStatOp == CSOTunReq {
|
||||
} else if ctrlStatOp == CSOTunSetup {
|
||||
// Client wants a tunnel set up - args [lport:rport]
|
||||
lport := binary.BigEndian.Uint16(payloadBytes)
|
||||
rport := binary.BigEndian.Uint16(payloadBytes[2:4])
|
||||
// spawn workers to listen for data and tunnel events
|
||||
// via channel comms to hc.tuns[rport].tunCtl
|
||||
startServerTunnel(&hc, lport, rport)
|
||||
} else if ctrlStatOp == CSOTunData {
|
||||
lport := binary.BigEndian.Uint16(payloadBytes)
|
||||
|
|
|
@ -43,6 +43,7 @@ type (
|
|||
Rport uint16 // Names are from client's perspective
|
||||
Lport uint16 // ... ie., RPort is on server, LPort is on client
|
||||
Peer string //net.Addr
|
||||
tunCtl chan<- rune //See TunCtl_* consts
|
||||
}
|
||||
|
||||
TunPacket struct {
|
||||
|
@ -215,8 +216,8 @@ func StartClientTunnel(hc *Conn, lport, rport uint16) {
|
|||
//fmt.Printf("[Got this through tunnel:%v]\n", bytes)
|
||||
c.Write(bytes)
|
||||
} else {
|
||||
fmt.Printf("[Channel closed? exiting client worker!]\n")
|
||||
break
|
||||
fmt.Printf("[Channel closed?]\n")
|
||||
//break
|
||||
}
|
||||
}
|
||||
}()
|
||||
|
|
Loading…
Reference in New Issue