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 }