Skip to content

Commit abda156

Browse files
committed
underlay: fix NetworkManager syncer for virtual interfaces (#2988)
1 parent ec17b73 commit abda156

File tree

1 file changed

+52
-46
lines changed

1 file changed

+52
-46
lines changed

pkg/daemon/nm_linux.go

+52-46
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package daemon
22

33
import (
4+
"strings"
45
"sync"
56

67
"github.com/kubeovn/gonetworkmanager/v2"
@@ -11,12 +12,11 @@ import (
1112
)
1213

1314
type networkManagerSyncer struct {
14-
manager gonetworkmanager.NetworkManager
15-
workqueue workqueue.Interface
16-
devicePaths *strset.Set
17-
pathMap map[string]string
18-
bridgeMap map[string]string
19-
lock sync.Mutex
15+
manager gonetworkmanager.NetworkManager
16+
workqueue workqueue.Interface
17+
devices *strset.Set
18+
bridgeMap map[string]string
19+
lock sync.Mutex
2020
}
2121

2222
func newNetworkManagerSyncer() *networkManagerSyncer {
@@ -40,8 +40,7 @@ func newNetworkManagerSyncer() *networkManagerSyncer {
4040

4141
syncer.manager = manager
4242
syncer.workqueue = workqueue.NewNamed("NetworkManagerSyncer")
43-
syncer.devicePaths = strset.New()
44-
syncer.pathMap = make(map[string]string)
43+
syncer.devices = strset.New()
4544
syncer.bridgeMap = make(map[string]string)
4645
return syncer
4746
}
@@ -60,17 +59,12 @@ func (n *networkManagerSyncer) Run(handler func(nic, bridge string, delNonExiste
6059
ch := n.manager.Subscribe()
6160
defer n.manager.Unsubscribe()
6261

63-
stateChange := gonetworkmanager.DeviceInterface + "." + gonetworkmanager.ActiveConnectionSignalStateChanged
62+
suffix := "." + gonetworkmanager.ActiveConnectionSignalStateChanged
6463
for {
6564
event := <-ch
66-
67-
n.lock.Lock()
68-
if len(event.Body) == 0 || event.Name != stateChange || !n.devicePaths.Has(string(event.Path)) {
69-
n.lock.Unlock()
65+
if len(event.Body) == 0 || !strings.HasSuffix(event.Name, suffix) {
7066
continue
7167
}
72-
n.lock.Unlock()
73-
7468
state, ok := event.Body[0].(uint32)
7569
if !ok {
7670
klog.Warningf("failed to convert %#v to uint32", event.Body[0])
@@ -80,8 +74,39 @@ func (n *networkManagerSyncer) Run(handler func(nic, bridge string, delNonExiste
8074
continue
8175
}
8276

83-
klog.Infof("adding dbus object path %s to workqueue", event.Path)
84-
n.workqueue.Add(string(event.Path))
77+
devices, err := n.manager.GetDevices()
78+
if err != nil {
79+
klog.Errorf("failed to get NetworkManager devices: %v", err)
80+
continue
81+
}
82+
83+
var device gonetworkmanager.Device
84+
for _, dev := range devices {
85+
if dev.GetPath() == event.Path {
86+
device = dev
87+
break
88+
}
89+
}
90+
if device == nil {
91+
klog.Warningf("NetworkManager device %s not found", event.Path)
92+
continue
93+
}
94+
95+
name, err := device.GetPropertyIpInterface()
96+
if err != nil {
97+
klog.Errorf("failed to get IP interface of device %s: %v", device.GetPath(), err)
98+
continue
99+
}
100+
101+
n.lock.Lock()
102+
if !n.devices.Has(name) {
103+
n.lock.Unlock()
104+
continue
105+
}
106+
n.lock.Unlock()
107+
108+
klog.Infof("adding device %s to workqueue", name)
109+
n.workqueue.Add(name)
85110
}
86111
}()
87112
}
@@ -93,23 +118,18 @@ func (n *networkManagerSyncer) ProcessNextItem(handler func(nic, bridge string,
93118
}
94119
defer n.workqueue.Done(item)
95120

96-
klog.Infof("process dbus object path %v", item)
97-
path := item.(string)
121+
klog.Infof("process device %v", item)
122+
123+
nic := item.(string)
124+
var bridge string
98125
n.lock.Lock()
99-
if !n.devicePaths.Has(path) {
126+
if !n.devices.Has(nic) {
100127
n.lock.Unlock()
101128
return true
102129
}
103-
var nic string
104-
for k, v := range n.pathMap {
105-
if v == path {
106-
nic = k
107-
break
108-
}
109-
}
130+
bridge = n.bridgeMap[nic]
110131
n.lock.Unlock()
111132

112-
bridge := n.bridgeMap[nic]
113133
if _, err := handler(nic, bridge, true); err != nil {
114134
klog.Errorf("failed to handle NetworkManager event for device %s with bridge %s: %v", nic, bridge, err)
115135
}
@@ -123,23 +143,10 @@ func (n *networkManagerSyncer) AddDevice(nicName, bridge string) error {
123143
}
124144

125145
n.lock.Lock()
126-
defer n.lock.Unlock()
127-
128-
if _, ok := n.pathMap[nicName]; ok {
129-
return nil
130-
}
131-
132-
device, err := n.manager.GetDeviceByIpIface(nicName)
133-
if err != nil {
134-
klog.Errorf("failed to get device by IP iface %q: %v", nicName, err)
135-
return err
136-
}
137-
138-
path := string(device.GetPath())
139-
klog.V(3).Infof("adding device %s with dbus object path %s and bridge %s", nicName, path, bridge)
140-
n.devicePaths.Add(path)
141-
n.pathMap[nicName] = path
146+
klog.V(3).Infof("adding device %s with bridge %s", nicName, bridge)
147+
n.devices.Add(nicName)
142148
n.bridgeMap[nicName] = bridge
149+
n.lock.Unlock()
143150

144151
return nil
145152
}
@@ -150,8 +157,7 @@ func (n *networkManagerSyncer) RemoveDevice(nicName string) error {
150157
}
151158

152159
n.lock.Lock()
153-
n.devicePaths.Remove(n.pathMap[nicName])
154-
delete(n.pathMap, nicName)
160+
n.devices.Remove(nicName)
155161
delete(n.bridgeMap, nicName)
156162
n.lock.Unlock()
157163

0 commit comments

Comments
 (0)