/** @file Definition of IP6 option process routines. Copyright (c) 2009 - 2010, Intel Corporation. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent **/ #ifndef __EFI_IP6_OPTION_H__ #define __EFI_IP6_OPTION_H__ #define IP6_FRAGMENT_OFFSET_MASK (~0x3) typedef struct _IP6_FRAGMENT_HEADER { UINT8 NextHeader; UINT8 Reserved; UINT16 FragmentOffset; UINT32 Identification; } IP6_FRAGMENT_HEADER; typedef struct _IP6_ROUTING_HEADER { UINT8 NextHeader; UINT8 HeaderLen; UINT8 RoutingType; UINT8 SegmentsLeft; } IP6_ROUTING_HEADER; typedef enum { Ip6OptionPad1 = 0, Ip6OptionPadN = 1, Ip6OptionRouterAlert = 5, Ip6OptionSkip = 0, Ip6OptionDiscard = 0x40, Ip6OptionParameterProblem = 0x80, Ip6OptionMask = 0xc0, Ip6OptionEtherSource = 1, Ip6OptionEtherTarget = 2, Ip6OptionPrefixInfo = 3, Ip6OptionRedirected = 4, Ip6OptionMtu = 5 } IP6_OPTION_TYPE; /** Validate the IP6 extension header format for both the packets we received and that we will transmit. It will compute the ICMPv6 error message fields if the option is mal-formatted. @param[in] IpSb The IP6 service instance. This is an optional parameter. @param[in] Packet The data of the packet. Ignored if NULL. @param[in] NextHeader The next header field in IPv6 basic header. @param[in] ExtHdrs The first byte of the option. @param[in] ExtHdrsLen The length of the whole option. @param[in] Rcvd The option is from the packet we received if TRUE, otherwise, the option we want to transmit. @param[out] FormerHeader The offset of NextHeader which points to Fragment Header when we received, of the ExtHdrs. Ignored if we transmit. @param[out] LastHeader The pointer of NextHeader of the last extension header processed by IP6. @param[out] RealExtsLen The length of extension headers processed by IP6 layer. This is an optional parameter that may be NULL. @param[out] UnFragmentLen The length of unfragmented length of extension headers. This is an optional parameter that may be NULL. @param[out] Fragmented Indicate whether the packet is fragmented. This is an optional parameter that may be NULL. @retval TRUE The option is properly formatted. @retval FALSE The option is malformatted. **/ BOOLEAN Ip6IsExtsValid ( IN IP6_SERVICE *IpSb OPTIONAL, IN NET_BUF *Packet OPTIONAL, IN UINT8 *NextHeader, IN UINT8 *ExtHdrs, IN UINT32 ExtHdrsLen, IN BOOLEAN Rcvd, OUT UINT32 *FormerHeader OPTIONAL, OUT UINT8 **LastHeader, OUT UINT32 *RealExtsLen OPTIONAL, OUT UINT32 *UnFragmentLen OPTIONAL, OUT BOOLEAN *Fragmented OPTIONAL ); /** Generate an IPv6 router alert option in network order and output it through Buffer. @param[out] Buffer Points to a buffer to record the generated option. @param[in, out] BufferLen The length of Buffer, in bytes. @param[in] NextHeader The 8-bit selector indicates the type of header immediately following the Hop-by-Hop Options header. @retval EFI_BUFFER_TOO_SMALL The Buffer is too small to contain the generated option. BufferLen is updated for the required size. @retval EFI_SUCCESS The option is generated and filled in to Buffer. **/ EFI_STATUS Ip6FillHopByHop ( OUT UINT8 *Buffer, IN OUT UINTN *BufferLen, IN UINT8 NextHeader ); /** Insert a Fragment Header to the Extension headers and output it in UpdatedExtHdrs. @param[in] IpSb The IP6 service instance to transmit the packet. @param[in] NextHeader The extension header type of first extension header. @param[in] LastHeader The extension header type of last extension header. @param[in] ExtHdrs The length of the original extension header. @param[in] ExtHdrsLen The length of the extension headers. @param[in] FragmentOffset The fragment offset of the data following the header. @param[out] UpdatedExtHdrs The updated ExtHdrs with Fragment header inserted. It's caller's responsibility to free this buffer. @retval EFI_OUT_OF_RESOURCES Failed to finish the operation due to lake of resource. @retval EFI_UNSUPPORTED The extension header specified in ExtHdrs is not supported currently. @retval EFI_SUCCESS The operation performed successfully. **/ EFI_STATUS Ip6FillFragmentHeader ( IN IP6_SERVICE *IpSb, IN UINT8 NextHeader, IN UINT8 LastHeader, IN UINT8 *ExtHdrs, IN UINT32 ExtHdrsLen, IN UINT16 FragmentOffset, OUT UINT8 **UpdatedExtHdrs ); /** Copy the extension headers from the original to buffer. A Fragment header is appended to the end. @param[in] NextHeader The 8-bit selector indicates the type of the fragment header's next header. @param[in] ExtHdrs The length of the original extension header. @param[in] LastHeader The pointer of next header of last extension header. @param[in] FragmentOffset The fragment offset of the data following the header. @param[in] UnFragmentHdrLen The length of unfragmented length of extension headers. @param[in, out] Buf The buffer to copy options to. @param[in, out] BufLen The length of the buffer. @retval EFI_SUCCESS The options are copied over. @retval EFI_BUFFER_TOO_SMALL The buffer caller provided is too small. **/ EFI_STATUS Ip6CopyExts ( IN UINT8 NextHeader, IN UINT8 *ExtHdrs, IN UINT8 *LastHeader, IN UINT16 FragmentOffset, IN UINT32 UnFragmentHdrLen, IN OUT UINT8 *Buf, IN OUT UINT32 *BufLen ); /** Validate the IP6 option format for both the packets we received and that we will transmit. It supports the defined options in Neighbor Discovery messages. @param[in] Option The first byte of the option. @param[in] OptionLen The length of the whole option. @retval TRUE The option is properly formatted. @retval FALSE The option is malformatted. **/ BOOLEAN Ip6IsNDOptionValid ( IN UINT8 *Option, IN UINT16 OptionLen ); #endif