public inbox for devel@edk2.groups.io
 help / color / mirror / Atom feed
From: "Tinh Nguyen" <tinhnguyen@os.amperecomputing.com>
To: Michael Brown <mcb30@ipxe.org>,
	"devel@edk2.groups.io" <devel@edk2.groups.io>,
	Tinh Nguyen OS <tinhnguyen@os.amperecomputing.com>,
	"richardho@ami.com" <richardho@ami.com>
Subject: Re: [edk2-devel] [PATCH v2 1/3] UsbNetworkPkg/UsbRndis: Add USB RNDIS devices support
Date: Wed, 8 Feb 2023 02:46:24 +0000	[thread overview]
Message-ID: <d0e1dbeb-9c5e-b923-5367-8b23e6339413@amperemail.onmicrosoft.com> (raw)
In-Reply-To: <010201862af5f9a8-3ff78c40-4bcb-4fdf-83dd-e8888694d1a5-000000@eu-west-1.amazonses.com>

[-- Attachment #1: Type: text/plain, Size: 746 bytes --]

On 2/7/2023 3:20 PM, Michael Brown wrote:
> On 07/02/2023 06:21, Tinh Nguyen via groups.io wrote:
>> From: Tinh Nguyen <tinhn@os.amperecomputing.com>
>> Date: Tue, 7 Feb 2023 12:43:17 +0700
>> Subject: [PATCH] UsbNetworkPkg: Support rate limitting
>>
>> Signed-off-by: Tinh Nguyen <tinhn@os.amperecomputing.com>
>
> Thank you for extending my patch to add the PCD support.  The overall 
> patch appears still to be substantially my code: could you please 
> credit it as such?
>
Oops, sorry, my alias command generates a patch with my signature which 
I don't review on a regular


See my update below in attached file

Anyway, it is a proposal for Richard to use for his patch. And need his 
approval to pick-up

- Tinh


[-- Attachment #2: 0001-UsbNetworkPkg-Support-rate-limitting_v2.patch --]
[-- Type: text/plain, Size: 7587 bytes --]

From 1dd7ad0e590204008505ff039e77f8964210e811 Mon Sep 17 00:00:00 2001
From: Tinh Nguyen <tinhn@os.amperecomputing.com>
Date: Tue, 7 Feb 2023 12:43:17 +0700
Subject: [PATCH] UsbNetworkPkg: Support rate limitting

Signed-off-by: Michael Brown <mcb30@ipxe.org>
---
 .../Protocol/EdkIIUsbEthernetProtocol.h       |  4 ++
 UsbNetworkPkg/NetworkCommon/DriverBinding.c   |  5 ++
 UsbNetworkPkg/NetworkCommon/DriverBinding.h   |  1 +
 UsbNetworkPkg/NetworkCommon/NetworkCommon.inf |  5 ++
 UsbNetworkPkg/NetworkCommon/PxeFunction.c     | 67 +++++++++++++++++--
 UsbNetworkPkg/UsbNetworkPkg.dec               |  5 ++
 6 files changed, 82 insertions(+), 5 deletions(-)

diff --git a/UsbNetworkPkg/Include/Protocol/EdkIIUsbEthernetProtocol.h b/UsbNetworkPkg/Include/Protocol/EdkIIUsbEthernetProtocol.h
index f1df1c4cbd..0ad25ad8ea 100644
--- a/UsbNetworkPkg/Include/Protocol/EdkIIUsbEthernetProtocol.h
+++ b/UsbNetworkPkg/Include/Protocol/EdkIIUsbEthernetProtocol.h
@@ -159,6 +159,10 @@ typedef struct {
   UINT8                          CurrentNodeAddress[PXE_MAC_LENGTH];
   UINT8                          BroadcastNodeAddress[PXE_MAC_LENGTH];
   EFI_USB_DEVICE_REQUEST         Request;
+  EFI_EVENT                      RateLimiter;
+  UINT32                         RateLimitingCredit;
+  UINT32                         RateLimitingCreditCount;
+  BOOLEAN                        RateLimitingEnable;
 } NIC_DATA;
 
 #define NIC_DATA_SIGNATURE  SIGNATURE_32('n', 'i', 'c', 'd')
diff --git a/UsbNetworkPkg/NetworkCommon/DriverBinding.c b/UsbNetworkPkg/NetworkCommon/DriverBinding.c
index ded334cd0a..f59bc0d5ab 100644
--- a/UsbNetworkPkg/NetworkCommon/DriverBinding.c
+++ b/UsbNetworkPkg/NetworkCommon/DriverBinding.c
@@ -347,6 +347,11 @@ NetworkCommonDriverStart (
   NicDevice->NiiProtocol.StringId[3] = 'I';
   NicDevice->DeviceHandle            = NULL;
 
+  NicDevice->NicInfo.RateLimitingEnable      = PcdGetBool (EnableRateLimiting);
+  NicDevice->NicInfo.RateLimitingCreditCount = 0;
+  NicDevice->NicInfo.RateLimitingCredit      = PcdGet32 (RateLimitingCredit);
+  NicDevice->NicInfo.RateLimiter             = NULL;
+
   ZeroMem (&NicDevice->NicInfo.Request, sizeof (EFI_USB_DEVICE_REQUEST));
 
   Status = UsbEth->UsbEthInterrupt (UsbEth, TRUE, NETWORK_COMMON_POLLING_INTERVAL, &NicDevice->NicInfo.Request);
diff --git a/UsbNetworkPkg/NetworkCommon/DriverBinding.h b/UsbNetworkPkg/NetworkCommon/DriverBinding.h
index 1aa4c86ff9..077a64719b 100644
--- a/UsbNetworkPkg/NetworkCommon/DriverBinding.h
+++ b/UsbNetworkPkg/NetworkCommon/DriverBinding.h
@@ -14,6 +14,7 @@
 #include <Library/DevicePathLib.h>
 #include <Library/DebugLib.h>
 #include <Library/MemoryAllocationLib.h>
+#include <Library/PcdLib.h>
 #include <Library/BaseMemoryLib.h>
 #include <Library/UefiUsbLib.h>
 #include <Protocol/UsbIo.h>
diff --git a/UsbNetworkPkg/NetworkCommon/NetworkCommon.inf b/UsbNetworkPkg/NetworkCommon/NetworkCommon.inf
index 2691e8e70d..74a24ff7d6 100644
--- a/UsbNetworkPkg/NetworkCommon/NetworkCommon.inf
+++ b/UsbNetworkPkg/NetworkCommon/NetworkCommon.inf
@@ -40,5 +40,10 @@
   gEfiDriverBindingProtocolGuid
   gEdkIIUsbEthProtocolGuid
 
+[Pcd]
+  gUsbNetworkPkgTokenSpaceGuid.EnableRateLimiting
+  gUsbNetworkPkgTokenSpaceGuid.RateLimitingCredit
+  gUsbNetworkPkgTokenSpaceGuid.RateLimitingFactor
+
 [Depex]
   TRUE
diff --git a/UsbNetworkPkg/NetworkCommon/PxeFunction.c b/UsbNetworkPkg/NetworkCommon/PxeFunction.c
index aae7d787db..7c67c13a5c 100644
--- a/UsbNetworkPkg/NetworkCommon/PxeFunction.c
+++ b/UsbNetworkPkg/NetworkCommon/PxeFunction.c
@@ -29,6 +29,20 @@ API_FUNC  gUndiApiTable[] = {
   UndiReceive
 };
 
+VOID
+EFIAPI
+UndiRateLimiterCallback (
+  IN  EFI_EVENT  Event,
+  IN  VOID       *Context
+  )
+{
+  NIC_DATA  *Nic = Context;
+
+  if (Nic->RateLimitingCreditCount < Nic->RateLimitingCredit) {
+    Nic->RateLimitingCreditCount++;
+  }
+}
+
 /**
   This command is used to determine the operational state of the UNDI.
 
@@ -100,9 +114,6 @@ UndiStart (
     Cdb->StatFlags = PXE_STATFLAGS_COMMAND_FAILED;
     Cdb->StatCode  = PXE_STATCODE_INVALID_CDB;
     return;
-  } else {
-    Cdb->StatFlags = PXE_STATFLAGS_COMMAND_COMPLETE;
-    Cdb->StatCode  = PXE_STATCODE_SUCCESS;
   }
 
   if (Nic->State != PXE_STATFLAGS_GET_STATE_STOPPED) {
@@ -120,14 +131,46 @@ UndiStart (
   Nic->PxeStart.UnMap_Mem = 0;
   Nic->PxeStart.Sync_Mem  = Cpb->Sync_Mem;
   Nic->PxeStart.Unique_ID = Cpb->Unique_ID;
-  Nic->State              = PXE_STATFLAGS_GET_STATE_STARTED;
+
+  Status = gBS->CreateEvent (
+                  EVT_TIMER | EVT_NOTIFY_SIGNAL,
+                  TPL_CALLBACK,
+                  UndiRateLimiterCallback,
+                  Nic,
+                  &Nic->RateLimiter
+                  );
+  if (EFI_ERROR (Status)) {
+    goto ErrorCreateEvent;
+  }
+
+  Status = gBS->SetTimer (
+                  Nic->RateLimiter,
+                  TimerPeriodic,
+                  PcdGet32 (RateLimitingFactor) * 10000
+                  );
+  if (EFI_ERROR (Status)) {
+    goto ErrorSetTimer;
+  }
 
   if (Nic->UsbEth->UsbEthUndi.UsbEthUndiStart != NULL) {
     Status = Nic->UsbEth->UsbEthUndi.UsbEthUndiStart (Cdb, Nic);
     if (EFI_ERROR (Status)) {
-      Cdb->StatFlags = PXE_STATFLAGS_COMMAND_FAILED;
+      goto ErrorUndiStart;
     }
   }
+
+  Nic->State     = PXE_STATFLAGS_GET_STATE_STARTED;
+  Cdb->StatFlags = PXE_STATFLAGS_COMMAND_COMPLETE;
+  Cdb->StatCode  = PXE_STATCODE_SUCCESS;
+  return;
+
+ErrorUndiStart:
+  gBS->SetTimer (&Nic->RateLimiter, TimerCancel, 0);
+ErrorSetTimer:
+  gBS->CloseEvent (&Nic->RateLimiter);
+ErrorCreateEvent:
+  Cdb->StatFlags = PXE_STATFLAGS_COMMAND_FAILED;
+  Cdb->StatCode  = PXE_STATCODE_DEVICE_FAILURE;
 }
 
 /**
@@ -183,6 +226,9 @@ UndiStop (
   Nic->PxeStart.Sync_Mem  = 0;
   Nic->State              = PXE_STATFLAGS_GET_STATE_STOPPED;
 
+  gBS->SetTimer (&Nic->RateLimiter, TimerCancel, 0);
+  gBS->CloseEvent (&Nic->RateLimiter);
+
   if (Nic->UsbEth->UsbEthUndi.UsbEthUndiStop != NULL) {
     Status = Nic->UsbEth->UsbEthUndi.UsbEthUndiStop (Cdb, Nic);
     if (EFI_ERROR (Status)) {
@@ -1476,6 +1522,7 @@ Receive (
   UINT8            *BulkInData;
   UINTN            DataLength;
   EthernetHeader   *Header;
+  EFI_TPL          OriginalTpl;
 
   FrameType  = PXE_FRAME_TYPE_NONE;
   NicDevice  = UNDI_DEV_FROM_NIC (Nic);
@@ -1488,9 +1535,19 @@ Receive (
     return PXE_STATCODE_INVALID_PARAMETER;
   }
 
+  if ((Nic->RateLimitingCreditCount == 0) && (Nic->RateLimitingEnable == TRUE)) {
+    return PXE_STATCODE_NO_DATA;
+  }
+
   Status = Nic->UsbEth->UsbEthReceive (Cdb, Nic->UsbEth, (VOID *)BulkInData, &DataLength);
   if (EFI_ERROR (Status)) {
     Nic->ReceiveStatus = 0;
+    OriginalTpl = gBS->RaiseTPL (TPL_NOTIFY);
+    if (Nic->RateLimitingCreditCount != 0) {
+      Nic->RateLimitingCreditCount--;
+    }
+
+    gBS->RestoreTPL (OriginalTpl);
     return PXE_STATCODE_NO_DATA;
   }
 
diff --git a/UsbNetworkPkg/UsbNetworkPkg.dec b/UsbNetworkPkg/UsbNetworkPkg.dec
index fa7c40b7ef..8dec8024de 100644
--- a/UsbNetworkPkg/UsbNetworkPkg.dec
+++ b/UsbNetworkPkg/UsbNetworkPkg.dec
@@ -34,3 +34,8 @@
   ## Set the PCD 'UsbRndisSupport' to 'TRUE' if 'Usb Rndis device' need to be enabled.
   gUsbNetworkPkgTokenSpaceGuid.UsbRndisSupport|TRUE|BOOLEAN|0x00000003
 
+[PcdsFixedAtBuild, PcdsPatchableInModule, PcdsDynamic, PcdsDynamicEx]
+  ## Support rate limitting
+  gUsbNetworkPkgTokenSpaceGuid.EnableRateLimiting|FALSE|BOOLEAN|0x00000004
+  gUsbNetworkPkgTokenSpaceGuid.RateLimitingCredit|10|UINT32|0x00000005
+  gUsbNetworkPkgTokenSpaceGuid.RateLimitingFactor|100|UINT32|0x00000006  # unit 1ms
-- 
2.25.1


  reply	other threads:[~2023-02-08  2:46 UTC|newest]

Thread overview: 10+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-02-04  8:54 [PATCH v2 1/3] UsbNetworkPkg/UsbRndis: Add USB RNDIS devices support RichardHo [何明忠]
2023-02-04  8:54 ` [PATCH v2 2/3] UsbNetworkPkg/UsbCdcEcm: Add USB Cdc ECM " RichardHo [何明忠]
2023-02-04  8:54 ` [PATCH v2 3/3] UsbNetworkPkg/UsbCdcNcm: Add USB Cdc NCM " RichardHo [何明忠]
2023-02-07  6:21 ` [edk2-devel] [PATCH v2 1/3] UsbNetworkPkg/UsbRndis: Add USB RNDIS " Tinh Nguyen
2023-02-07  8:20   ` Michael Brown
2023-02-08  2:46     ` Tinh Nguyen [this message]
2023-02-09  3:04       ` RichardHo [何明忠]
2023-02-09 14:53     ` Rebecca Cran
2023-02-07 16:13 ` Rebecca Cran
2023-02-09  3:05   ` RichardHo [何明忠]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-list from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=d0e1dbeb-9c5e-b923-5367-8b23e6339413@amperemail.onmicrosoft.com \
    --to=devel@edk2.groups.io \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox