From c79de074b6a35ab514ec88bc2811845e6326fc0f Mon Sep 17 00:00:00 2001 From: Samer El-Haj-Mahmoud Date: Mon, 31 Aug 2015 07:44:12 +0000 Subject: [PATCH] MdeModulePkg/NetworkPkg: Locate IpSec on IP packet processing only if it's installed. Modified the logic in Ip4Dxe and Ip6Dxe to not locate EFI_IPSEC2_PROTOCOL on each message transmit/receive. Instead, register a callback in the drivers entry points on the IpSec protocol installation, and process only if the protocol is installed. This speeds up the network stacks when IpSec is not installed since there is a penalty associated with searching the entire handle database on each packet processing. Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Samer El-Haj-Mahmoud Reviewed-by: Fu Siyuan git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@18365 6f19259b-4bc3-4df7-8a09-765794883524 --- .../Universal/Network/Ip4Dxe/Ip4Driver.c | 36 ++++++++++++++++++ .../Universal/Network/Ip4Dxe/Ip4Impl.h | 3 ++ .../Universal/Network/Ip4Dxe/Ip4Input.c | 7 ++++ NetworkPkg/Ip6Dxe/Ip6Driver.c | 38 +++++++++++++++++++ NetworkPkg/Ip6Dxe/Ip6Impl.h | 2 + NetworkPkg/Ip6Dxe/Ip6Input.c | 6 +++ 6 files changed, 92 insertions(+) diff --git a/MdeModulePkg/Universal/Network/Ip4Dxe/Ip4Driver.c b/MdeModulePkg/Universal/Network/Ip4Dxe/Ip4Driver.c index d8ab948457..3dc4d88f13 100644 --- a/MdeModulePkg/Universal/Network/Ip4Dxe/Ip4Driver.c +++ b/MdeModulePkg/Universal/Network/Ip4Dxe/Ip4Driver.c @@ -2,6 +2,8 @@ The driver binding and service binding protocol for IP4 driver. Copyright (c) 2005 - 2015, Intel Corporation. All rights reserved.
+(C) Copyright 2015 Hewlett-Packard Development Company, L.P.
+ 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 @@ -23,6 +25,30 @@ EFI_DRIVER_BINDING_PROTOCOL gIp4DriverBinding = { NULL }; +BOOLEAN mIpSec2Installed = FALSE; + +/** + Callback function for IpSec2 Protocol install. + + @param[in] Event Event whose notification function is being invoked + @param[in] Context Pointer to the notification function's context + +**/ +VOID +EFIAPI +IpSec2InstalledCallback ( + IN EFI_EVENT Event, + IN VOID *Context + ) +{ + // + // Close the event so it does not get called again. + // + gBS->CloseEvent (Event); + + mIpSec2Installed = TRUE; +} + /** This is the declaration of an EFI image entry point. This entry point is the same for UEFI Applications, UEFI OS Loaders, and UEFI Drivers including @@ -45,6 +71,16 @@ Ip4DriverEntryPoint ( IN EFI_SYSTEM_TABLE *SystemTable ) { + VOID *Registration; + + EfiCreateProtocolNotifyEvent ( + &gEfiIpSec2ProtocolGuid, + TPL_CALLBACK, + IpSec2InstalledCallback, + NULL, + &Registration + ); + return EfiLibInstallDriverBindingComponentName2 ( ImageHandle, SystemTable, diff --git a/MdeModulePkg/Universal/Network/Ip4Dxe/Ip4Impl.h b/MdeModulePkg/Universal/Network/Ip4Dxe/Ip4Impl.h index a1a76bd612..e802b9516b 100644 --- a/MdeModulePkg/Universal/Network/Ip4Dxe/Ip4Impl.h +++ b/MdeModulePkg/Universal/Network/Ip4Dxe/Ip4Impl.h @@ -2,6 +2,8 @@ Ip4 internal functions and type defintions. Copyright (c) 2005 - 2015, Intel Corporation. All rights reserved.
+(C) Copyright 2015 Hewlett-Packard Development Company, L.P.
+ 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 @@ -396,5 +398,6 @@ Ip4FreeTxToken ( ); extern EFI_IPSEC2_PROTOCOL *mIpSec; +extern BOOLEAN mIpSec2Installed; #endif diff --git a/MdeModulePkg/Universal/Network/Ip4Dxe/Ip4Input.c b/MdeModulePkg/Universal/Network/Ip4Dxe/Ip4Input.c index 38ad1c39da..09b8f2bac2 100644 --- a/MdeModulePkg/Universal/Network/Ip4Dxe/Ip4Input.c +++ b/MdeModulePkg/Universal/Network/Ip4Dxe/Ip4Input.c @@ -2,6 +2,8 @@ IP4 input process. Copyright (c) 2005 - 2014, Intel Corporation. All rights reserved.
+(C) Copyright 2015 Hewlett-Packard Development Company, L.P.
+ 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 @@ -512,6 +514,11 @@ Ip4IpSecProcessPacket ( IP4_HEAD ZeroHead; Status = EFI_SUCCESS; + + if (!mIpSec2Installed) { + goto ON_EXIT; + } + Packet = *Netbuf; RecycleEvent = NULL; IpSecWrap = NULL; diff --git a/NetworkPkg/Ip6Dxe/Ip6Driver.c b/NetworkPkg/Ip6Dxe/Ip6Driver.c index 69587849cc..4fde47601c 100644 --- a/NetworkPkg/Ip6Dxe/Ip6Driver.c +++ b/NetworkPkg/Ip6Dxe/Ip6Driver.c @@ -2,6 +2,7 @@ The driver binding and service binding protocol for IP6 driver. Copyright (c) 2009 - 2014, Intel Corporation. All rights reserved.
+ (C) Copyright 2015 Hewlett-Packard Development Company, L.P.
This program and the accompanying materials are licensed and made available under the terms and conditions of the BSD License @@ -24,6 +25,33 @@ EFI_DRIVER_BINDING_PROTOCOL gIp6DriverBinding = { NULL }; +BOOLEAN mIpSec2Installed = FALSE; + +/** + Callback function for IpSec2 Protocol install. + + @param[in] Event Event whose notification function is being invoked + @param[in] Context Pointer to the notification function's context + + @retval EFI_SUCCESS Callback successful. +**/ +VOID +EFIAPI +IpSec2InstalledCallback ( + IN EFI_EVENT Event, + IN VOID *Context + ) +{ + // + // Close the event so it does not get called again. + // + gBS->CloseEvent (Event); + + mIpSec2Installed = TRUE; + + return; +} + /** This is the declaration of an EFI image entry point. This entry point is the same for UEFI Applications, UEFI OS Loaders, and UEFI Drivers including @@ -46,6 +74,16 @@ Ip6DriverEntryPoint ( IN EFI_SYSTEM_TABLE *SystemTable ) { + VOID *Registration; + + EfiCreateProtocolNotifyEvent ( + &gEfiIpSec2ProtocolGuid, + TPL_CALLBACK, + IpSec2InstalledCallback, + NULL, + &Registration + ); + return EfiLibInstallDriverBindingComponentName2 ( ImageHandle, SystemTable, diff --git a/NetworkPkg/Ip6Dxe/Ip6Impl.h b/NetworkPkg/Ip6Dxe/Ip6Impl.h index 8f114bbb10..d30246b2db 100644 --- a/NetworkPkg/Ip6Dxe/Ip6Impl.h +++ b/NetworkPkg/Ip6Dxe/Ip6Impl.h @@ -2,6 +2,7 @@ Implementation of EFI_IP6_PROTOCOL protocol interfaces and type definitions. Copyright (c) 2009 - 2012, Intel Corporation. All rights reserved.
+ (C) Copyright 2015 Hewlett-Packard Development Company, L.P.
This program and the accompanying materials are licensed and made available under the terms and conditions of the BSD License @@ -89,6 +90,7 @@ #define IP6_NO_MAPPING(IpInstance) (!(IpInstance)->Interface->Configured) extern EFI_IPSEC2_PROTOCOL *mIpSec; +extern BOOLEAN mIpSec2Installed; // // IP6_TXTOKEN_WRAP wraps the upper layer's transmit token. diff --git a/NetworkPkg/Ip6Dxe/Ip6Input.c b/NetworkPkg/Ip6Dxe/Ip6Input.c index cf88884e38..e53e0874b9 100644 --- a/NetworkPkg/Ip6Dxe/Ip6Input.c +++ b/NetworkPkg/Ip6Dxe/Ip6Input.c @@ -2,6 +2,7 @@ IP6 internal functions to process the incoming packets. Copyright (c) 2009 - 2014, Intel Corporation. All rights reserved.
+ (C) Copyright 2015 Hewlett-Packard Development Company, L.P.
This program and the accompanying materials are licensed and made available under the terms and conditions of the BSD License @@ -525,6 +526,11 @@ Ip6IpSecProcessPacket ( EFI_IP6_HEADER ZeroHead; Status = EFI_SUCCESS; + + if (!mIpSec2Installed) { + goto ON_EXIT; + } + Packet = *Netbuf; RecycleEvent = NULL; IpSecWrap = NULL; -- 2.39.2