From eb6bb7d15d12563bc64a4d0b67f6f7ea689c671f Mon Sep 17 00:00:00 2001 From: KusakabeSi Date: Sun, 2 Jan 2022 19:00:54 +0000 Subject: [PATCH] Allow exact IP, update error msg, fix getIFIndex --- gencfg/gencfgNM.go | 28 ++++++++++++++++++++++++++++ tap/tap.go | 3 +++ tap/tap_linux.go | 13 +++++++------ 3 files changed, 38 insertions(+), 6 deletions(-) diff --git a/gencfg/gencfgNM.go b/gencfg/gencfgNM.go index 22a6dcb..0813e45 100644 --- a/gencfg/gencfgNM.go +++ b/gencfg/gencfgNM.go @@ -192,7 +192,35 @@ func GenNMCfg(NMCinfigPath string, enableP2P bool, printExample bool) (err error if enableP2P { econfig.NextHopTable = make(mtypes.NextHopTable) } + ModeIDmax := 0 + for id, _ := range NMCfg.NetworkName { + if ModeIDmax < id { + ModeIDmax = id + } + } + IPv4Block := NMCfg.EdgeNode.IPv4Range + if IPv4Block != "" { + _, _, err = tap.GetIP(4, IPv4Block, uint32(ModeIDmax)) + if err != nil { + return err + } + } + IPv6Block := NMCfg.EdgeNode.IPv6Range + if IPv6Block != "" { + _, _, err = tap.GetIP(6, IPv6Block, uint32(ModeIDmax)) + if err != nil { + return err + } + } + + IPv6LLBlock := NMCfg.EdgeNode.IPv6LLRange + if IPv6LLBlock != "" { + _, _, err = tap.GetIP(6, IPv6LLBlock, uint32(ModeIDmax)) + if err != nil { + return err + } + } econfig.DynamicRoute.NTPConfig.Servers = make([]string, 0) econfig.DynamicRoute.SuperNode.PSKey = "" econfig.DynamicRoute.SuperNode.EndpointV4 = "" diff --git a/tap/tap.go b/tap/tap.go index edc3ced..a6c4190 100644 --- a/tap/tap.go +++ b/tap/tap.go @@ -55,6 +55,9 @@ func GetIP(version int, netcidr string, uid uint32) (net.IP, net.IPMask, error) } } ones, bits := the_net.Mask.Size() + if ones == bits { + return the_net.IP, the_net.Mask, nil + } maxuid := big.NewInt(1) maxuid.Lsh(maxuid, uint((bits - ones))) ip_use := big.NewInt(int64(uid)) diff --git a/tap/tap_linux.go b/tap/tap_linux.go index bd2e854..e75b137 100644 --- a/tap/tap_linux.go +++ b/tap/tap_linux.go @@ -291,19 +291,19 @@ func (tap *NativeTap) addIPAddr(version string, ip net.IP, mask net.IPMask) (err e := exec.Command("ip", "addr", "add", ip.String()+"/"+masklen, "dev", name) ret, err := e.CombinedOutput() if err != nil { - fmt.Println("Please make sure `ip` tool installed") + fmt.Printf("Failed to set ip %v to interface %v, please make sure `ip` tool installed\n", ip.String()+"/"+masklen, name) return fmt.Errorf(string(ret)) } } else if version == "6ll" { _, llnet, _ := net.ParseCIDR("fe80::/64") - if llnet.Contains(ip) == false { + if !llnet.Contains(ip) { return fmt.Errorf("%v is not a link-local address", ip) } e := exec.Command("ip", "addr", "add", ip.String()+"/64", "dev", name) ret, err := e.CombinedOutput() if err != nil { - fmt.Println("Please make sure `ip` tool installed") + fmt.Printf("Failed to set ip %v to interface %v, please make sure `ip` tool installed\n", ip.String()+"/64", name) return fmt.Errorf(string(ret)) } } @@ -330,8 +330,9 @@ func (tap *NativeTap) setUp() (err error) { func getIFIndex(name string) (ret int32, err error) { var ifr [ifReqSize]byte + copy(ifr[:unix.IFNAMSIZ], name) // 0-16 err = ioctlRequest(unix.SIOCGIFINDEX, uintptr(unsafe.Pointer(&ifr[0]))) - return *(*int32)(unsafe.Pointer(&ifr[unix.IFNAMSIZ])), nil + return *(*int32)(unsafe.Pointer(&ifr[unix.IFNAMSIZ])), err } func (tap *NativeTap) setMTU(n uint16) (err error) { @@ -359,7 +360,7 @@ func (tap *NativeTap) MTU() (int, error) { copy(ifr[:], name) err = ioctlRequest(unix.SIOCGIFMTU, uintptr(unsafe.Pointer(&ifr[0]))) - return int(*(*int32)(unsafe.Pointer(&ifr[unix.IFNAMSIZ]))), nil + return int(*(*int32)(unsafe.Pointer(&ifr[unix.IFNAMSIZ]))), err } func (tap *NativeTap) Name() (string, error) { @@ -558,7 +559,7 @@ func CreateTAPFromFile(file *os.File, iconfig mtypes.InterfaceConf, NodeID mtype e := exec.Command("ip", "addr", "flush", "dev", tapname) _, err := e.CombinedOutput() if err != nil { - fmt.Println("Please make sure `ip` tool installed") + fmt.Printf("Failed to flush ip from interface %v , please make sure `ip` tool installed\n", tapname) return nil, err } cidrstr := iconfig.IPv6LLPrefix