// Copyright 2019 The gVisor Authors.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

package header

import "github.com/google/netstack/tcpip"

// NDPNeighborSolicit is an NDP Neighbor Solicitation message. It will only
// contain the body of an ICMPv6 packet.
type NDPNeighborSolicit []byte

const (
	// NDPNSMinimumSize is the minimum size of a valid NDP Neighbor
	// Solicitation message (body of an ICMPv6 packet).
	NDPNSMinimumSize = 20

	// ndpNSTargetAddessOffset is the start of the Target Address
	// field within an NDPNeighborSolicit.
	ndpNSTargetAddessOffset = 4

	// ndpNSOptionsOffset is the start of the NDP options in an
	// NDPNeighborSolicit.
	ndpNSOptionsOffset = ndpNSTargetAddessOffset + IPv6AddressSize
)

// TargetAddress returns the value within the Target Address field.
func (b NDPNeighborSolicit) TargetAddress() tcpip.Address {
	return tcpip.Address(b[ndpNSTargetAddessOffset:][:IPv6AddressSize])
}

// SetTargetAddress sets the value within the Target Address field.
func (b NDPNeighborSolicit) SetTargetAddress(addr tcpip.Address) {
	copy(b[ndpNSTargetAddessOffset:][:IPv6AddressSize], addr)
}

// Options returns an NDPOptions of the the options body.
func (b NDPNeighborSolicit) Options() NDPOptions {
	return NDPOptions(b[ndpNSOptionsOffset:])
}
