fix some tunnel bugs like races and duplicate messages...
This commit is contained in:
parent
c1ff3ceee4
commit
2c66e94045
@ -111,25 +111,26 @@ func (t *tun) process() {
|
||||
for {
|
||||
select {
|
||||
case msg := <-t.send:
|
||||
nmsg := &transport.Message{
|
||||
Header: msg.data.Header,
|
||||
newMsg := &transport.Message{
|
||||
Header: make(map[string]string),
|
||||
Body: msg.data.Body,
|
||||
}
|
||||
|
||||
if nmsg.Header == nil {
|
||||
nmsg.Header = make(map[string]string)
|
||||
for k, v := range msg.data.Header {
|
||||
newMsg.Header[k] = v
|
||||
}
|
||||
|
||||
// set the tunnel id on the outgoing message
|
||||
nmsg.Header["Micro-Tunnel-Id"] = msg.id
|
||||
newMsg.Header["Micro-Tunnel-Id"] = msg.id
|
||||
|
||||
// set the session id
|
||||
nmsg.Header["Micro-Tunnel-Session"] = msg.session
|
||||
newMsg.Header["Micro-Tunnel-Session"] = msg.session
|
||||
|
||||
// send the message via the interface
|
||||
t.RLock()
|
||||
for _, link := range t.links {
|
||||
link.Send(nmsg)
|
||||
log.Debugf("Sending %+v to %s", newMsg, link.Remote())
|
||||
link.Send(newMsg)
|
||||
}
|
||||
t.RUnlock()
|
||||
case <-t.closed:
|
||||
@ -170,6 +171,7 @@ func (t *tun) listen(link transport.Socket, listener bool) {
|
||||
var s *socket
|
||||
var exists bool
|
||||
|
||||
log.Debugf("Received %+v from %s", msg, link.Remote())
|
||||
// if its a local listener then we use that as the session id
|
||||
// e.g we're using a loopback connecting to ourselves
|
||||
if listener {
|
||||
@ -189,10 +191,12 @@ func (t *tun) listen(link transport.Socket, listener bool) {
|
||||
|
||||
// no socket in existence
|
||||
if !exists {
|
||||
log.Debugf("Skipping")
|
||||
// drop it, we don't care about
|
||||
// messages we don't know about
|
||||
continue
|
||||
}
|
||||
log.Debugf("Using socket %s %s", s.id, s.session)
|
||||
|
||||
// is the socket closed?
|
||||
select {
|
||||
@ -398,6 +402,7 @@ func (t *tun) Init(opts ...Option) error {
|
||||
|
||||
// Dial an address
|
||||
func (t *tun) Dial(addr string) (Conn, error) {
|
||||
log.Debugf("Tunnel dialing %s", addr)
|
||||
c, ok := t.newSocket(addr, t.newSession())
|
||||
if !ok {
|
||||
return nil, errors.New("error dialing " + addr)
|
||||
@ -413,6 +418,7 @@ func (t *tun) Dial(addr string) (Conn, error) {
|
||||
|
||||
// Accept a connection on the address
|
||||
func (t *tun) Listen(addr string) (Listener, error) {
|
||||
log.Debugf("Tunnel listening on %s", addr)
|
||||
// create a new socket by hashing the address
|
||||
c, ok := t.newSocket(addr, "listener")
|
||||
if !ok {
|
||||
|
@ -48,9 +48,6 @@ func (t *tunListener) process() {
|
||||
wait: make(chan bool),
|
||||
}
|
||||
|
||||
// first message
|
||||
sock.recv <- m
|
||||
|
||||
// save the socket
|
||||
conns[m.session] = sock
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user