From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mga02.intel.com (mga02.intel.com [134.134.136.20]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ml01.01.org (Postfix) with ESMTPS id 06B4B21E3EA88 for ; Mon, 4 Sep 2017 01:04:21 -0700 (PDT) Received: from fmsmga004.fm.intel.com ([10.253.24.48]) by orsmga101.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 04 Sep 2017 01:07:08 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.41,473,1498546800"; d="scan'208";a="307676236" Received: from sfu5-mobl.ccr.corp.intel.com ([10.239.193.124]) by fmsmga004.fm.intel.com with ESMTP; 04 Sep 2017 01:07:07 -0700 From: Fu Siyuan To: edk2-devel@lists.01.org Cc: Ye Ting , Wu Jiaxin Date: Mon, 4 Sep 2017 16:07:01 +0800 Message-Id: <20170904080702.14488-2-siyuan.fu@intel.com> X-Mailer: git-send-email 2.13.0.windows.1 In-Reply-To: <20170904080702.14488-1-siyuan.fu@intel.com> References: <20170904080702.14488-1-siyuan.fu@intel.com> Subject: [Patch 1/2] MdeModulePkg/Ip4Dxe: fix a bug in IP4 driver for IpSec protocol notify. X-BeenThere: edk2-devel@lists.01.org X-Mailman-Version: 2.1.22 Precedence: list List-Id: EDK II Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 04 Sep 2017 08:04:21 -0000 The IP driver uses EfiCreateProtocolNotifyEvent() to register notify callback function for IpSec protocol, but it didn't notice that the callback will always be executed at least once, even the protocol wasn't in handle database. As a result, the Ip4IpSecProcessPacket() will still always call LocateProtocol() even the IpSec protocol is not installed, which will impact the network performance. Cc: Ye Ting Cc: Wu Jiaxin Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Fu Siyuan --- MdeModulePkg/Universal/Network/Ip4Dxe/Ip4Driver.c | 14 +++++++++++--- MdeModulePkg/Universal/Network/Ip4Dxe/Ip4Input.c | 10 ++-------- 2 files changed, 13 insertions(+), 11 deletions(-) diff --git a/MdeModulePkg/Universal/Network/Ip4Dxe/Ip4Driver.c b/MdeModulePkg/Universal/Network/Ip4Dxe/Ip4Driver.c index 792db5c..03ba458 100644 --- a/MdeModulePkg/Universal/Network/Ip4Dxe/Ip4Driver.c +++ b/MdeModulePkg/Universal/Network/Ip4Dxe/Ip4Driver.c @@ -41,12 +41,20 @@ IpSec2InstalledCallback ( IN VOID *Context ) { + EFI_STATUS Status; // - // Close the event so it does not get called again. + // Test if protocol was even found. + // Notification function will be called at least once. // - gBS->CloseEvent (Event); + Status = gBS->LocateProtocol (&gEfiIpSec2ProtocolGuid, NULL, &mIpSec); + if (Status == EFI_SUCCESS && mIpSec != NULL) { + // + // Close the event so it does not get called again. + // + gBS->CloseEvent (Event); - mIpSec2Installed = TRUE; + mIpSec2Installed = TRUE; + } } /** diff --git a/MdeModulePkg/Universal/Network/Ip4Dxe/Ip4Input.c b/MdeModulePkg/Universal/Network/Ip4Dxe/Ip4Input.c index 09b8f2b..e694323 100644 --- a/MdeModulePkg/Universal/Network/Ip4Dxe/Ip4Input.c +++ b/MdeModulePkg/Universal/Network/Ip4Dxe/Ip4Input.c @@ -1,7 +1,7 @@ /** @file IP4 input process. -Copyright (c) 2005 - 2014, Intel Corporation. All rights reserved.
+Copyright (c) 2005 - 2017, Intel Corporation. All rights reserved.
(C) Copyright 2015 Hewlett-Packard Development Company, L.P.
This program and the accompanying materials @@ -518,6 +518,7 @@ Ip4IpSecProcessPacket ( if (!mIpSec2Installed) { goto ON_EXIT; } + ASSERT (mIpSec != NULL); Packet = *Netbuf; RecycleEvent = NULL; @@ -527,13 +528,6 @@ Ip4IpSecProcessPacket ( FragmentCount = Packet->BlockOpNum; ZeroMem (&ZeroHead, sizeof (IP4_HEAD)); - - if (mIpSec == NULL) { - gBS->LocateProtocol (&gEfiIpSec2ProtocolGuid, NULL, (VOID **) &mIpSec); - if (mIpSec == NULL) { - goto ON_EXIT; - } - } // // Check whether the IPsec enable variable is set. -- 1.9.5.msysgit.1