@@ -20,12 +20,11 @@ import (
20
20
"fmt"
21
21
"runtime"
22
22
23
- "github.com/vishvananda/netlink"
24
-
25
23
"github.com/containernetworking/cni/pkg/skel"
26
24
"github.com/containernetworking/cni/pkg/types"
27
25
current "github.com/containernetworking/cni/pkg/types/100"
28
26
"github.com/containernetworking/cni/pkg/version"
27
+ "github.com/vishvananda/netlink"
29
28
30
29
"github.com/containernetworking/plugins/pkg/ip"
31
30
"github.com/containernetworking/plugins/pkg/ipam"
@@ -35,9 +34,10 @@ import (
35
34
36
35
type NetConf struct {
37
36
types.NetConf
38
- Master string `json:"master"`
39
- VlanId int `json:"vlanId"`
40
- MTU int `json:"mtu,omitempty"`
37
+ Master string `json:"master"`
38
+ VlanId int `json:"vlanId"`
39
+ MTU int `json:"mtu,omitempty"`
40
+ LinkContNs bool `json:"linkInContainer,omitempty"`
41
41
}
42
42
43
43
func init () {
@@ -47,9 +47,9 @@ func init() {
47
47
runtime .LockOSThread ()
48
48
}
49
49
50
- func loadConf (bytes [] byte ) (* NetConf , string , error ) {
50
+ func loadConf (args * skel. CmdArgs ) (* NetConf , string , error ) {
51
51
n := & NetConf {}
52
- if err := json .Unmarshal (bytes , n ); err != nil {
52
+ if err := json .Unmarshal (args . StdinData , n ); err != nil {
53
53
return nil , "" , fmt .Errorf ("failed to load netconf: %v" , err )
54
54
}
55
55
if n .Master == "" {
@@ -60,19 +60,34 @@ func loadConf(bytes []byte) (*NetConf, string, error) {
60
60
}
61
61
62
62
// check existing and MTU of master interface
63
- masterMTU , err := getMTUByName (n .Master )
63
+ masterMTU , err := getMTUByName (n .Master , args .Netns , n .LinkContNs )
64
+
64
65
if err != nil {
65
66
return nil , "" , err
66
67
}
67
68
if n .MTU < 0 || n .MTU > masterMTU {
68
69
return nil , "" , fmt .Errorf ("invalid MTU %d, must be [0, master MTU(%d)]" , n .MTU , masterMTU )
69
70
}
70
-
71
71
return n , n .CNIVersion , nil
72
72
}
73
73
74
- func getMTUByName (ifName string ) (int , error ) {
75
- link , err := netlink .LinkByName (ifName )
74
+ func getMTUByName (ifName string , namespace string , inContainer bool ) (int , error ) {
75
+ var link netlink.Link
76
+ var err error
77
+ if inContainer {
78
+ netns , err := ns .GetNS (namespace )
79
+ if err != nil {
80
+ return 0 , fmt .Errorf ("failed to open netns %q: %v" , netns , err )
81
+ }
82
+ defer netns .Close ()
83
+
84
+ err = netns .Do (func (_ ns.NetNS ) error {
85
+ link , err = netlink .LinkByName (ifName )
86
+ return err
87
+ })
88
+ } else {
89
+ link , err = netlink .LinkByName (ifName )
90
+ }
76
91
if err != nil {
77
92
return 0 , err
78
93
}
@@ -82,7 +97,17 @@ func getMTUByName(ifName string) (int, error) {
82
97
func createVlan (conf * NetConf , ifName string , netns ns.NetNS ) (* current.Interface , error ) {
83
98
vlan := & current.Interface {}
84
99
85
- m , err := netlink .LinkByName (conf .Master )
100
+ var m netlink.Link
101
+ var err error
102
+ if conf .LinkContNs {
103
+ err = netns .Do (func (_ ns.NetNS ) error {
104
+ m , err = netlink .LinkByName (conf .Master )
105
+ return err
106
+ })
107
+ } else {
108
+ m , err = netlink .LinkByName (conf .Master )
109
+ }
110
+
86
111
if err != nil {
87
112
return nil , fmt .Errorf ("failed to lookup master %q: %v" , conf .Master , err )
88
113
}
@@ -104,7 +129,14 @@ func createVlan(conf *NetConf, ifName string, netns ns.NetNS) (*current.Interfac
104
129
VlanId : conf .VlanId ,
105
130
}
106
131
107
- if err := netlink .LinkAdd (v ); err != nil {
132
+ if conf .LinkContNs {
133
+ err = netns .Do (func (_ ns.NetNS ) error {
134
+ return netlink .LinkAdd (v )
135
+ })
136
+ } else {
137
+ err = netlink .LinkAdd (v )
138
+ }
139
+ if err != nil {
108
140
return nil , fmt .Errorf ("failed to create vlan: %v" , err )
109
141
}
110
142
@@ -133,7 +165,7 @@ func createVlan(conf *NetConf, ifName string, netns ns.NetNS) (*current.Interfac
133
165
}
134
166
135
167
func cmdAdd (args * skel.CmdArgs ) error {
136
- n , cniVersion , err := loadConf (args . StdinData )
168
+ n , cniVersion , err := loadConf (args )
137
169
if err != nil {
138
170
return err
139
171
}
@@ -191,7 +223,7 @@ func cmdAdd(args *skel.CmdArgs) error {
191
223
}
192
224
193
225
func cmdDel (args * skel.CmdArgs ) error {
194
- n , _ , err := loadConf (args . StdinData )
226
+ n , _ , err := loadConf (args )
195
227
if err != nil {
196
228
return err
197
229
}
@@ -276,8 +308,16 @@ func cmdCheck(args *skel.CmdArgs) error {
276
308
return fmt .Errorf ("Sandbox in prevResult %s doesn't match configured netns: %s" ,
277
309
contMap .Sandbox , args .Netns )
278
310
}
311
+ var m netlink.Link
312
+ if conf .LinkContNs {
313
+ err = netns .Do (func (_ ns.NetNS ) error {
314
+ m , err = netlink .LinkByName (conf .Master )
315
+ return err
316
+ })
317
+ } else {
318
+ m , err = netlink .LinkByName (conf .Master )
319
+ }
279
320
280
- m , err := netlink .LinkByName (conf .Master )
281
321
if err != nil {
282
322
return fmt .Errorf ("failed to lookup master %q: %v" , conf .Master , err )
283
323
}
0 commit comments