Introducing macvtap device to netlink package
Small refactoring of MacVlan calls. Adds tests, too. Signed-off-by: Milos Gajdos <milosgajdos83@gmail.com> (github: milosgajdos83)
This commit is contained in:
parent
84c1636580
commit
7075dd2cc2
|
@ -769,26 +769,38 @@ func NetworkLinkAddVlan(masterDev, vlanDev string, vlanId uint16) error {
|
|||
return s.HandleAck(wb.Seq)
|
||||
}
|
||||
|
||||
// Add MAC VLAN network interface with masterDev as its upper device
|
||||
// This is identical to running:
|
||||
// ip link add name $name link $masterdev type macvlan mode $mode
|
||||
func NetworkLinkAddMacVlan(masterDev, macVlanDev string, mode string) error {
|
||||
s, err := getNetlinkSocket()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
defer s.Close()
|
||||
// MacVlan link has LowerDev, UpperDev and operates in Mode mode
|
||||
// This simplifies the code when creating MacVlan or MacVtap interface
|
||||
type MacVlanLink struct {
|
||||
MasterDev string
|
||||
SlaveDev string
|
||||
mode string
|
||||
}
|
||||
|
||||
macVlan := map[string]uint32{
|
||||
func (m MacVlanLink) Mode() uint32 {
|
||||
modeMap := map[string]uint32{
|
||||
"private": MACVLAN_MODE_PRIVATE,
|
||||
"vepa": MACVLAN_MODE_VEPA,
|
||||
"bridge": MACVLAN_MODE_BRIDGE,
|
||||
"passthru": MACVLAN_MODE_PASSTHRU,
|
||||
}
|
||||
|
||||
return modeMap[m.mode]
|
||||
}
|
||||
|
||||
// Add MAC VLAN network interface with masterDev as its upper device
|
||||
// This is identical to running:
|
||||
// ip link add name $name link $masterdev type macvlan mode $mode
|
||||
func networkLinkMacVlan(dev_type string, mcvln *MacVlanLink) error {
|
||||
s, err := getNetlinkSocket()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
defer s.Close()
|
||||
|
||||
wb := newNetlinkRequest(syscall.RTM_NEWLINK, syscall.NLM_F_CREATE|syscall.NLM_F_EXCL|syscall.NLM_F_ACK)
|
||||
|
||||
masterDevIfc, err := net.InterfaceByName(masterDev)
|
||||
masterDevIfc, err := net.InterfaceByName(mcvln.MasterDev)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
@ -797,16 +809,16 @@ func NetworkLinkAddMacVlan(masterDev, macVlanDev string, mode string) error {
|
|||
wb.AddData(msg)
|
||||
|
||||
nest1 := newRtAttr(syscall.IFLA_LINKINFO, nil)
|
||||
newRtAttrChild(nest1, IFLA_INFO_KIND, nonZeroTerminated("macvlan"))
|
||||
newRtAttrChild(nest1, IFLA_INFO_KIND, nonZeroTerminated(dev_type))
|
||||
|
||||
nest2 := newRtAttrChild(nest1, IFLA_INFO_DATA, nil)
|
||||
macVlanData := make([]byte, 4)
|
||||
native.PutUint32(macVlanData, macVlan[mode])
|
||||
native.PutUint32(macVlanData, mcvln.Mode())
|
||||
newRtAttrChild(nest2, IFLA_MACVLAN_MODE, macVlanData)
|
||||
wb.AddData(nest1)
|
||||
|
||||
wb.AddData(uint32Attr(syscall.IFLA_LINK, uint32(masterDevIfc.Index)))
|
||||
wb.AddData(newRtAttr(syscall.IFLA_IFNAME, zeroTerminated(macVlanDev)))
|
||||
wb.AddData(newRtAttr(syscall.IFLA_IFNAME, zeroTerminated(mcvln.SlaveDev)))
|
||||
|
||||
if err := s.Send(wb); err != nil {
|
||||
return err
|
||||
|
@ -814,6 +826,22 @@ func NetworkLinkAddMacVlan(masterDev, macVlanDev string, mode string) error {
|
|||
return s.HandleAck(wb.Seq)
|
||||
}
|
||||
|
||||
func NetworkLinkAddMacVlan(masterDev, macVlanDev string, mode string) error {
|
||||
return networkLinkMacVlan("macvlan", &MacVlanLink{
|
||||
MasterDev: masterDev,
|
||||
SlaveDev: macVlanDev,
|
||||
mode: mode,
|
||||
})
|
||||
}
|
||||
|
||||
func NetworkLinkAddMacVtap(masterDev, macVlanDev string, mode string) error {
|
||||
return networkLinkMacVlan("macvtap", &MacVlanLink{
|
||||
MasterDev: masterDev,
|
||||
SlaveDev: macVlanDev,
|
||||
mode: mode,
|
||||
})
|
||||
}
|
||||
|
||||
func networkLinkIpAction(action, flags int, ifa IfAddr) error {
|
||||
s, err := getNetlinkSocket()
|
||||
if err != nil {
|
||||
|
|
|
@ -248,6 +248,30 @@ func TestNetworkLinkAddMacVlan(t *testing.T) {
|
|||
readLink(t, tl.name)
|
||||
}
|
||||
|
||||
func TestNetworkLinkAddMacVtap(t *testing.T) {
|
||||
if testing.Short() {
|
||||
return
|
||||
}
|
||||
|
||||
tl := struct {
|
||||
name string
|
||||
mode string
|
||||
}{
|
||||
name: "tstVtap",
|
||||
mode: "private",
|
||||
}
|
||||
masterLink := testLink{"tstEth", "dummy"}
|
||||
|
||||
addLink(t, masterLink.name, masterLink.linkType)
|
||||
defer deleteLink(t, masterLink.name)
|
||||
|
||||
if err := NetworkLinkAddMacVtap(masterLink.name, tl.name, tl.mode); err != nil {
|
||||
t.Fatalf("Unable to create %#v MAC VTAP interface: %s", tl, err)
|
||||
}
|
||||
|
||||
readLink(t, tl.name)
|
||||
}
|
||||
|
||||
func TestAddDelNetworkIp(t *testing.T) {
|
||||
if testing.Short() {
|
||||
return
|
||||
|
|
Loading…
Reference in New Issue