+/**\r
+ Handles IPsec processing for both inbound and outbound IP packets. Compare with \r
+ Process() in EFI_IPSEC_PROTOCOL, this interface has the capability to process \r
+ Option(Extension Header). \r
+\r
+ The EFI_IPSEC2_PROCESS process routine handles each inbound or outbound packet.\r
+ The behavior is that it can perform one of the following actions: \r
+ bypass the packet, discard the packet, or protect the packet. \r
+\r
+ @param[in] This Pointer to the EFI_IPSEC2_PROTOCOL instance.\r
+ @param[in] NicHandle Instance of the network interface. \r
+ @param[in] IpVer IP version.IPv4 or IPv6.\r
+ @param[in, out] IpHead Pointer to the IP Header it is either \r
+ the EFI_IP4_HEADER or EFI_IP6_HEADER.\r
+ On input, it contains the IP header. \r
+ On output, 1) in tunnel mode and the \r
+ traffic direction is inbound, the buffer \r
+ will be reset to zero by IPsec; 2) in \r
+ tunnel mode and the traffic direction \r
+ is outbound, the buffer will reset to \r
+ be the tunnel IP header.3) in transport \r
+ mode, the related fielders (like payload \r
+ length, Next header) in IP header will \r
+ be modified according to the condition.\r
+ @param[in, out] LastHead For IP4, it is the next protocol in IP\r
+ header. For IP6 it is the Next Header \r
+ of the last extension header.\r
+ @param[in, out] OptionsBuffer On input, it contains the options \r
+ (extensions header) to be processed by \r
+ IPsec. On output, 1) in tunnel mode and\r
+ the traffic direction is outbound, it \r
+ will be set to NULL, and that means this \r
+ contents was wrapped after inner header \r
+ and should not be concatenated after \r
+ tunnel header again; 2) in transport \r
+ mode and the traffic direction is inbound, \r
+ if there are IP options (extension headers) \r
+ protected by IPsec, IPsec will concatenate \r
+ the those options after the input options \r
+ (extension headers); 3) on other situations, \r
+ the output of contents of OptionsBuffer \r
+ might be same with input's. The caller \r
+ should take the responsibility to free \r
+ the buffer both on input and on output.\r
+ @param[in, out] OptionsLength On input, the input length of the options \r
+ buffer. On output, the output length of \r
+ the options buffer.\r
+ @param[in, out] FragmentTable Pointer to a list of fragments. On input, \r
+ these fragments contain the IP payload. \r
+ On output, 1) in tunnel mode and the traffic \r
+ direction is inbound, the fragments contain \r
+ the whole IP payload which is from the \r
+ IP inner header to the last byte of the \r
+ packet; 2) in tunnel mode and the traffic \r
+ direction is the outbound, the fragments \r
+ contains the whole encapsulated payload \r
+ which encapsulates the whole IP payload \r
+ between the encapsulated header and \r
+ encapsulated trailer fields. 3) in transport \r
+ mode and the traffic direction is inbound, \r
+ the fragments contains the IP payload \r
+ which is from the next layer protocol to \r
+ the last byte of the packet; 4) in transport \r
+ mode and the traffic direction is outbound, \r
+ the fragments contains the whole encapsulated \r
+ payload which encapsulates the next layer \r
+ protocol information between the encapsulated \r
+ header and encapsulated trailer fields.\r
+ @param[in, out] FragmentCount Number of fragments.\r
+ @param[in] TrafficDirection Traffic direction.\r
+ @param[out] RecycleSignal Event for recycling of resources.\r
+\r
+ @retval EFI_SUCCESS The packet was processed by IPsec successfully.\r
+ @retval EFI_ACCESS_DENIED The packet was discarded.\r
+ @retval EFI_NOT_READY The IKE negotiation is invoked and the packet \r
+ was discarded.\r
+ @retval EFI_INVALID_PARAMETER One or more of following are TRUE:\r
+ If OptionsBuffer is NULL;\r
+ If OptionsLength is NULL;\r
+ If FragmentTable is NULL;\r
+ If FragmentCount is NULL.\r