func newSshClient( sshServer *sshServer, tunnelProtocol string, geoIPData GeoIPData, trafficRules TrafficRules) *sshClient { return &sshClient{ sshServer: sshServer, tunnelProtocol: tunnelProtocol, geoIPData: geoIPData, trafficRules: trafficRules, tcpTrafficState: &trafficState{}, udpTrafficState: &trafficState{}, channelHandlerWaitGroup: new(sync.WaitGroup), tcpPortForwardLRU: psiphon.NewLRUConns(), stopBroadcast: make(chan struct{}), } }
// handleUDPChannel implements UDP port forwarding. A single UDP // SSH channel follows the udpgw protocol, which multiplexes many // UDP port forwards. // // The udpgw protocol and original server implementation: // Copyright (c) 2009, Ambroz Bizjak <*****@*****.**> // https://github.com/ambrop72/badvpn // func (sshClient *sshClient) handleUDPChannel(newChannel ssh.NewChannel) { // Accept this channel immediately. This channel will replace any // previously existing UDP channel for this client. sshChannel, requests, err := newChannel.Accept() if err != nil { log.WithContextFields(LogFields{"error": err}).Warning("accept new channel failed") return } go ssh.DiscardRequests(requests) defer sshChannel.Close() sshClient.setUDPChannel(sshChannel) multiplexer := &udpPortForwardMultiplexer{ sshClient: sshClient, sshChannel: sshChannel, portForwards: make(map[uint16]*udpPortForward), portForwardLRU: psiphon.NewLRUConns(), relayWaitGroup: new(sync.WaitGroup), } multiplexer.run() }