Skip to content

Commit 449d4b1

Browse files
authored
Merge pull request #285 from sunya-ch/hotfix-rename-host-device
fix: correct interface name on host-device ADD and prevent tabu prefix
2 parents 38a216a + 2315399 commit 449d4b1

File tree

3 files changed

+87
-6
lines changed

3 files changed

+87
-6
lines changed

cni/plugins/main/multi-nic/host-device.go

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@ package main
88
import (
99
"encoding/json"
1010
"fmt"
11+
"os"
12+
"path/filepath"
1113

1214
"github.com/containernetworking/cni/pkg/types"
1315
current "github.com/containernetworking/cni/pkg/types/100"
@@ -16,6 +18,7 @@ import (
1618

1719
const (
1820
HostDeviceIPAMType = "host-device-ipam"
21+
sysBusPCI = "/sys/bus/pci/devices"
1922
)
2023

2124
type HostDeviceTypeNetConf struct {
@@ -70,7 +73,7 @@ func loadHostDeviceConf(bytes []byte, ifName string, n *NetConf, ipConfigs []*cu
7073
return confBytesArray, err
7174
}
7275
if n.IPAM.Type == HostDeviceIPAMType {
73-
ipConfig := getHostIPConfig(index, n.Masters[index])
76+
ipConfig := getHostIPConfig(index, n.Masters[index], deviceID)
7477
if ipConfig == nil {
7578
utils.Logger.Debug(fmt.Sprintf("skip %d: no host IP", index))
7679
confBytes = replaceEmptyIPAM(confBytes)
@@ -100,3 +103,30 @@ func copyHostDeviceConfig(original *HostDeviceNetConf) (*HostDeviceNetConf, erro
100103
}
101104
return copiedObject, nil
102105
}
106+
107+
func getLinkNameFromPciAddress(pciaddr string) (string, error) {
108+
netDir := filepath.Join(sysBusPCI, pciaddr, "net")
109+
if _, err := os.Lstat(netDir); err != nil {
110+
virtioNetDir := filepath.Join(sysBusPCI, pciaddr, "virtio*", "net")
111+
matches, err := filepath.Glob(virtioNetDir)
112+
if matches == nil || err != nil {
113+
return "", fmt.Errorf("no net directory under pci device %s", pciaddr)
114+
}
115+
netDir = matches[0]
116+
}
117+
return linkNameFromPath(netDir)
118+
}
119+
120+
// linkNameFromPath is modified from linkFromPath in HostDevice plugin CNI
121+
// https://github.com/containernetworking/plugins/blob/main/plugins/main/host-device/host-device.go#L499
122+
func linkNameFromPath(path string) (string, error) {
123+
entries, err := os.ReadDir(path)
124+
if err != nil {
125+
return "", fmt.Errorf("failed to read directory %s: %q", path, err)
126+
}
127+
if len(entries) > 0 {
128+
// grab the first net device
129+
return entries[0].Name(), nil
130+
}
131+
return "", fmt.Errorf("failed to find network device in path %s", path)
132+
}

cni/plugins/main/multi-nic/utils.go

Lines changed: 48 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,9 @@ package main
77

88
import (
99
"encoding/json"
10+
"log"
11+
"net"
12+
"os/exec"
1013
"strings"
1114

1215
"fmt"
@@ -85,11 +88,16 @@ func injectMaster(inData []byte, selectedNetAddrs []string, selectedMasters []st
8588
return outBytes
8689
}
8790

88-
// getHostIPConfig returns IP of host for a specific devName
89-
func getHostIPConfig(index int, devName string) *current.IPConfig {
90-
devLink, err := netlink.LinkByName(devName)
91+
// getHostIPConfig returns IP of host for a specific device ID and correct devName if needed
92+
func getHostIPConfig(index int, devName, deviceID string) *current.IPConfig {
93+
presentName, err := getLinkNameFromPciAddress(deviceID)
9194
if err != nil {
92-
utils.Logger.Debug(fmt.Sprintf("cannot find link %s: %v", devName, err))
95+
utils.Logger.Debug(fmt.Sprintf("failed to get link name from device ID %s: %v", deviceID, err))
96+
return nil
97+
}
98+
devLink, err := netlink.LinkByName(presentName)
99+
if err != nil {
100+
utils.Logger.Debug(fmt.Sprintf("cannot find link %s: %v", presentName, err))
93101
return nil
94102
}
95103
addrs, err := netlink.AddrList(devLink, netlink.FAMILY_V4)
@@ -102,5 +110,41 @@ func getHostIPConfig(index int, devName string) *current.IPConfig {
102110
Address: *addr,
103111
Interface: current.Int(index),
104112
}
113+
if devName != "" && presentName != devName {
114+
if devLink.Attrs().Flags&net.FlagUp == net.FlagUp {
115+
if err = netlink.LinkSetDown(devLink); err != nil {
116+
log.Printf("WARNING: cannot set link down: %v", err)
117+
}
118+
defer func() {
119+
_ = netlink.LinkSetUp(devLink)
120+
}()
121+
}
122+
if err = netlink.LinkSetAlias(devLink, ""); err != nil {
123+
log.Printf("WARNING: cannot reset alias: %v", err)
124+
}
125+
126+
if err = delAltName(presentName, devName); err != nil {
127+
log.Printf("WARNING: cannot del altname: %v", err)
128+
} else {
129+
log.Printf("successfully delete altname %s (%s)", devName, presentName)
130+
}
131+
132+
// correct the device to the expected name
133+
if err = netlink.LinkSetName(devLink, devName); err != nil {
134+
utils.Logger.Debug(fmt.Sprintf("failed to rename host device %s to %s: %v", presentName, devName, err))
135+
} else {
136+
utils.Logger.Debug(fmt.Sprintf("successfully rename host device %s to %s", presentName, devName))
137+
}
138+
}
105139
return ipConf
106140
}
141+
142+
// delAltName
143+
// temporary solution, need upgrade to netlink 1.3.1 for using LinkDelAltName
144+
func delAltName(presentName, devName string) error {
145+
cmd := exec.Command("ip", "link", "property", "del", "dev", presentName, "altname", devName)
146+
if err := cmd.Run(); err != nil {
147+
return err
148+
}
149+
return nil
150+
}

daemon/src/iface/iface.go

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,10 @@ type InterfaceInfoType struct {
2424
PciAddress string `json:"pciAddress"`
2525
}
2626

27+
const (
28+
zombiePrefix = "net1"
29+
)
30+
2731
var interfaceInfoCache = InitSafeCache()
2832

2933
func GetInterfaceInfoCache() map[string]InterfaceInfoType {
@@ -121,9 +125,12 @@ func GetInterfaces() []InterfaceInfoType {
121125
if err != nil {
122126
log.Printf("cannot get default subnet: %v", err)
123127
}
124-
125128
for _, netDevice := range netDevices {
126129
devName := netDevice.Name
130+
if strings.HasPrefix(devName, zombiePrefix) {
131+
log.Printf("found zombie interface name %s, skip", devName)
132+
continue
133+
}
127134
devLink, err := netlink.LinkByName(devName)
128135
if err != nil {
129136
log.Printf("cannot find link %s: %v", devName, err)

0 commit comments

Comments
 (0)