mirror of
https://github.com/vishvananda/netlink.git
synced 2025-10-04 07:26:26 +08:00
bridge: add/del vlan range
Signed-off-by: Date Huang <tjjh89017@hotmail.com>
This commit is contained in:

committed by
Alessandro Boch

parent
916f9685fa
commit
0cd15d9a7a
@@ -63,7 +63,19 @@ func BridgeVlanAdd(link Link, vid uint16, pvid, untagged, self, master bool) err
|
|||||||
// BridgeVlanAdd adds a new vlan filter entry
|
// BridgeVlanAdd adds a new vlan filter entry
|
||||||
// Equivalent to: `bridge vlan add dev DEV vid VID [ pvid ] [ untagged ] [ self ] [ master ]`
|
// Equivalent to: `bridge vlan add dev DEV vid VID [ pvid ] [ untagged ] [ self ] [ master ]`
|
||||||
func (h *Handle) BridgeVlanAdd(link Link, vid uint16, pvid, untagged, self, master bool) error {
|
func (h *Handle) BridgeVlanAdd(link Link, vid uint16, pvid, untagged, self, master bool) error {
|
||||||
return h.bridgeVlanModify(unix.RTM_SETLINK, link, vid, pvid, untagged, self, master)
|
return h.bridgeVlanModify(unix.RTM_SETLINK, link, vid, 0, pvid, untagged, self, master)
|
||||||
|
}
|
||||||
|
|
||||||
|
// BridgeVlanAddRange adds a new vlan filter entry
|
||||||
|
// Equivalent to: `bridge vlan add dev DEV vid VID-VIDEND [ pvid ] [ untagged ] [ self ] [ master ]`
|
||||||
|
func BridgeVlanAddRange(link Link, vid, vidEnd uint16, pvid, untagged, self, master bool) error {
|
||||||
|
return pkgHandle.BridgeVlanAddRange(link, vid, vidEnd, pvid, untagged, self, master)
|
||||||
|
}
|
||||||
|
|
||||||
|
// BridgeVlanAddRange adds a new vlan filter entry
|
||||||
|
// Equivalent to: `bridge vlan add dev DEV vid VID-VIDEND [ pvid ] [ untagged ] [ self ] [ master ]`
|
||||||
|
func (h *Handle) BridgeVlanAddRange(link Link, vid, vidEnd uint16, pvid, untagged, self, master bool) error {
|
||||||
|
return h.bridgeVlanModify(unix.RTM_SETLINK, link, vid, vidEnd, pvid, untagged, self, master)
|
||||||
}
|
}
|
||||||
|
|
||||||
// BridgeVlanDel adds a new vlan filter entry
|
// BridgeVlanDel adds a new vlan filter entry
|
||||||
@@ -75,10 +87,22 @@ func BridgeVlanDel(link Link, vid uint16, pvid, untagged, self, master bool) err
|
|||||||
// BridgeVlanDel adds a new vlan filter entry
|
// BridgeVlanDel adds a new vlan filter entry
|
||||||
// Equivalent to: `bridge vlan del dev DEV vid VID [ pvid ] [ untagged ] [ self ] [ master ]`
|
// Equivalent to: `bridge vlan del dev DEV vid VID [ pvid ] [ untagged ] [ self ] [ master ]`
|
||||||
func (h *Handle) BridgeVlanDel(link Link, vid uint16, pvid, untagged, self, master bool) error {
|
func (h *Handle) BridgeVlanDel(link Link, vid uint16, pvid, untagged, self, master bool) error {
|
||||||
return h.bridgeVlanModify(unix.RTM_DELLINK, link, vid, pvid, untagged, self, master)
|
return h.bridgeVlanModify(unix.RTM_DELLINK, link, vid, 0, pvid, untagged, self, master)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (h *Handle) bridgeVlanModify(cmd int, link Link, vid uint16, pvid, untagged, self, master bool) error {
|
// BridgeVlanDelRange adds a new vlan filter entry
|
||||||
|
// Equivalent to: `bridge vlan del dev DEV vid VID-VIDEND [ pvid ] [ untagged ] [ self ] [ master ]`
|
||||||
|
func BridgeVlanDelRange(link Link, vid, vidEnd uint16, pvid, untagged, self, master bool) error {
|
||||||
|
return pkgHandle.BridgeVlanDelRange(link, vid, vidEnd, pvid, untagged, self, master)
|
||||||
|
}
|
||||||
|
|
||||||
|
// BridgeVlanDelRange adds a new vlan filter entry
|
||||||
|
// Equivalent to: `bridge vlan del dev DEV vid VID-VIDEND [ pvid ] [ untagged ] [ self ] [ master ]`
|
||||||
|
func (h *Handle) BridgeVlanDelRange(link Link, vid, vidEnd uint16, pvid, untagged, self, master bool) error {
|
||||||
|
return h.bridgeVlanModify(unix.RTM_DELLINK, link, vid, vidEnd, pvid, untagged, self, master)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (h *Handle) bridgeVlanModify(cmd int, link Link, vid, vidEnd uint16, pvid, untagged, self, master bool) error {
|
||||||
base := link.Attrs()
|
base := link.Attrs()
|
||||||
h.ensureIndex(base)
|
h.ensureIndex(base)
|
||||||
req := h.newNetlinkRequest(cmd, unix.NLM_F_ACK)
|
req := h.newNetlinkRequest(cmd, unix.NLM_F_ACK)
|
||||||
@@ -105,7 +129,20 @@ func (h *Handle) bridgeVlanModify(cmd int, link Link, vid uint16, pvid, untagged
|
|||||||
if untagged {
|
if untagged {
|
||||||
vlanInfo.Flags |= nl.BRIDGE_VLAN_INFO_UNTAGGED
|
vlanInfo.Flags |= nl.BRIDGE_VLAN_INFO_UNTAGGED
|
||||||
}
|
}
|
||||||
br.AddRtAttr(nl.IFLA_BRIDGE_VLAN_INFO, vlanInfo.Serialize())
|
|
||||||
|
if vidEnd != 0 {
|
||||||
|
vlanEndInfo := &nl.BridgeVlanInfo{Vid: vidEnd}
|
||||||
|
vlanEndInfo.Flags = vlanInfo.Flags
|
||||||
|
|
||||||
|
vlanInfo.Flags |= nl.BRIDGE_VLAN_INFO_RANGE_BEGIN
|
||||||
|
br.AddRtAttr(nl.IFLA_BRIDGE_VLAN_INFO, vlanInfo.Serialize())
|
||||||
|
|
||||||
|
vlanEndInfo.Flags |= nl.BRIDGE_VLAN_INFO_RANGE_END
|
||||||
|
br.AddRtAttr(nl.IFLA_BRIDGE_VLAN_INFO, vlanEndInfo.Serialize())
|
||||||
|
} else {
|
||||||
|
br.AddRtAttr(nl.IFLA_BRIDGE_VLAN_INFO, vlanInfo.Serialize())
|
||||||
|
}
|
||||||
|
|
||||||
req.AddData(br)
|
req.AddData(br)
|
||||||
_, err := req.Execute(unix.NETLINK_ROUTE, 0)
|
_, err := req.Execute(unix.NETLINK_ROUTE, 0)
|
||||||
return err
|
return err
|
||||||
|
@@ -53,6 +53,9 @@ func TestBridgeVlan(t *testing.T) {
|
|||||||
if err := BridgeVlanAdd(dummy, 3, true, true, false, false); err != nil {
|
if err := BridgeVlanAdd(dummy, 3, true, true, false, false); err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
if err := BridgeVlanAddRange(dummy, 4, 6, false, false, false, false); err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
if vlanMap, err := BridgeVlanList(); err != nil {
|
if vlanMap, err := BridgeVlanList(); err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
} else {
|
} else {
|
||||||
@@ -69,7 +72,7 @@ func TestBridgeVlan(t *testing.T) {
|
|||||||
if vInfo, ok := vlanMap[int32(dummy.Index)]; !ok {
|
if vInfo, ok := vlanMap[int32(dummy.Index)]; !ok {
|
||||||
t.Fatal("vlanMap should include dum1 port vlan info")
|
t.Fatal("vlanMap should include dum1 port vlan info")
|
||||||
} else {
|
} else {
|
||||||
if fmt.Sprintf("%v", vInfo) != "[{Flags:4 Vid:1} {Flags:0 Vid:2} {Flags:6 Vid:3}]" {
|
if fmt.Sprintf("%v", vInfo) != "[{Flags:4 Vid:1} {Flags:0 Vid:2} {Flags:6 Vid:3} {Flags:0 Vid:4} {Flags:0 Vid:5} {Flags:0 Vid:6}]" {
|
||||||
t.Fatalf("unexpected result %v", vInfo)
|
t.Fatalf("unexpected result %v", vInfo)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user