[tor-commits] [snowflake/master] move endWebRTC() mostly into webRTCConn.Close()
serene at torproject.org
serene at torproject.org
Fri Mar 4 21:22:52 UTC 2016
commit 5edac195f640237dffab21beffc755a588faef57
Author: Serene Han <keroserene+git at gmail.com>
Date: Fri Feb 26 14:35:15 2016 -0800
move endWebRTC() mostly into webRTCConn.Close()
---
client/snowflake.go | 18 +++++++-----------
client/webrtc.go | 45 +++++++++++++++++++++++++++++++++++----------
2 files changed, 42 insertions(+), 21 deletions(-)
diff --git a/client/snowflake.go b/client/snowflake.go
index 2c40796..25ccfef 100644
--- a/client/snowflake.go
+++ b/client/snowflake.go
@@ -46,6 +46,8 @@ func copyLoop(a, b net.Conn) {
wg.Done()
}()
wg.Wait()
+ // a.Close()
+ // b.Close()
log.Println("copy loop ended")
}
@@ -79,16 +81,8 @@ func endWebRTC() {
if nil == webrtcRemote {
return
}
- if nil != webrtcRemote.snowflake {
- s := webrtcRemote.snowflake
- webrtcRemote.snowflake = nil
- log.Printf("WebRTC: closing DataChannel")
- s.Close()
- }
- if nil != webrtcRemote.pc {
- log.Printf("WebRTC: closing PeerConnection")
- webrtcRemote.pc.Close()
- }
+ webrtcRemote.Close()
+ webrtcRemote = nil
}
// Establish a WebRTC channel for SOCKS connections.
@@ -116,6 +110,7 @@ func handler(conn *pt.SocksConn) error {
// TODO: Make SOCKS acceptance more independent from WebRTC so they can
// be more easily interchanged.
copyLoop(conn, remote)
+ // <-remote.endChannel
log.Println("----END---")
return nil
}
@@ -123,8 +118,9 @@ func handler(conn *pt.SocksConn) error {
func acceptLoop(ln *pt.SocksListener) error {
defer ln.Close()
for {
- log.Println("SOCKS listening...")
+ log.Println("SOCKS listening...", ln)
conn, err := ln.AcceptSocks()
+ log.Println("accepting", conn, err)
if err != nil {
if e, ok := err.(net.Error); ok && e.Temporary() {
continue
diff --git a/client/webrtc.go b/client/webrtc.go
index d60f212..2388e9a 100644
--- a/client/webrtc.go
+++ b/client/webrtc.go
@@ -19,6 +19,7 @@ type webRTCConn struct {
offerChannel chan *webrtc.SessionDescription
answerChannel chan *webrtc.SessionDescription
errorChannel chan error
+ endChannel chan struct{}
recvPipe *io.PipeReader
writePipe *io.PipeWriter
buffer bytes.Buffer
@@ -45,8 +46,25 @@ func (c *webRTCConn) Write(b []byte) (int, error) {
}
func (c *webRTCConn) Close() error {
- // Data channel closed implicitly?
- return c.pc.Close()
+ var err error = nil
+ log.Printf("WebRTC: Closing")
+ if nil != c.snowflake {
+ s := c.snowflake
+ c.snowflake = nil
+ log.Printf("WebRTC: closing DataChannel")
+ s.Close()
+ }
+ if nil != c.pc {
+ log.Printf("WebRTC: closing PeerConnection")
+ err = c.pc.Close()
+ c.pc = nil
+ }
+ close(c.offerChannel)
+ close(c.answerChannel)
+ close(c.errorChannel)
+ // c.writePipe.Close()
+ // c.recvPipe.Close()
+ return err
}
func (c *webRTCConn) LocalAddr() net.Addr {
@@ -77,6 +95,7 @@ func NewWebRTCConnection(config *webrtc.Configuration,
connection.offerChannel = make(chan *webrtc.SessionDescription, 1)
connection.answerChannel = make(chan *webrtc.SessionDescription, 1)
connection.errorChannel = make(chan error, 1)
+ connection.endChannel = make(chan struct{}, 1)
connection.reset = make(chan struct{}, 1)
// Log every few seconds.
@@ -100,13 +119,13 @@ func (c *webRTCConn) ConnectLoop() {
// PeerConnection won't need to be re-prepared each time.
c.preparePeerConnection()
err := c.establishDataChannel()
- if err == nil {
+ if err != nil {
+ log.Println("WebRTC: Could not establish DataChannel.")
+ } else {
c.sendOffer()
c.receiveAnswer()
<-c.reset
log.Println(" --- snowflake connection reset ---")
- } else {
- log.Println("WebRTC: Could not establish DataChannel.")
}
}
}
@@ -172,7 +191,7 @@ func (c *webRTCConn) establishDataChannel() error {
if nil != c.snowflake {
panic("PeerConnection snowflake already exists.")
}
- // Flush the buffer if necessary.
+ // Flush buffered outgoing SOCKS data if necessary.
if c.buffer.Len() > 0 {
dc.Send(c.buffer.Bytes())
log.Println("Flushed", c.buffer.Len(), "bytes.")
@@ -186,10 +205,16 @@ func (c *webRTCConn) establishDataChannel() error {
// Future writes will go to the buffer until a new DataChannel is available.
log.Println("WebRTC: DataChannel.OnClose")
// Only reset if this OnClose was triggered remotely.
- if nil != c.snowflake {
- c.snowflake = nil
- c.Reset()
+ if nil == c.snowflake {
+ panic("Should not have nil snowflake before closing. ")
}
+ c.snowflake = nil
+ // TODO: Need a way to update the circuit so that when a new WebRTC
+ // data channel is available, the relay actually recognizes the new
+ // snowflake?
+ c.Reset()
+ // c.Close()
+ // c.endChannel <- struct{}{}
}
dc.OnMessage = func(msg []byte) {
// log.Println("ONMESSAGE: ", len(msg))
@@ -214,7 +239,6 @@ func (c *webRTCConn) establishDataChannel() error {
// Block until an offer is available, then send it to either
// the Broker or signal pipe.
func (c *webRTCConn) sendOffer() error {
- log.Println("sendOffer...")
select {
case offer := <-c.offerChannel:
if "" == brokerURL {
@@ -254,6 +278,7 @@ func (c *webRTCConn) receiveAnswer() {
log.Printf("Received Answer:\n\n%s\n", answer.Sdp)
err := c.pc.SetRemoteDescription(answer)
if nil != err {
+ log.Printf("webrtc: Unable to SetRemoteDescription.")
c.errorChannel <- err
}
}()
More information about the tor-commits
mailing list