// FromIP converts a net.IP type to a Multiaddr. func FromIP(ip net.IP) (ma.Multiaddr, error) { switch { case ip.To4() != nil: return ma.NewMultiaddr("/ip4/" + ip.String()) case ip.To16() != nil: return ma.NewMultiaddr("/ip6/" + ip.String()) default: return nil, errIncorrectNetAddr } }
func newMultiaddr(t *testing.T, m string) ma.Multiaddr { maddr, err := ma.NewMultiaddr(m) if err != nil { t.Fatal("failed to construct multiaddr:", m, err) } return maddr }
func TestDialArgs(t *testing.T) { test := func(e_maddr, e_nw, e_host string) { m, err := ma.NewMultiaddr(e_maddr) if err != nil { t.Fatal("failed to construct", "/ip4/127.0.0.1/udp/1234", e_maddr) } nw, host, err := DialArgs(m) if err != nil { t.Fatal("failed to get dial args", e_maddr, m, err) } if nw != e_nw { t.Error("failed to get udp network Dial Arg", e_nw, nw) } if host != e_host { t.Error("failed to get host:port Dial Arg", e_host, host) } } test("/ip4/127.0.0.1/udp/1234", "udp4", "127.0.0.1:1234") test("/ip4/127.0.0.1/tcp/4321", "tcp4", "127.0.0.1:4321") test("/ip4/127.0.0.1/udp/1234/utp", "utp4", "127.0.0.1:1234") test("/ip6/::1/udp/1234", "udp6", "[::1]:1234") test("/ip6/::1/tcp/4321", "tcp6", "[::1]:4321") test("/ip6/::1/udp/1234/utp", "utp6", "[::1]:1234") }
func TestThinWaist(t *testing.T) { addrs := map[string]bool{ "/ip4/127.0.0.1/udp/1234": true, "/ip4/127.0.0.1/tcp/1234": true, "/ip4/127.0.0.1/udp/1234/utp": true, "/ip4/127.0.0.1/udp/1234/tcp/1234": true, "/ip4/127.0.0.1/tcp/12345/ip4/1.2.3.4": true, "/ip6/::1/tcp/80": true, "/ip6/::1/udp/80": true, "/ip6/::1": true, "/ip6/::1/utp": false, "/tcp/1234/ip4/1.2.3.4": false, "/tcp/1234": false, "/tcp/1234/utp": false, "/tcp/1234/udp/1234": false, "/ip4/1.2.3.4/ip4/2.3.4.5": true, "/ip6/::1/ip4/2.3.4.5": true, } for a, res := range addrs { m, err := ma.NewMultiaddr(a) if err != nil { t.Fatalf("failed to construct Multiaddr: %s", a) } if IsThinWaist(m) != res { t.Fatalf("IsThinWaist(%s) != %v", a, res) } } }
func address(addr string) ma.Multiaddr { m, err := ma.NewMultiaddr(addr) if err != nil { die(err) } return m }
func multiaddrToNormal(addr string) (string, error) { maddr, err := ma.NewMultiaddr(addr) if err != nil { return "", err } _, host, err := manet.DialArgs(maddr) if err != nil { return "", err } return host, nil }
func getNodesAPIAddr(nnum int) (string, error) { addrb, err := ioutil.ReadFile(path.Join(IpfsDirN(nnum), "api")) if err != nil { return "", err } maddr, err := ma.NewMultiaddr(string(addrb)) if err != nil { fmt.Println("error parsing multiaddr: ", err) return "", err } _, addr, err := manet.DialArgs(maddr) if err != nil { fmt.Println("error on multiaddr dialargs: ", err) return "", err } return addr, nil }
func manetlib() { addr, err := ma.NewMultiaddr("/ip4/127.0.0.1/udp/5556/udt") if err != nil { panic(err) } list, err := manet.Listen(addr) if err != nil { panic(err) } defer list.Close() runtest( func() (net.Conn, error) { return list.Accept() }, func() (net.Conn, error) { return manet.Dial(addr) }, ) }
func testToNetAddr(t *testing.T, maddr, ntwk, addr string) { m, err := ma.NewMultiaddr(maddr) if err != nil { t.Fatal("failed to generate.") } naddr, err := ToNetAddr(m) if addr == "" { // should fail if err == nil { t.Fatalf("failed to error: %s", m) } return } // shouldn't fail if err != nil { t.Fatalf("failed to convert to net addr: %s", m) } if naddr.String() != addr { t.Fatalf("naddr.Address() == %s != %s", naddr, addr) } if naddr.Network() != ntwk { t.Fatalf("naddr.Network() == %s != %s", naddr.Network(), ntwk) } // should convert properly switch ntwk { case "tcp": _ = naddr.(*net.TCPAddr) case "udp": _ = naddr.(*net.UDPAddr) case "ip": _ = naddr.(*net.IPAddr) } }
// FromNetAddr converts a net.Addr type to a Multiaddr. func FromNetAddr(a net.Addr) (ma.Multiaddr, error) { switch a.Network() { case "tcp", "tcp4", "tcp6": ac, ok := a.(*net.TCPAddr) if !ok { return nil, errIncorrectNetAddr } // Get IP Addr ipm, err := FromIP(ac.IP) if err != nil { return nil, errIncorrectNetAddr } // Get TCP Addr tcpm, err := ma.NewMultiaddr(fmt.Sprintf("/tcp/%d", ac.Port)) if err != nil { return nil, errIncorrectNetAddr } // Encapsulate return ipm.Encapsulate(tcpm), nil case "udp", "upd4", "udp6": ac, ok := a.(*net.UDPAddr) if !ok { return nil, errIncorrectNetAddr } // Get IP Addr ipm, err := FromIP(ac.IP) if err != nil { return nil, errIncorrectNetAddr } // Get UDP Addr udpm, err := ma.NewMultiaddr(fmt.Sprintf("/udp/%d", ac.Port)) if err != nil { return nil, errIncorrectNetAddr } // Encapsulate return ipm.Encapsulate(udpm), nil case "utp", "utp4", "utp6": acc, ok := a.(*utp.Addr) if !ok { return nil, errIncorrectNetAddr } // Get UDP Addr ac, ok := acc.Addr.(*net.UDPAddr) if !ok { return nil, errIncorrectNetAddr } // Get IP Addr ipm, err := FromIP(ac.IP) if err != nil { return nil, errIncorrectNetAddr } // Get UDP Addr utpm, err := ma.NewMultiaddr(fmt.Sprintf("/udp/%d/utp", ac.Port)) if err != nil { return nil, errIncorrectNetAddr } // Encapsulate return ipm.Encapsulate(utpm), nil case "ip", "ip4", "ip6": ac, ok := a.(*net.IPAddr) if !ok { return nil, errIncorrectNetAddr } return FromIP(ac.IP) case "ip+net": ac, ok := a.(*net.IPNet) if !ok { return nil, errIncorrectNetAddr } return FromIP(ac.IP) default: return nil, fmt.Errorf("unknown network %v", a.Network()) } }