From f215e02bf85f68d3a6106c2a1f4f7f063f819064 Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Thu, 11 Apr 2024 10:17:27 +0200 Subject: Adding upstream version 7.0.14-dfsg. Signed-off-by: Daniel Baumann --- .../EFI/Firmware/NetworkPkg/Ip6Dxe/Ip6Option.h | 185 +++++++++++++++++++++ 1 file changed, 185 insertions(+) create mode 100644 src/VBox/Devices/EFI/Firmware/NetworkPkg/Ip6Dxe/Ip6Option.h (limited to 'src/VBox/Devices/EFI/Firmware/NetworkPkg/Ip6Dxe/Ip6Option.h') diff --git a/src/VBox/Devices/EFI/Firmware/NetworkPkg/Ip6Dxe/Ip6Option.h b/src/VBox/Devices/EFI/Firmware/NetworkPkg/Ip6Dxe/Ip6Option.h new file mode 100644 index 00000000..6affc46f --- /dev/null +++ b/src/VBox/Devices/EFI/Firmware/NetworkPkg/Ip6Dxe/Ip6Option.h @@ -0,0 +1,185 @@ +/** @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 -- cgit v1.2.3