diff --git a/pkg/tcpip/stack/bridge_test.go b/pkg/tcpip/stack/bridge_test.go index 913718ad0..a1efeb3c5 100644 --- a/pkg/tcpip/stack/bridge_test.go +++ b/pkg/tcpip/stack/bridge_test.go @@ -48,7 +48,7 @@ func TestWritePacketFromBridge(t *testing.T) { bridgeEndpoint := stack.NewBridgeEndpoint(1500) bridgeEndpoint.SetLinkAddress(bridgeLinkAddr) if err := s.CreateNIC(bridgeID, bridgeEndpoint); err != nil { - t.Fatalf("s.CreateNIC(%d, _): %s", nicID, err) + t.Fatalf("s.CreateNIC(%d, _): %s", bridgeID, err) } if err := s.SetNICCoordinator(nicID, bridgeID); err != nil { t.Fatalf("s.SetNICCoordinator") @@ -106,7 +106,7 @@ func TestWritePacketBetweenDevices(t *testing.T) { bridgeEndpoint := stack.NewBridgeEndpoint(1500) bridgeEndpoint.SetLinkAddress(bridgeLinkAddr) if err := s.CreateNIC(bridgeID, bridgeEndpoint); err != nil { - t.Fatalf("s.CreateNIC(%d, _): %s", nicID, err) + t.Fatalf("s.CreateNIC(%d, _): %s", bridgeID, err) } c := channel.New(1, header.EthernetMinimumSize, localLinkAddr) @@ -150,6 +150,23 @@ func TestWritePacketBetweenDevices(t *testing.T) { } } +func TestSetCoordinator(t *testing.T) { + const ( + bridgeLinkAddr = tcpip.LinkAddress("\x02\x02\x03\x04\x05\x08") + bridgeID = 6 + ) + + s := stack.New(stack.Options{}) + bridgeEndpoint := stack.NewBridgeEndpoint(1500) + bridgeEndpoint.SetLinkAddress(bridgeLinkAddr) + if err := s.CreateNIC(bridgeID, bridgeEndpoint); err != nil { + t.Fatalf("s.CreateNIC(%d, _): %s", bridgeID, err) + } + if err := s.SetNICCoordinator(bridgeID, bridgeID); err == nil { + t.Fatalf("s.SetNICCoordinator(%d, %d) = %s, want = %s", bridgeID, bridgeID, err, tcpip.ErrNoSuchFile{}) + } +} + func TestMTU(t *testing.T) { e := stack.NewBridgeEndpoint(1500) mtus := []uint32{1000, 2000} diff --git a/pkg/tcpip/stack/stack.go b/pkg/tcpip/stack/stack.go index 093cb39a6..7e04f9fbc 100644 --- a/pkg/tcpip/stack/stack.go +++ b/pkg/tcpip/stack/stack.go @@ -1053,7 +1053,10 @@ func (s *Stack) SetNICCoordinator(id tcpip.NICID, mid tcpip.NICID) tcpip.Error { if !ok { return &tcpip.ErrUnknownNICID{} } - + // Setting a coordinator for a coordinator NIC is not allowed. + if _, ok := nic.NetworkLinkEndpoint.(CoordinatorNIC); ok { + return &tcpip.ErrNoSuchFile{} + } m, ok := s.nics[mid] if !ok { return &tcpip.ErrUnknownNICID{} diff --git a/test/rtnetlink/linux/bridge_test.sh b/test/rtnetlink/linux/bridge_test.sh index 4cf3ab32d..d47f9f468 100755 --- a/test/rtnetlink/linux/bridge_test.sh +++ b/test/rtnetlink/linux/bridge_test.sh @@ -31,6 +31,10 @@ ip link add hveth1 type veth peer name veth1 netns test1 ip link set up dev hveth0 ip link set up dev hveth1 +if ip link set br0 master br0; then + exit 1 +fi + ip link set hveth0 master br0 ip link set hveth1 master br0