Files
cloudpods/pkg/util/netutils2/defgw.go
2025-08-06 22:01:55 +08:00

100 lines
2.2 KiB
Go

// Copyright 2019 Yunion
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package netutils2
import (
"yunion.io/x/log"
"yunion.io/x/pkg/util/netutils"
)
type SNicInfo struct {
IpAddr string
Gateway string
Ip6Addr string
Gateway6 string
MacAddr string
IsDefault bool
}
type SNicInfoList []SNicInfo
func (nics SNicInfoList) Add(mac, ip, gw, ip6, gw6 string, isDefault bool) SNicInfoList {
return append(nics, SNicInfo{
IpAddr: ip,
MacAddr: mac,
Gateway: gw,
Ip6Addr: ip6,
Gateway6: gw6,
IsDefault: isDefault,
})
}
func (nics SNicInfoList) FindDefaultNicMac() (string, int) {
var intMac, exitMac, defMac string
var intIdx, exitIdx, defIdx int
for i, nic := range nics {
if len(nic.IpAddr) == 0 && len(nic.Ip6Addr) == 0 {
continue
}
if len(nic.IpAddr) > 0 && len(nic.Gateway) == 0 {
continue
}
if len(nic.Ip6Addr) > 0 && len(nic.Gateway6) == 0 {
continue
}
var isExit bool
if len(nic.IpAddr) > 0 {
addr, err := netutils.NewIPV4Addr(nic.IpAddr)
if err != nil {
log.Errorf("NewIPV4Addr %s fail %s", nic.IpAddr, err)
continue
}
isExit = netutils.IsExitAddress(addr)
}
if len(exitMac) == 0 || len(intMac) == 0 || len(defMac) == 0 {
if len(exitMac) == 0 && isExit {
exitMac = nic.MacAddr
exitIdx = i
}
if len(intMac) == 0 && !isExit {
intMac = nic.MacAddr
intIdx = i
}
if len(defMac) == 0 && nic.IsDefault && !isExit {
defMac = nic.MacAddr
defIdx = i
}
} else if len(exitMac) > 0 && len(intMac) > 0 && len(defMac) > 0 {
break
}
}
if len(exitMac) > 0 {
return exitMac, exitIdx
}
if len(defMac) > 0 {
return defMac, defIdx
}
if len(intMac) > 0 {
return intMac, intIdx
}
return "", -1
}