@@ -36,9 +36,10 @@ import (
36
36
37
37
type NetConf struct {
38
38
types.NetConf
39
- Master string `json:"master"`
40
- Mode string `json:"mode"`
41
- MTU int `json:"mtu"`
39
+ Master string `json:"master"`
40
+ Mode string `json:"mode"`
41
+ MTU int `json:"mtu"`
42
+ LinkContNs bool `json:"linkInContainer,omitempty"`
42
43
}
43
44
44
45
func init () {
@@ -48,9 +49,9 @@ func init() {
48
49
runtime .LockOSThread ()
49
50
}
50
51
51
- func loadConf (bytes [] byte , cmdCheck bool ) (* NetConf , string , error ) {
52
+ func loadConf (args * skel. CmdArgs , cmdCheck bool ) (* NetConf , string , error ) {
52
53
n := & NetConf {}
53
- if err := json .Unmarshal (bytes , n ); err != nil {
54
+ if err := json .Unmarshal (args . StdinData , n ); err != nil {
54
55
return nil , "" , fmt .Errorf ("failed to load netconf: %v" , err )
55
56
}
56
57
@@ -73,8 +74,8 @@ func loadConf(bytes []byte, cmdCheck bool) (*NetConf, string, error) {
73
74
}
74
75
if n .Master == "" {
75
76
if result == nil {
76
- defaultRouteInterface , err := getDefaultRouteInterfaceName ()
77
-
77
+ var defaultRouteInterface string
78
+ defaultRouteInterface , err = getNamespacedDefaultRouteInterfaceName ( args . Netns , n . LinkContNs )
78
79
if err != nil {
79
80
return nil , "" , err
80
81
}
@@ -124,7 +125,15 @@ func createIpvlan(conf *NetConf, ifName string, netns ns.NetNS) (*current.Interf
124
125
return nil , err
125
126
}
126
127
127
- m , err := netlink .LinkByName (conf .Master )
128
+ var m netlink.Link
129
+ if conf .LinkContNs {
130
+ err = netns .Do (func (_ ns.NetNS ) error {
131
+ m , err = netlink .LinkByName (conf .Master )
132
+ return err
133
+ })
134
+ } else {
135
+ m , err = netlink .LinkByName (conf .Master )
136
+ }
128
137
if err != nil {
129
138
return nil , fmt .Errorf ("failed to lookup master %q: %v" , conf .Master , err )
130
139
}
@@ -146,8 +155,14 @@ func createIpvlan(conf *NetConf, ifName string, netns ns.NetNS) (*current.Interf
146
155
Mode : mode ,
147
156
}
148
157
149
- if err := netlink .LinkAdd (mv ); err != nil {
150
- return nil , fmt .Errorf ("failed to create ipvlan: %v" , err )
158
+ if conf .LinkContNs {
159
+ err = netns .Do (func (_ ns.NetNS ) error {
160
+ return netlink .LinkAdd (mv )
161
+ })
162
+ } else {
163
+ if err := netlink .LinkAdd (mv ); err != nil {
164
+ return nil , fmt .Errorf ("failed to create ipvlan: %v" , err )
165
+ }
151
166
}
152
167
153
168
err = netns .Do (func (_ ns.NetNS ) error {
@@ -193,8 +208,31 @@ func getDefaultRouteInterfaceName() (string, error) {
193
208
return "" , fmt .Errorf ("no default route interface found" )
194
209
}
195
210
211
+ func getNamespacedDefaultRouteInterfaceName (namespace string , inContainer bool ) (string , error ) {
212
+ if ! inContainer {
213
+ return getDefaultRouteInterfaceName ()
214
+ }
215
+ netns , err := ns .GetNS (namespace )
216
+ if err != nil {
217
+ return "" , fmt .Errorf ("failed to open netns %q: %v" , netns , err )
218
+ }
219
+ defer netns .Close ()
220
+ var defaultRouteInterface string
221
+ err = netns .Do (func (_ ns.NetNS ) error {
222
+ defaultRouteInterface , err = getDefaultRouteInterfaceName ()
223
+ if err != nil {
224
+ return err
225
+ }
226
+ return nil
227
+ })
228
+ if err != nil {
229
+ return "" , err
230
+ }
231
+ return defaultRouteInterface , nil
232
+ }
233
+
196
234
func cmdAdd (args * skel.CmdArgs ) error {
197
- n , cniVersion , err := loadConf (args . StdinData , false )
235
+ n , cniVersion , err := loadConf (args , false )
198
236
if err != nil {
199
237
return err
200
238
}
@@ -272,7 +310,7 @@ func cmdAdd(args *skel.CmdArgs) error {
272
310
}
273
311
274
312
func cmdDel (args * skel.CmdArgs ) error {
275
- n , _ , err := loadConf (args . StdinData , false )
313
+ n , _ , err := loadConf (args , false )
276
314
if err != nil {
277
315
return err
278
316
}
@@ -320,7 +358,7 @@ func main() {
320
358
321
359
func cmdCheck (args * skel.CmdArgs ) error {
322
360
323
- n , _ , err := loadConf (args . StdinData , true )
361
+ n , _ , err := loadConf (args , true )
324
362
if err != nil {
325
363
return err
326
364
}
@@ -369,7 +407,16 @@ func cmdCheck(args *skel.CmdArgs) error {
369
407
contMap .Sandbox , args .Netns )
370
408
}
371
409
372
- m , err := netlink .LinkByName (n .Master )
410
+ var m netlink.Link
411
+ if n .LinkContNs {
412
+ err = netns .Do (func (_ ns.NetNS ) error {
413
+ m , err = netlink .LinkByName (n .Master )
414
+ return err
415
+ })
416
+ } else {
417
+ m , err = netlink .LinkByName (n .Master )
418
+ }
419
+
373
420
if err != nil {
374
421
return fmt .Errorf ("failed to lookup master %q: %v" , n .Master , err )
375
422
}
0 commit comments