func (d *tcpDialer) reuseDial(raddr ma.Multiaddr) (manet.Conn, error) { logdial := lgbl.Dial("conn", "", "", d.laddr, raddr) rpev := log.EventBegin(context.TODO(), "tptDialReusePort", logdial) network, netraddr, err := manet.DialArgs(raddr) if err != nil { return nil, err } con, err := d.rd.Dial(network, netraddr) if err == nil { logdial["reuseport"] = "success" rpev.Done() return manet.WrapNetConn(con) } if !ReuseErrShouldRetry(err) { logdial["reuseport"] = "failure" logdial["error"] = err rpev.Done() return nil, err } logdial["reuseport"] = "retry" logdial["error"] = err rpev.Done() return d.madialer.Dial(raddr) }
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 (gw *Gateway) listen(addr ma.Multiaddr) error { lnet, lnaddr, err := manet.DialArgs(addr) if err != nil { return err } l, err := net.Listen(lnet, lnaddr) if err != nil { return err } _, err = gw.conns.AddListener(l) if err == nil { fmt.Printf("Swarm listening on %v\n", addr) } return err }
// NewMapping attemps to construct a mapping on protocol and internal port // It will also periodically renew the mapping until the returned Mapping // -- or its parent NAT -- is Closed. // // May not succeed, and mappings may change over time; // NAT devices may not respect our port requests, and even lie. // Clients should not store the mapped results, but rather always // poll our object for the latest mappings. func (nat *NAT) NewMapping(maddr ma.Multiaddr) (Mapping, error) { if nat == nil { return nil, fmt.Errorf("no nat available") } network, addr, err := manet.DialArgs(maddr) if err != nil { return nil, fmt.Errorf("DialArgs failed on addr:", maddr.String()) } switch network { case "tcp", "tcp4", "tcp6": network = "tcp" case "udp", "udp4", "udp6": network = "udp" default: return nil, fmt.Errorf("transport not supported by NAT: %s", network) } intports := strings.Split(addr, ":")[1] intport, err := strconv.Atoi(intports) if err != nil { return nil, err } m := &mapping{ nat: nat, proto: network, intport: intport, intaddr: maddr, } m.proc = goprocess.WithTeardown(func() error { nat.rmMapping(m) return nil }) nat.addMapping(m) m.proc.AddChild(periodic.Every(MappingDuration/3, func(worker goprocess.Process) { nat.establishMapping(m) })) // do it once synchronously, so first mapping is done right away, and before exiting, // allowing users -- in the optimistic case -- to use results right after. nat.establishMapping(m) return m, nil }
func (f *Filters) AddrBlocked(a ma.Multiaddr) bool { _, addr, err := manet.DialArgs(a) if err != nil { // if we cant parse it, its probably not blocked return false } ipstr := strings.Split(addr, ":")[0] ip := net.ParseIP(ipstr) f.mu.RLock() defer f.mu.RUnlock() for _, ft := range f.filters { if ft.Contains(ip) { return true } } return false }
func manetListen(addr ma.Multiaddr) (manet.Listener, error) { network, naddr, err := manet.DialArgs(addr) if err != nil { return nil, err } if ReuseportIsAvailable() { nl, err := reuseport.Listen(network, naddr) if err == nil { // hey, it worked! return manet.WrapNetListener(nl) } // reuseport is available, but we failed to listen. log debug, and retry normally. log.Debugf("reuseport available, but failed to listen: %s %s, %s", network, naddr, err) } // either reuseport not available, or it failed. try normally. return manet.Listen(addr) }
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 IpfsStart(waitall bool) error { var addrs []string n := GetNumNodes() for i := 0; i < n; i++ { dir := IpfsDirN(i) cmd := exec.Command("ipfs", "daemon") cmd.Dir = dir cmd.Env = []string{"IPFS_PATH=" + dir} cmd.SysProcAttr = &syscall.SysProcAttr{Setsid: true} stdout, err := os.Create(path.Join(dir, "daemon.stdout")) if err != nil { return err } stderr, err := os.Create(path.Join(dir, "daemon.stderr")) if err != nil { return err } cmd.Stdout = stdout cmd.Stderr = stderr err = cmd.Start() if err != nil { return err } pid := cmd.Process.Pid fmt.Printf("Started daemon %d, pid = %d\n", i, pid) err = ioutil.WriteFile(path.Join(dir, "daemon.pid"), []byte(fmt.Sprint(pid)), 0666) if err != nil { return err } // Make sure node 0 is up before starting the rest so // bootstrapping works properly if i == 0 || waitall { cfg, err := serial.Load(path.Join(IpfsDirN(i), "config")) if err != nil { return err } maddr := ma.StringCast(cfg.Addresses.API) _, addr, err := manet.DialArgs(maddr) if err != nil { return err } addrs = append(addrs, addr) err = waitOnAPI(cfg.Identity.PeerID, addr) if err != nil { return err } } } if waitall { for i := 0; i < n; i++ { err := waitOnSwarmPeers(addrs[i]) if err != nil { return err } } } return nil }