From 36e47d8d8d7eed5226bd4ba93108d7137d429bc6 Mon Sep 17 00:00:00 2001 From: Abhishek Kondur Date: Fri, 28 Oct 2022 17:08:50 +0530 Subject: [PATCH] get free ip fix --- nm-proxy/proxy/wireguard.go | 36 +++++++++++++++++++++++++++--------- nm-proxy/stun/stun.go | 3 +++ nm-proxy/wg/wg.go | 7 ++++++- 3 files changed, 36 insertions(+), 10 deletions(-) diff --git a/nm-proxy/proxy/wireguard.go b/nm-proxy/proxy/wireguard.go index 80541665..b9242d5f 100644 --- a/nm-proxy/proxy/wireguard.go +++ b/nm-proxy/proxy/wireguard.go @@ -2,11 +2,13 @@ package proxy import ( "context" + "errors" "fmt" "log" "net" "runtime" "strconv" + "strings" "github.com/c-robinson/iplib" "github.com/gravitl/netmaker/nm-proxy/common" @@ -102,13 +104,19 @@ func (p *Proxy) Start(remoteConn net.Conn) error { p.RemoteConn = remoteConn var err error - + // err = p.Config.WgInterface.GetWgIface(p.Config.WgInterface.Name) + // if err != nil { + // log.Println("Failed to get iface: ", p.Config.WgInterface.Name, err) + // return err + // } wgPort, err := p.Config.WgInterface.GetListenPort() if err != nil { log.Printf("Failed to get listen port for iface: %s,Err: %v\n", p.Config.WgInterface.Name, err) return err } - addr, err := GetFreeIp("127.0.0.1/8", *wgPort) + p.Config.WgInterface.Port = *wgPort + log.Printf("----> WGIFACE: %+v\n", p.Config.WgInterface) + addr, err := GetFreeIp("127.0.0.1/8", p.Config.WgInterface.Port) if err != nil { log.Println("Failed to get freeIp: ", err) return err @@ -123,10 +131,11 @@ func (p *Proxy) Start(remoteConn net.Conn) error { Port: common.NmProxyPort, }, &net.UDPAddr{ IP: net.ParseIP(wgAddr), - Port: *wgPort, + Port: p.Config.WgInterface.Port, }) if err != nil { - log.Fatalf("failed dialing to local Wireguard port,Err: %v\n", err) + log.Printf("failed dialing to local Wireguard port,Err: %v\n", err) + return err } log.Printf("Dialing to local Wireguard port %s --> %s\n", p.LocalConn.LocalAddr().String(), p.LocalConn.RemoteAddr().String()) @@ -143,6 +152,9 @@ func (p *Proxy) Start(remoteConn net.Conn) error { func GetFreeIp(cidrAddr string, dstPort int) (string, error) { //ensure AddressRange is valid + if dstPort == 0 { + return "", errors.New("dst port should be set") + } if _, _, err := net.ParseCIDR(cidrAddr); err != nil { log.Println("UniqueAddress encountered an error") return "", err @@ -165,15 +177,21 @@ func GetFreeIp(cidrAddr string, dstPort int) (string, error) { IP: net.ParseIP("127.0.0.1"), Port: dstPort, }) + if err != nil { + log.Println("----> GetFreeIP ERR: ", err) + if strings.Contains(err.Error(), "can't assign requested address") { + newAddrs, err = net4.NextIP(newAddrs) + if err != nil { + return "", err + } + } else { + return "", err + } + } if err == nil { conn.Close() return newAddrs.String(), nil } - newAddrs, err = net4.NextIP(newAddrs) - if err != nil { - return "", err - } - } } diff --git a/nm-proxy/stun/stun.go b/nm-proxy/stun/stun.go index 6dd58553..b15a66b6 100644 --- a/nm-proxy/stun/stun.go +++ b/nm-proxy/stun/stun.go @@ -64,3 +64,6 @@ func GetHostInfo() (info HostInfo) { } return } + +// /tmp/netclient daemon > /tmp/netclient.out 2>&1 +// tcpdump -evvvttttni any 'udp port 51820' diff --git a/nm-proxy/wg/wg.go b/nm-proxy/wg/wg.go index 6e0559e8..a0212378 100644 --- a/nm-proxy/wg/wg.go +++ b/nm-proxy/wg/wg.go @@ -61,7 +61,12 @@ func (w *WGIface) GetWgIface(iface string) error { if err != nil { return err } - wgClient.Device(iface) + dev, err := wgClient.Device(iface) + if err != nil { + return err + } + log.Printf("----> DEVICE: %+v\n", dev) + return nil }