Skip to content

Commit 825fbd8

Browse files
authored
Merge pull request #405 from mars1024/feat/vlan_mtu_validation
vlan: add MTU validation to loadNetConf
2 parents a162329 + 1a30688 commit 825fbd8

2 files changed

Lines changed: 89 additions & 4 deletions

File tree

plugins/main/vlan/vlan.go

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -58,9 +58,27 @@ func loadConf(bytes []byte) (*NetConf, string, error) {
5858
if n.VlanId < 0 || n.VlanId > 4094 {
5959
return nil, "", fmt.Errorf("invalid VLAN ID %d (must be between 0 and 4095 inclusive)", n.VlanId)
6060
}
61+
62+
// check existing and MTU of master interface
63+
masterMTU, err := getMTUByName(n.Master)
64+
if err != nil {
65+
return nil, "", err
66+
}
67+
if n.MTU < 0 || n.MTU > masterMTU {
68+
return nil, "", fmt.Errorf("invalid MTU %d, must be [0, master MTU(%d)]", n.MTU, masterMTU)
69+
}
70+
6171
return n, n.CNIVersion, nil
6272
}
6373

74+
func getMTUByName(ifName string) (int, error) {
75+
link, err := netlink.LinkByName(ifName)
76+
if err != nil {
77+
return 0, err
78+
}
79+
return link.Attrs().MTU, nil
80+
}
81+
6482
func createVlan(conf *NetConf, ifName string, netns ns.NetNS) (*current.Interface, error) {
6583
vlan := &current.Interface{}
6684

@@ -76,10 +94,6 @@ func createVlan(conf *NetConf, ifName string, netns ns.NetNS) (*current.Interfac
7694
return nil, err
7795
}
7896

79-
if conf.MTU <= 0 {
80-
conf.MTU = m.Attrs().MTU
81-
}
82-
8397
v := &netlink.Vlan{
8498
LinkAttrs: netlink.LinkAttrs{
8599
MTU: conf.MTU,

plugins/main/vlan/vlan_test.go

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -408,4 +408,75 @@ var _ = Describe("vlan Operations", func() {
408408
})
409409
Expect(err).NotTo(HaveOccurred())
410410
})
411+
412+
Describe("fails to create vlan link with invalid MTU", func() {
413+
conf := `{
414+
"cniVersion": "0.3.1",
415+
"name": "mynet",
416+
"type": "vlan",
417+
"master": "%s",
418+
"mtu": %d,
419+
"ipam": {
420+
"type": "host-local",
421+
"subnet": "10.1.2.0/24"
422+
}
423+
}`
424+
BeforeEach(func() {
425+
var err error
426+
err = originalNS.Do(func(ns.NetNS) error {
427+
defer GinkgoRecover()
428+
429+
// set master link's MTU to 1500
430+
link, err := netlink.LinkByName(MASTER_NAME)
431+
Expect(err).NotTo(HaveOccurred())
432+
err = netlink.LinkSetMTU(link, 1500)
433+
Expect(err).NotTo(HaveOccurred())
434+
435+
return nil
436+
})
437+
Expect(err).NotTo(HaveOccurred())
438+
})
439+
440+
It("fails to create vlan link with greater MTU than master interface", func() {
441+
var err error
442+
443+
args := &skel.CmdArgs{
444+
ContainerID: "dummy",
445+
Netns: "/var/run/netns/test",
446+
IfName: "eth0",
447+
StdinData: []byte(fmt.Sprintf(conf, MASTER_NAME, 1600)),
448+
}
449+
450+
_ = originalNS.Do(func(netNS ns.NetNS) error {
451+
defer GinkgoRecover()
452+
453+
_, _, err = testutils.CmdAddWithArgs(args, func() error {
454+
return cmdAdd(args)
455+
})
456+
Expect(err).To(Equal(fmt.Errorf("invalid MTU 1600, must be [0, master MTU(1500)]")))
457+
return nil
458+
})
459+
})
460+
461+
It("fails to create vlan link with negative MTU", func() {
462+
var err error
463+
464+
args := &skel.CmdArgs{
465+
ContainerID: "dummy",
466+
Netns: "/var/run/netns/test",
467+
IfName: "eth0",
468+
StdinData: []byte(fmt.Sprintf(conf, MASTER_NAME, -100)),
469+
}
470+
471+
_ = originalNS.Do(func(netNS ns.NetNS) error {
472+
defer GinkgoRecover()
473+
474+
_, _, err = testutils.CmdAddWithArgs(args, func() error {
475+
return cmdAdd(args)
476+
})
477+
Expect(err).To(Equal(fmt.Errorf("invalid MTU -100, must be [0, master MTU(1500)]")))
478+
return nil
479+
})
480+
})
481+
})
411482
})

0 commit comments

Comments
 (0)