From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received-SPF: Pass (sender SPF authorized) identity=mailfrom; client-ip=134.134.136.20; helo=mga02.intel.com; envelope-from=jiaxin.wu@intel.com; receiver=edk2-devel@lists.01.org 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 95A37220EE069 for ; Sun, 3 Dec 2017 17:08:07 -0800 (PST) Received: from fmsmga006.fm.intel.com ([10.253.24.20]) by orsmga101.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 03 Dec 2017 17:12:35 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.45,356,1508828400"; d="scan'208";a="183587256" Received: from fmsmsx103.amr.corp.intel.com ([10.18.124.201]) by fmsmga006.fm.intel.com with ESMTP; 03 Dec 2017 17:12:35 -0800 Received: from shsmsx151.ccr.corp.intel.com (10.239.6.50) by FMSMSX103.amr.corp.intel.com (10.18.124.201) with Microsoft SMTP Server (TLS) id 14.3.319.2; Sun, 3 Dec 2017 17:12:34 -0800 Received: from shsmsx103.ccr.corp.intel.com ([169.254.4.213]) by SHSMSX151.ccr.corp.intel.com ([169.254.3.218]) with mapi id 14.03.0319.002; Mon, 4 Dec 2017 09:12:34 +0800 From: "Wu, Jiaxin" To: "Wang, Fan" , "edk2-devel@lists.01.org" CC: "Fu, Siyuan" , "Ye, Ting" Thread-Topic: [Patch] MdeModulePkg/NetLib: Add NetLibDetectMediaWaitTimeout() API to support EFI_NOT_READY media state detection Thread-Index: AQHTZ1dvwKUWIDWikk6ffL8sHUKmjqMyYLMg Date: Mon, 4 Dec 2017 01:12:34 +0000 Message-ID: <895558F6EA4E3B41AC93A00D163B72741634F1DE@SHSMSX103.ccr.corp.intel.com> References: <1511770310-3984-1-git-send-email-fan.wang@intel.com> In-Reply-To: <1511770310-3984-1-git-send-email-fan.wang@intel.com> Accept-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-titus-metadata-40: eyJDYXRlZ29yeUxhYmVscyI6IiIsIk1ldGFkYXRhIjp7Im5zIjoiaHR0cDpcL1wvd3d3LnRpdHVzLmNvbVwvbnNcL0ludGVsMyIsImlkIjoiZmM1YzE2ODMtNzk4OS00ZWQyLWI4ZTUtYzUzNjIyNjA4ZjUwIiwicHJvcHMiOlt7Im4iOiJDVFBDbGFzc2lmaWNhdGlvbiIsInZhbHMiOlt7InZhbHVlIjoiQ1RQX0lDIn1dfV19LCJTdWJqZWN0TGFiZWxzIjpbXSwiVE1DVmVyc2lvbiI6IjE2LjUuOS4zIiwiVHJ1c3RlZExhYmVsSGFzaCI6Imtoa0pDWThSVVgyd1FZdnY1c2lrYnNTcXR0RkdXc0xCU3F5THlEUm1qYnM9In0= x-ctpclassification: CTP_IC dlp-product: dlpe-windows dlp-version: 11.0.0.116 dlp-reaction: no-action x-originating-ip: [10.239.127.40] MIME-Version: 1.0 Subject: Re: [Patch] MdeModulePkg/NetLib: Add NetLibDetectMediaWaitTimeout() API to support EFI_NOT_READY media state detection 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 Dec 2017 01:08:07 -0000 Content-Language: en-US Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable My comments as below: 1. "ASSERT (MediaState !=3D NULL)" should be removed since it will be chec= ked later. The same issue is found in NetLibDetectMedia(). 2. The Timer event should be created in the first loop for the second loop'= s check, otherwise, it will be invalid for the next CheckEvent(). do { // // Create new Timer // CreateEvent () SetTimer (); do { CheckEvent(); } CloseEvent (Timer); Timer =3D NULL;=09 } 3. How about changing the default value of *MediaState to EFI_SUCCESS? You = know the error status may be returned from API, then the MediaState can't b= e updated correctly. In such a case, the MediaState should be treated as EF= I_SUCCESS. Or=20 We might need add the description to comments that the MediaState is only v= alid when EFI_SUCCESS returned from API. Thanks, Jiaxin > -----Original Message----- > From: Wang, Fan > Sent: Monday, November 27, 2017 4:12 PM > To: edk2-devel@lists.01.org > Cc: Fu, Siyuan ; Ye, Ting ; Wu, > Jiaxin ; Wang, Fan > Subject: [Patch] MdeModulePkg/NetLib: Add > NetLibDetectMediaWaitTimeout() API to support EFI_NOT_READY media > state detection >=20 > In wireless connection, connecting state needs to be cared more > about. ECR 1772 redefined the state EFI_NOT_READY to represent > connecting state and can be retrieved from Aip protocol. This > patch adds a new API to check media state at a specified time > interval when network is connecting until the connection process > finishes or timeout. >=20 > Cc: Fu Siyuan > Cc: Ye Ting > Cc: Jiaxin Wu > Contributed-under: TianoCore Contribution Agreement 1.0 > Signed-off-by: Wang Fan > --- > MdeModulePkg/Include/Library/NetLib.h | 40 +++++++ > MdeModulePkg/Library/DxeNetLib/DxeNetLib.c | 160 > +++++++++++++++++++++++++++ > MdeModulePkg/Library/DxeNetLib/DxeNetLib.inf | 2 + > 3 files changed, 202 insertions(+) >=20 > diff --git a/MdeModulePkg/Include/Library/NetLib.h > b/MdeModulePkg/Include/Library/NetLib.h > index b9df46c..7862df9 100644 > --- a/MdeModulePkg/Include/Library/NetLib.h > +++ b/MdeModulePkg/Include/Library/NetLib.h > @@ -93,10 +93,16 @@ typedef UINT16 TCP_PORTNO; > #define DNS_CLASS_INET 1 > #define DNS_CLASS_CH 3 > #define DNS_CLASS_HS 4 > #define DNS_CLASS_ANY 255 >=20 > +// > +// Number of 100ns units time Interval for network media state detect > +// > +#define MEDIA_STATE_DETECT_TIME_INTERVAL 1000000U > + > + > #pragma pack(1) >=20 > // > // Ethernet head definition > // > @@ -1246,10 +1252,44 @@ NetLibDetectMedia ( > IN EFI_HANDLE ServiceHandle, > OUT BOOLEAN *MediaPresent > ); >=20 > /** > + > + Detect media state for a network device. This routine will wait for a = period > of time at > + a specified checking interval when a certain network is under connecti= ng > until connection > + process finishes or timeout. If Aip protocol is supported by low layer > drivers, three kinds > + of media states can be detected: EFI_SUCCESS, EFI_NOT_READY and > EFI_NO_MEDIA, represents > + connected state, connecting state and no media state respectively. Whe= n > function detects > + the current state is EFI_NOT_READY, it will loop to wait for next time= 's > check until state > + turns to be EFI_SUCCESS or EFI_NO_MEDIA. If Aip protocol is not > supported, function will > + call NetLibDetectMedia() and return state directly. > + > + @param[in] ServiceHandle The handle where network service binding > protocols are > + installed on. > + @param[in] Timeout The maximum number of 100ns units to wai= t > when network > + is connecting. Zero value means detect o= nce and return > + immediately. > + @param[out] MediaState The pointer to the detected media state. > + > + @retval EFI_SUCCESS Media detection success. > + @retval EFI_INVALID_PARAMETER ServiceHandle is not a valid network > device handle or > + MediaState pointer is NULL. > + @retval EFI_DEVICE_ERROR A device error occurred. > + @retval EFI_TIMEOUT Network is connecting but timeout. > + > +**/ > +EFI_STATUS > +EFIAPI > +NetLibDetectMediaWaitTimeout ( > + IN EFI_HANDLE ServiceHandle, > + IN UINT64 Timeout, > + OUT EFI_STATUS *MediaState > + ); > + > + > +/** > Create an IPv4 device path node. >=20 > The header type of IPv4 device path node is MESSAGING_DEVICE_PATH. > The header subtype of IPv4 device path node is MSG_IPv4_DP. > The length of the IPv4 device path node in bytes is 19. > diff --git a/MdeModulePkg/Library/DxeNetLib/DxeNetLib.c > b/MdeModulePkg/Library/DxeNetLib/DxeNetLib.c > index b8544b8..3030147 100644 > --- a/MdeModulePkg/Library/DxeNetLib/DxeNetLib.c > +++ b/MdeModulePkg/Library/DxeNetLib/DxeNetLib.c > @@ -17,10 +17,11 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF > ANY KIND, EITHER EXPRESS OR IMPLIED. > #include >=20 > #include > #include > #include > +#include > #include > #include > #include > #include >=20 > @@ -2501,10 +2502,169 @@ Exit: >=20 > return Status; > } >=20 > /** > + > + Detect media state for a network device. This routine will wait for a = period > of time at > + a specified checking interval when a certain network is under connecti= ng > until connection > + process finishes or timeout. If Aip protocol is supported by low layer > drivers, three kinds > + of media states can be detected: EFI_SUCCESS, EFI_NOT_READY and > EFI_NO_MEDIA, represents > + connected state, connecting state and no media state respectively. Whe= n > function detects > + the current state is EFI_NOT_READY, it will loop to wait for next time= 's > check until state > + turns to be EFI_SUCCESS or EFI_NO_MEDIA. If Aip protocol is not > supported, function will > + call NetLibDetectMedia() and return state directly. > + > + @param[in] ServiceHandle The handle where network service binding > protocols are > + installed on. > + @param[in] Timeout The maximum number of 100ns units to wai= t > when network > + is connecting. Zero value means detect o= nce and return > + immediately. > + @param[out] MediaState The pointer to the detected media state. > + > + @retval EFI_SUCCESS Media detection success. > + @retval EFI_INVALID_PARAMETER ServiceHandle is not a valid network > device handle or > + MediaState pointer is NULL. > + @retval EFI_DEVICE_ERROR A device error occurred. > + @retval EFI_TIMEOUT Network is connecting but timeout. > + > +**/ > + > +EFI_STATUS > +EFIAPI > +NetLibDetectMediaWaitTimeout ( > + IN EFI_HANDLE ServiceHandle, > + IN UINT64 Timeout, > + OUT EFI_STATUS *MediaState > + ) > +{ > + EFI_STATUS Status; > + EFI_HANDLE SnpHandle; > + EFI_SIMPLE_NETWORK_PROTOCOL *Snp; > + EFI_ADAPTER_INFORMATION_PROTOCOL *Aip; > + EFI_ADAPTER_INFO_MEDIA_STATE *MediaInfo; > + BOOLEAN MediaPresent; > + UINTN DataSize; > + EFI_STATUS TimerStatus; > + EFI_EVENT Timer; > + UINT64 TimeRemained; > + > + ASSERT (MediaState !=3D NULL); > + if (MediaState =3D=3D NULL) { > + return EFI_INVALID_PARAMETER; > + } > + *MediaState =3D EFI_NO_MEDIA; > + > + // > + // Get SNP handle > + // > + Snp =3D NULL; > + SnpHandle =3D NetLibGetSnpHandle (ServiceHandle, &Snp); > + if (SnpHandle =3D=3D NULL) { > + return EFI_INVALID_PARAMETER; > + } > + > + Status =3D gBS->HandleProtocol ( > + SnpHandle, > + &gEfiAdapterInformationProtocolGuid, > + (VOID *) &Aip > + ); > + if (EFI_ERROR (Status)) { > + > + MediaPresent =3D TRUE; > + Status =3D NetLibDetectMedia (ServiceHandle, &MediaPresent); > + if (!EFI_ERROR (Status)) { > + if (MediaPresent =3D=3D TRUE) { > + *MediaState =3D EFI_SUCCESS; > + } else { > + *MediaState =3D EFI_NO_MEDIA; > + } > + } > + > + // > + // NetLibDetectMedia doesn't support EFI_NOT_READY status, return > now! > + // > + return Status; > + } > + > + Status =3D Aip->GetInformation ( > + Aip, > + &gEfiAdapterInfoMediaStateGuid, > + (VOID **) &MediaInfo, > + &DataSize > + ); > + if (!EFI_ERROR (Status)) { > + > + *MediaState =3D MediaInfo->MediaState; > + if (*MediaState !=3D EFI_NOT_READY) { > + > + FreePool (MediaInfo); > + return EFI_SUCCESS; > + } > + } > + > + if (MediaInfo !=3D NULL) { > + FreePool (MediaInfo); > + } > + > + if (Timeout < MEDIA_STATE_DETECT_TIME_INTERVAL) { > + return Status; > + } > + > + // > + // Loop to check media state > + // > + > + Timer =3D NULL; > + TimeRemained =3D Timeout; > + Status =3D gBS->CreateEvent (EVT_TIMER, TPL_CALLBACK, NULL, NULL, > &Timer); > + if (EFI_ERROR (Status)) { > + return EFI_DEVICE_ERROR; > + } > + > + do { > + Status =3D gBS->SetTimer ( > + Timer, > + TimerRelative, > + MEDIA_STATE_DETECT_TIME_INTERVAL > + ); > + if (EFI_ERROR (Status)) { > + gBS->CloseEvent(Timer); > + return EFI_DEVICE_ERROR; > + } > + > + do { > + TimerStatus =3D gBS->CheckEvent (Timer); > + if (!EFI_ERROR (TimerStatus)) { > + > + TimeRemained -=3D MEDIA_STATE_DETECT_TIME_INTERVAL; > + Status =3D Aip->GetInformation ( > + Aip, > + &gEfiAdapterInfoMediaStateGuid, > + (VOID **) &MediaInfo, > + &DataSize > + ); > + if (!EFI_ERROR (Status)) { > + *MediaState =3D MediaInfo->MediaState; > + } > + > + if (MediaInfo !=3D NULL) { > + FreePool (MediaInfo); > + } > + } > + } while (TimerStatus =3D=3D EFI_NOT_READY); > + } while (*MediaState =3D=3D EFI_NOT_READY && TimeRemained >=3D > MEDIA_STATE_DETECT_TIME_INTERVAL); > + > + gBS->CloseEvent(Timer); > + if (*MediaState =3D=3D EFI_NOT_READY && TimeRemained < > MEDIA_STATE_DETECT_TIME_INTERVAL) { > + return EFI_TIMEOUT; > + } else { > + return EFI_SUCCESS; > + } > +} > + > +/** > Check the default address used by the IPv4 driver is static or dynamic > (acquired > from DHCP). >=20 > If the controller handle does not have the EFI_IP4_CONFIG2_PROTOCOL > installed, the > default address is static. If failed to get the policy from Ip4 Config= 2 Protocol, > diff --git a/MdeModulePkg/Library/DxeNetLib/DxeNetLib.inf > b/MdeModulePkg/Library/DxeNetLib/DxeNetLib.inf > index 1ff3a4f..ad0727c 100644 > --- a/MdeModulePkg/Library/DxeNetLib/DxeNetLib.inf > +++ b/MdeModulePkg/Library/DxeNetLib/DxeNetLib.inf > @@ -52,14 +52,16 @@ >=20 >=20 > [Guids] > gEfiSmbiosTableGuid ## SOMETIMES_CONSUMES #= # > SystemTable > gEfiSmbios3TableGuid ## SOMETIMES_CONSUMES #= # > SystemTable > + gEfiAdapterInfoMediaStateGuid ## SOMETIMES_CONSUMES >=20 >=20 > [Protocols] > gEfiSimpleNetworkProtocolGuid ## SOMETIMES_CONSUMES > gEfiManagedNetworkProtocolGuid ## SOMETIMES_CONSUMES > gEfiManagedNetworkServiceBindingProtocolGuid ## > SOMETIMES_CONSUMES > gEfiIp4Config2ProtocolGuid ## SOMETIMES_CONSUMES > gEfiComponentNameProtocolGuid ## SOMETIMES_CONSUMES > gEfiComponentName2ProtocolGuid ## SOMETIMES_CONSUMES > + gEfiAdapterInformationProtocolGuid ## SOMETIMES_CONSUMES > \ No newline at end of file > -- > 1.9.5.msysgit.1