Skip to content

Commit 755714d

Browse files
authored
Merge pull request #781 from mmirecki/vlan_incontainermaster
Add support for in-container master for vlans
2 parents e2e14ee + 9fa8003 commit 755714d

File tree

2 files changed

+295
-210
lines changed

2 files changed

+295
-210
lines changed

plugins/main/vlan/vlan.go

+56-16
Original file line numberDiff line numberDiff line change
@@ -20,12 +20,11 @@ import (
2020
"fmt"
2121
"runtime"
2222

23-
"github.com/vishvananda/netlink"
24-
2523
"github.com/containernetworking/cni/pkg/skel"
2624
"github.com/containernetworking/cni/pkg/types"
2725
current "github.com/containernetworking/cni/pkg/types/100"
2826
"github.com/containernetworking/cni/pkg/version"
27+
"github.com/vishvananda/netlink"
2928

3029
"github.com/containernetworking/plugins/pkg/ip"
3130
"github.com/containernetworking/plugins/pkg/ipam"
@@ -35,9 +34,10 @@ import (
3534

3635
type NetConf struct {
3736
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"`
4141
}
4242

4343
func init() {
@@ -47,9 +47,9 @@ func init() {
4747
runtime.LockOSThread()
4848
}
4949

50-
func loadConf(bytes []byte) (*NetConf, string, error) {
50+
func loadConf(args *skel.CmdArgs) (*NetConf, string, error) {
5151
n := &NetConf{}
52-
if err := json.Unmarshal(bytes, n); err != nil {
52+
if err := json.Unmarshal(args.StdinData, n); err != nil {
5353
return nil, "", fmt.Errorf("failed to load netconf: %v", err)
5454
}
5555
if n.Master == "" {
@@ -60,19 +60,34 @@ func loadConf(bytes []byte) (*NetConf, string, error) {
6060
}
6161

6262
// check existing and MTU of master interface
63-
masterMTU, err := getMTUByName(n.Master)
63+
masterMTU, err := getMTUByName(n.Master, args.Netns, n.LinkContNs)
64+
6465
if err != nil {
6566
return nil, "", err
6667
}
6768
if n.MTU < 0 || n.MTU > masterMTU {
6869
return nil, "", fmt.Errorf("invalid MTU %d, must be [0, master MTU(%d)]", n.MTU, masterMTU)
6970
}
70-
7171
return n, n.CNIVersion, nil
7272
}
7373

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+
}
7691
if err != nil {
7792
return 0, err
7893
}
@@ -82,7 +97,17 @@ func getMTUByName(ifName string) (int, error) {
8297
func createVlan(conf *NetConf, ifName string, netns ns.NetNS) (*current.Interface, error) {
8398
vlan := &current.Interface{}
8499

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+
86111
if err != nil {
87112
return nil, fmt.Errorf("failed to lookup master %q: %v", conf.Master, err)
88113
}
@@ -104,7 +129,14 @@ func createVlan(conf *NetConf, ifName string, netns ns.NetNS) (*current.Interfac
104129
VlanId: conf.VlanId,
105130
}
106131

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 {
108140
return nil, fmt.Errorf("failed to create vlan: %v", err)
109141
}
110142

@@ -133,7 +165,7 @@ func createVlan(conf *NetConf, ifName string, netns ns.NetNS) (*current.Interfac
133165
}
134166

135167
func cmdAdd(args *skel.CmdArgs) error {
136-
n, cniVersion, err := loadConf(args.StdinData)
168+
n, cniVersion, err := loadConf(args)
137169
if err != nil {
138170
return err
139171
}
@@ -191,7 +223,7 @@ func cmdAdd(args *skel.CmdArgs) error {
191223
}
192224

193225
func cmdDel(args *skel.CmdArgs) error {
194-
n, _, err := loadConf(args.StdinData)
226+
n, _, err := loadConf(args)
195227
if err != nil {
196228
return err
197229
}
@@ -276,8 +308,16 @@ func cmdCheck(args *skel.CmdArgs) error {
276308
return fmt.Errorf("Sandbox in prevResult %s doesn't match configured netns: %s",
277309
contMap.Sandbox, args.Netns)
278310
}
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+
}
279320

280-
m, err := netlink.LinkByName(conf.Master)
281321
if err != nil {
282322
return fmt.Errorf("failed to lookup master %q: %v", conf.Master, err)
283323
}

0 commit comments

Comments
 (0)