|
|
|
@ -108,12 +108,16 @@ func (nc *NatHoleController) HandleVisitor(m *msg.NatHoleVisitor, raddr *net.UDP
|
|
|
|
|
clientCfg, ok := nc.clientCfgs[m.ProxyName]
|
|
|
|
|
if !ok {
|
|
|
|
|
nc.mu.Unlock()
|
|
|
|
|
log.Debug("xtcp server for [%s] doesn't exist", m.ProxyName)
|
|
|
|
|
errInfo := fmt.Sprintf("xtcp server for [%s] doesn't exist", m.ProxyName)
|
|
|
|
|
log.Debug(errInfo)
|
|
|
|
|
nc.listener.WriteToUDP(nc.GenNatHoleResponse(nil, errInfo), raddr)
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
if m.SignKey != util.GetAuthKey(clientCfg.Sk, m.Timestamp) {
|
|
|
|
|
nc.mu.Unlock()
|
|
|
|
|
log.Debug("xtcp connection of [%s] auth failed", m.ProxyName)
|
|
|
|
|
errInfo := fmt.Sprintf("xtcp connection of [%s] auth failed", m.ProxyName)
|
|
|
|
|
log.Debug(errInfo)
|
|
|
|
|
nc.listener.WriteToUDP(nc.GenNatHoleResponse(nil, errInfo), raddr)
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -137,7 +141,7 @@ func (nc *NatHoleController) HandleVisitor(m *msg.NatHoleVisitor, raddr *net.UDP
|
|
|
|
|
// Wait client connections.
|
|
|
|
|
select {
|
|
|
|
|
case <-session.NotifyCh:
|
|
|
|
|
resp := nc.GenNatHoleResponse(raddr, session)
|
|
|
|
|
resp := nc.GenNatHoleResponse(session, "")
|
|
|
|
|
log.Trace("send nat hole response to visitor")
|
|
|
|
|
nc.listener.WriteToUDP(resp, raddr)
|
|
|
|
|
case <-time.After(time.Duration(NatHoleTimeout) * time.Second):
|
|
|
|
@ -156,16 +160,27 @@ func (nc *NatHoleController) HandleClient(m *msg.NatHoleClient, raddr *net.UDPAd
|
|
|
|
|
session.ClientAddr = raddr
|
|
|
|
|
session.NotifyCh <- struct{}{}
|
|
|
|
|
|
|
|
|
|
resp := nc.GenNatHoleResponse(raddr, session)
|
|
|
|
|
resp := nc.GenNatHoleResponse(session, "")
|
|
|
|
|
log.Trace("send nat hole response to client")
|
|
|
|
|
nc.listener.WriteToUDP(resp, raddr)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (nc *NatHoleController) GenNatHoleResponse(raddr *net.UDPAddr, session *NatHoleSession) []byte {
|
|
|
|
|
func (nc *NatHoleController) GenNatHoleResponse(session *NatHoleSession, errInfo string) []byte {
|
|
|
|
|
var (
|
|
|
|
|
sid string
|
|
|
|
|
visitorAddr string
|
|
|
|
|
clientAddr string
|
|
|
|
|
)
|
|
|
|
|
if session != nil {
|
|
|
|
|
sid = session.Sid
|
|
|
|
|
visitorAddr = session.VisitorAddr.String()
|
|
|
|
|
clientAddr = session.ClientAddr.String()
|
|
|
|
|
}
|
|
|
|
|
m := &msg.NatHoleResp{
|
|
|
|
|
Sid: session.Sid,
|
|
|
|
|
VisitorAddr: session.VisitorAddr.String(),
|
|
|
|
|
ClientAddr: session.ClientAddr.String(),
|
|
|
|
|
Sid: sid,
|
|
|
|
|
VisitorAddr: visitorAddr,
|
|
|
|
|
ClientAddr: clientAddr,
|
|
|
|
|
Error: errInfo,
|
|
|
|
|
}
|
|
|
|
|
b := bytes.NewBuffer(nil)
|
|
|
|
|
err := msg.WriteMsg(b, m)
|
|
|
|
|