Do not include the Source Link Layer option with an unspecified source address

When sending NDP messages with an unspecified source address, the Source
Link Layer address must not be included.

Test: stack_test.TestDADResolve
PiperOrigin-RevId: 292341334
This commit is contained in:
Ghanan Gowripalan
2020-01-30 07:12:52 -08:00
committed by gVisor bot
parent 6f841c304d
commit ec0679737e
2 changed files with 10 additions and 24 deletions
+2 -20
View File
@@ -538,29 +538,11 @@ 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()
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))
hdr := buffer.NewPrependable(int(r.MaxHeaderLength()) + header.ICMPv6NeighborSolicitMinimumSize)
pkt := header.ICMPv6(hdr.Prepend(header.ICMPv6NeighborSolicitMinimumSize))
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
+8 -4
View File
@@ -413,14 +413,18 @@ func TestDADResolve(t *testing.T) {
t.Fatalf("got Proto = %d, want = %d", p.Proto, header.IPv6ProtocolNumber)
}
// Check NDP packet.
// Check NDP NS packet.
//
// As per RFC 4861 section 4.3, a possible option is the Source Link
// Layer option, but this option MUST NOT be included when the source
// address of the packet is the unspecified address.
checker.IPv6(t, p.Pkt.Header.View().ToVectorisedView().First(),
checker.SrcAddr(header.IPv6Any),
checker.DstAddr(header.SolicitedNodeAddr(addr1)),
checker.TTL(header.NDPHopLimit),
checker.NDPNS(
checker.NDPNSTargetAddress(addr1),
checker.NDPNSOptions([]header.NDPOption{
header.NDPSourceLinkLayerAddressOption(linkAddr1),
}),
checker.NDPNSOptions(nil),
))
}
})