diff --git a/pkg/tcpip/network/ipv6/icmp.go b/pkg/tcpip/network/ipv6/icmp.go index a98332dc3..92b126ba0 100644 --- a/pkg/tcpip/network/ipv6/icmp.go +++ b/pkg/tcpip/network/ipv6/icmp.go @@ -540,6 +540,7 @@ func (e *endpoint) handleICMP(pkt stack.PacketBufferPtr, hasFragmentHeader bool, // na.SetSolicitedFlag(!unspecifiedSource) na.SetOverrideFlag(true) + na.SetRouterFlag(e.Forwarding()) na.SetTargetAddress(targetAddr) na.Options().Serialize(optsSerializer) packet.SetChecksum(header.ICMPv6Checksum(header.ICMPv6ChecksumParams{ diff --git a/pkg/tcpip/network/ipv6/ndp_test.go b/pkg/tcpip/network/ipv6/ndp_test.go index 8c1347f8f..e0db9aed8 100644 --- a/pkg/tcpip/network/ipv6/ndp_test.go +++ b/pkg/tcpip/network/ipv6/ndp_test.go @@ -259,6 +259,7 @@ func TestNeighborSolicitationResponse(t *testing.T) { naSrc tcpip.Address naDst tcpip.Address performsLinkResolution bool + forwardingEnabled bool }{ { name: "Unspecified source to solicited-node multicast destination", @@ -391,6 +392,20 @@ func TestNeighborSolicitationResponse(t *testing.T) { nsDst: nicAddr, nsInvalid: true, }, + { + name: "Specified source with 1 source ll to multicast destination with forwarding enabled", + nsOpts: header.NDPOptionsSerializer{ + header.NDPSourceLinkLayerAddressOption(remoteLinkAddr0[:]), + }, + nsSrc: remoteAddr, + nsDst: nicAddrSNMC, + nsInvalid: false, + naDstLinkAddr: remoteLinkAddr0, + naSolicited: true, + naSrc: nicAddr, + naDst: remoteAddr, + forwardingEnabled: true, + }, } for _, test := range tests { @@ -399,6 +414,10 @@ func TestNeighborSolicitationResponse(t *testing.T) { defer c.cleanup() s := c.s + if err := s.SetForwardingDefaultAndAllNICs(header.IPv6ProtocolNumber, test.forwardingEnabled); err != nil { + t.Fatalf("SetForwardingDefaultAndAllNICs(%t): %s", test.forwardingEnabled, err) + } + e := channel.New(1, 1280, nicLinkAddr) defer e.Close() e.LinkEPCapabilities |= stack.CapabilityResolutionRequired @@ -513,6 +532,7 @@ func TestNeighborSolicitationResponse(t *testing.T) { na := header.NDPNeighborAdvert(pkt.MessageBody()) na.SetSolicitedFlag(true) na.SetOverrideFlag(true) + na.SetRouterFlag(test.forwardingEnabled) na.SetTargetAddress(test.nsSrc) na.Options().Serialize(ser) pkt.SetChecksum(header.ICMPv6Checksum(header.ICMPv6ChecksumParams{