mirror of
https://github.com/vishvananda/netlink
synced 2025-03-11 07:47:45 +00:00
Add support for setting default vlan on a bridge
This pr allows to change the default vlan on a bridge. It is currently set to 1 by default. A value of 0 means no default vlan. Signed-off-by: Marcelo Guerrero Viveros <marguerr@redhat.com>
This commit is contained in:
parent
7350a0539f
commit
55c8b9515a
2
link.go
2
link.go
@ -266,6 +266,7 @@ type Bridge struct {
|
||||
AgeingTime *uint32
|
||||
HelloTime *uint32
|
||||
VlanFiltering *bool
|
||||
VlanDefaultPVID *uint16
|
||||
}
|
||||
|
||||
func (bridge *Bridge) Attrs() *LinkAttrs {
|
||||
@ -1210,6 +1211,7 @@ func (gtp *GTP) Type() string {
|
||||
}
|
||||
|
||||
// Virtual XFRM Interfaces
|
||||
//
|
||||
// Named "xfrmi" to prevent confusion with XFRM objects
|
||||
type Xfrmi struct {
|
||||
LinkAttrs
|
||||
|
@ -345,6 +345,16 @@ func (h *Handle) BridgeSetVlanFiltering(link Link, on bool) error {
|
||||
return h.linkModify(bridge, unix.NLM_F_ACK)
|
||||
}
|
||||
|
||||
func BridgeSetVlanDefaultPVID(link Link, pvid uint16) error {
|
||||
return pkgHandle.BridgeSetVlanDefaultPVID(link, pvid)
|
||||
}
|
||||
|
||||
func (h *Handle) BridgeSetVlanDefaultPVID(link Link, pvid uint16) error {
|
||||
bridge := link.(*Bridge)
|
||||
bridge.VlanDefaultPVID = &pvid
|
||||
return h.linkModify(bridge, unix.NLM_F_ACK)
|
||||
}
|
||||
|
||||
func SetPromiscOn(link Link) error {
|
||||
return pkgHandle.SetPromiscOn(link)
|
||||
}
|
||||
@ -3184,6 +3194,9 @@ func addBridgeAttrs(bridge *Bridge, linkInfo *nl.RtAttr) {
|
||||
if bridge.VlanFiltering != nil {
|
||||
data.AddRtAttr(nl.IFLA_BR_VLAN_FILTERING, boolToByte(*bridge.VlanFiltering))
|
||||
}
|
||||
if bridge.VlanDefaultPVID != nil {
|
||||
data.AddRtAttr(nl.IFLA_BR_VLAN_DEFAULT_PVID, nl.Uint16Attr(*bridge.VlanDefaultPVID))
|
||||
}
|
||||
}
|
||||
|
||||
func parseBridgeData(bridge Link, data []syscall.NetlinkRouteAttr) {
|
||||
@ -3202,6 +3215,9 @@ func parseBridgeData(bridge Link, data []syscall.NetlinkRouteAttr) {
|
||||
case nl.IFLA_BR_VLAN_FILTERING:
|
||||
vlanFiltering := datum.Value[0] == 1
|
||||
br.VlanFiltering = &vlanFiltering
|
||||
case nl.IFLA_BR_VLAN_DEFAULT_PVID:
|
||||
vlanDefaultPVID := native.Uint16(datum.Value[0:2])
|
||||
br.VlanDefaultPVID = &vlanDefaultPVID
|
||||
}
|
||||
}
|
||||
}
|
||||
|
41
link_test.go
41
link_test.go
@ -396,7 +396,7 @@ func compareGretap(t *testing.T, expected, actual *Gretap) {
|
||||
|
||||
if actual.FlowBased != expected.FlowBased {
|
||||
t.Fatal("Gretap.FlowBased doesn't match")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func compareGretun(t *testing.T, expected, actual *Gretun) {
|
||||
@ -2254,6 +2254,34 @@ func TestBridgeSetVlanFiltering(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
func TestBridgeDefaultPVID(t *testing.T) {
|
||||
minKernelRequired(t, 4, 4)
|
||||
|
||||
tearDown := setUpNetlinkTest(t)
|
||||
defer tearDown()
|
||||
|
||||
bridgeName := "foo"
|
||||
bridge := &Bridge{LinkAttrs: LinkAttrs{Name: bridgeName}}
|
||||
if err := LinkAdd(bridge); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
expectVlanDefaultPVID(t, bridgeName, 1)
|
||||
|
||||
if err := BridgeSetVlanDefaultPVID(bridge, 100); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
expectVlanDefaultPVID(t, bridgeName, 100)
|
||||
|
||||
if err := BridgeSetVlanDefaultPVID(bridge, 0); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
expectVlanDefaultPVID(t, bridgeName, 0)
|
||||
|
||||
if err := LinkDel(bridge); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
}
|
||||
|
||||
func expectVlanFiltering(t *testing.T, linkName string, expected bool) {
|
||||
bridge, err := LinkByName(linkName)
|
||||
if err != nil {
|
||||
@ -2265,6 +2293,17 @@ func expectVlanFiltering(t *testing.T, linkName string, expected bool) {
|
||||
}
|
||||
}
|
||||
|
||||
func expectVlanDefaultPVID(t *testing.T, linkName string, expected uint16) {
|
||||
bridge, err := LinkByName(linkName)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
if actual := *bridge.(*Bridge).VlanDefaultPVID; actual != expected {
|
||||
t.Fatalf("expected %d got %d", expected, actual)
|
||||
}
|
||||
}
|
||||
|
||||
func TestBridgeCreationWithAgeingTime(t *testing.T) {
|
||||
minKernelRequired(t, 3, 18)
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user