github.com/zignig/go-ipfs@v0.0.0-20141111235910-c9e5fdf55a52/net/handshake/handshake3.go (about)

     1  package handshake
     2  
     3  import (
     4  	"fmt"
     5  
     6  	pb "github.com/jbenet/go-ipfs/net/handshake/pb"
     7  	peer "github.com/jbenet/go-ipfs/peer"
     8  	u "github.com/jbenet/go-ipfs/util"
     9  
    10  	ma "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multiaddr"
    11  )
    12  
    13  var log = u.Logger("handshake")
    14  
    15  // Handshake3Msg constructs a Handshake3 msg.
    16  func Handshake3Msg(localPeer peer.Peer, remoteAddr ma.Multiaddr) *pb.Handshake3 {
    17  	var msg pb.Handshake3
    18  	// don't need publicKey after secure channel.
    19  	// msg.PublicKey = localPeer.PubKey().Bytes()
    20  
    21  	// local listen addresses
    22  	addrs := localPeer.Addresses()
    23  	msg.ListenAddrs = make([][]byte, len(addrs))
    24  	for i, a := range addrs {
    25  		msg.ListenAddrs[i] = a.Bytes()
    26  	}
    27  
    28  	// observed remote address
    29  	msg.ObservedAddr = remoteAddr.Bytes()
    30  
    31  	// services
    32  	// srv := localPeer.Services()
    33  	// msg.Services = make([]mux.ProtocolID, len(srv))
    34  	// for i, pid := range srv {
    35  	// 	msg.Services[i] = pid
    36  	// }
    37  
    38  	return &msg
    39  }
    40  
    41  // Handshake3Update updates local knowledge with the information in the
    42  // handshake3 msg we received from remote client.
    43  func Handshake3Update(lpeer, rpeer peer.Peer, msg *pb.Handshake3) (*Handshake3Result, error) {
    44  	res := &Handshake3Result{}
    45  
    46  	// our observed address
    47  	observedAddr, err := ma.NewMultiaddrBytes(msg.GetObservedAddr())
    48  	if err != nil {
    49  		return res, err
    50  	}
    51  	if lpeer.AddAddress(observedAddr) {
    52  		log.Infof("(nat) added new local, remote-observed address: %s", observedAddr)
    53  	}
    54  	res.LocalObservedAddress = observedAddr
    55  
    56  	// remote's reported addresses
    57  	for _, a := range msg.GetListenAddrs() {
    58  		addr, err := ma.NewMultiaddrBytes(a)
    59  		if err != nil {
    60  			err = fmt.Errorf("remote peer address not a multiaddr: %s", err)
    61  			log.Errorf("Handshake3 error %s", err)
    62  			return res, err
    63  		}
    64  		rpeer.AddAddress(addr)
    65  		res.RemoteListenAddresses = append(res.RemoteListenAddresses, addr)
    66  	}
    67  
    68  	return res, nil
    69  }
    70  
    71  // Handshake3Result collects the knowledge gained in Handshake3.
    72  type Handshake3Result struct {
    73  
    74  	// The addresses reported by the remote client
    75  	RemoteListenAddresses []ma.Multiaddr
    76  
    77  	// The address of the remote client we observed in this connection
    78  	RemoteObservedAddress ma.Multiaddr
    79  
    80  	// The address the remote client observed from this connection
    81  	LocalObservedAddress ma.Multiaddr
    82  }