| /** @file | |
| Definition of IP6 option process routines. | |
| Copyright (c) 2009 - 2010, Intel Corporation. All rights reserved.<BR> | |
| This program and the accompanying materials | |
| are licensed and made available under the terms and conditions of the BSD License | |
| which accompanies this distribution. The full text of the license may be found at | |
| http://opensource.org/licenses/bsd-license.php. | |
| THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, | |
| WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. | |
| **/ | |
| #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 |