Skip to content

Commit 5d02d91

Browse files
authored
Merge pull request #813 from mmirecki/ipvlan_incontainermaster
Add support for in-container master for ipvlan
2 parents 755714d + c798f80 commit 5d02d91

File tree

2 files changed

+184
-102
lines changed

2 files changed

+184
-102
lines changed

plugins/main/ipvlan/ipvlan.go

+61-14
Original file line numberDiff line numberDiff line change
@@ -36,9 +36,10 @@ import (
3636

3737
type NetConf struct {
3838
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"`
4243
}
4344

4445
func init() {
@@ -48,9 +49,9 @@ func init() {
4849
runtime.LockOSThread()
4950
}
5051

51-
func loadConf(bytes []byte, cmdCheck bool) (*NetConf, string, error) {
52+
func loadConf(args *skel.CmdArgs, cmdCheck bool) (*NetConf, string, error) {
5253
n := &NetConf{}
53-
if err := json.Unmarshal(bytes, n); err != nil {
54+
if err := json.Unmarshal(args.StdinData, n); err != nil {
5455
return nil, "", fmt.Errorf("failed to load netconf: %v", err)
5556
}
5657

@@ -73,8 +74,8 @@ func loadConf(bytes []byte, cmdCheck bool) (*NetConf, string, error) {
7374
}
7475
if n.Master == "" {
7576
if result == nil {
76-
defaultRouteInterface, err := getDefaultRouteInterfaceName()
77-
77+
var defaultRouteInterface string
78+
defaultRouteInterface, err = getNamespacedDefaultRouteInterfaceName(args.Netns, n.LinkContNs)
7879
if err != nil {
7980
return nil, "", err
8081
}
@@ -124,7 +125,15 @@ func createIpvlan(conf *NetConf, ifName string, netns ns.NetNS) (*current.Interf
124125
return nil, err
125126
}
126127

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+
}
128137
if err != nil {
129138
return nil, fmt.Errorf("failed to lookup master %q: %v", conf.Master, err)
130139
}
@@ -146,8 +155,14 @@ func createIpvlan(conf *NetConf, ifName string, netns ns.NetNS) (*current.Interf
146155
Mode: mode,
147156
}
148157

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+
}
151166
}
152167

153168
err = netns.Do(func(_ ns.NetNS) error {
@@ -193,8 +208,31 @@ func getDefaultRouteInterfaceName() (string, error) {
193208
return "", fmt.Errorf("no default route interface found")
194209
}
195210

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+
196234
func cmdAdd(args *skel.CmdArgs) error {
197-
n, cniVersion, err := loadConf(args.StdinData, false)
235+
n, cniVersion, err := loadConf(args, false)
198236
if err != nil {
199237
return err
200238
}
@@ -272,7 +310,7 @@ func cmdAdd(args *skel.CmdArgs) error {
272310
}
273311

274312
func cmdDel(args *skel.CmdArgs) error {
275-
n, _, err := loadConf(args.StdinData, false)
313+
n, _, err := loadConf(args, false)
276314
if err != nil {
277315
return err
278316
}
@@ -320,7 +358,7 @@ func main() {
320358

321359
func cmdCheck(args *skel.CmdArgs) error {
322360

323-
n, _, err := loadConf(args.StdinData, true)
361+
n, _, err := loadConf(args, true)
324362
if err != nil {
325363
return err
326364
}
@@ -369,7 +407,16 @@ func cmdCheck(args *skel.CmdArgs) error {
369407
contMap.Sandbox, args.Netns)
370408
}
371409

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+
373420
if err != nil {
374421
return fmt.Errorf("failed to lookup master %q: %v", n.Master, err)
375422
}

0 commit comments

Comments
 (0)