mirror of
https://github.com/netbirdio/gvisor.git
synced 2026-05-22 17:12:49 -07:00
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:
committed by
gVisor bot
parent
6f841c304d
commit
ec0679737e
+2
-20
@@ -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
|
||||
|
||||
@@ -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),
|
||||
))
|
||||
}
|
||||
})
|
||||
|
||||
Reference in New Issue
Block a user