Ejemplo n.º 1
0
Archivo: mask.go Proyecto: rht/ipget
func ConvertIPNet(n *net.IPNet) (string, error) {
	addr, err := manet.FromIP(n.IP)
	if err != nil {
		return "", err
	}

	b, _ := n.Mask.Size()
	return fmt.Sprintf("%s/ipcidr/%d", addr, b), nil
}
Ejemplo n.º 2
0
Archivo: nat.go Proyecto: rht/ipget
func (m *mapping) ExternalAddr() (ma.Multiaddr, error) {
	if time.Now().Sub(m.cacheTime) < CacheTime {
		return m.cached, nil
	}

	if m.ExternalPort() == 0 { // dont even try right now.
		return nil, ErrNoMapping
	}

	ip, err := m.nat.nat.GetExternalAddress()
	if err != nil {
		return nil, err
	}

	ipmaddr, err := manet.FromIP(ip)
	if err != nil {
		return nil, fmt.Errorf("error parsing ip")
	}

	// call m.ExternalPort again, as mapping may have changed under our feet. (tocttou)
	extport := m.ExternalPort()
	if extport == 0 {
		return nil, ErrNoMapping
	}

	tcp, err := ma.NewMultiaddr(fmt.Sprintf("/%s/%d", m.Protocol(), extport))
	if err != nil {
		return nil, err
	}

	maddr2 := ipmaddr.Encapsulate(tcp)

	m.cached = maddr2
	m.cacheTime = time.Now()
	return maddr2, nil
}