summaryrefslogtreecommitdiffhomepage
path: root/pkg/tcpip/stack/ndp.go
diff options
context:
space:
mode:
authorGhanan Gowripalan <ghanan@google.com>2020-01-28 13:37:10 -0800
committergVisor bot <gvisor-bot@google.com>2020-01-28 13:52:04 -0800
commitce0bac4be9d808877248c328fac07ff0d66b9607 (patch)
tree40c627ad4cf71e5094b451946920d5c168fce3af /pkg/tcpip/stack/ndp.go
parentf263801a74d4ccac042b068d0928c8738e40af5b (diff)
Include the NDP Source Link Layer option when sending DAD messages
Test: stack_test.TestDADResolve PiperOrigin-RevId: 292003124
Diffstat (limited to 'pkg/tcpip/stack/ndp.go')
-rw-r--r--pkg/tcpip/stack/ndp.go22
1 files changed, 20 insertions, 2 deletions
diff --git a/pkg/tcpip/stack/ndp.go b/pkg/tcpip/stack/ndp.go
index d983ac390..245694118 100644
--- a/pkg/tcpip/stack/ndp.go
+++ b/pkg/tcpip/stack/ndp.go
@@ -538,11 +538,29 @@ func (ndp *ndpState) sendDADPacket(addr tcpip.Address) *tcpip.Error {
r := makeRoute(header.IPv6ProtocolNumber, header.IPv6Any, snmc, ndp.nic.linkEP.LinkAddress(), ref, false, false)
defer r.Release()
- hdr := buffer.NewPrependable(int(r.MaxHeaderLength()) + header.ICMPv6NeighborSolicitMinimumSize)
- pkt := header.ICMPv6(hdr.Prepend(header.ICMPv6NeighborSolicitMinimumSize))
+ linkAddr := ndp.nic.linkEP.LinkAddress()
+ isValidLinkAddr := header.IsValidUnicastEthernetAddress(linkAddr)
+ ndpNSSize := header.ICMPv6NeighborSolicitMinimumSize
+ if isValidLinkAddr {
+ // Only include a Source Link Layer Address option if the NIC has a valid
+ // link layer address.
+ //
+ // TODO(b/141011931): Validate a LinkEndpoint's link address (provided by
+ // LinkEndpoint.LinkAddress) before reaching this point.
+ ndpNSSize += header.NDPLinkLayerAddressSize
+ }
+
+ hdr := buffer.NewPrependable(int(r.MaxHeaderLength()) + ndpNSSize)
+ pkt := header.ICMPv6(hdr.Prepend(ndpNSSize))
pkt.SetType(header.ICMPv6NeighborSolicit)
ns := header.NDPNeighborSolicit(pkt.NDPPayload())
ns.SetTargetAddress(addr)
+
+ if isValidLinkAddr {
+ ns.Options().Serialize(header.NDPOptionsSerializer{
+ header.NDPSourceLinkLayerAddressOption(linkAddr),
+ })
+ }
pkt.SetChecksum(header.ICMPv6Checksum(pkt, r.LocalAddress, r.RemoteAddress, buffer.VectorisedView{}))
sent := r.Stats().ICMP.V6PacketsSent