[ros-diffs] [cgutman] 54944: [TCPIP] - Queue a work item from the ProtocolStatus handler so we can refresh the state from the registry instead relying on hacks to track our state

cgutman at svn.reactos.org cgutman at svn.reactos.org
Fri Jan 13 22:38:31 UTC 2012


Author: cgutman
Date: Fri Jan 13 22:38:28 2012
New Revision: 54944

URL: http://svn.reactos.org/svn/reactos?rev=54944&view=rev
Log:
[TCPIP]
- Queue a work item from the ProtocolStatus handler so we can refresh the state from the registry instead relying on hacks to track our state

Modified:
    branches/wlan-bringup/drivers/network/tcpip/datalink/lan.c
    branches/wlan-bringup/drivers/network/tcpip/include/ip.h
    branches/wlan-bringup/drivers/network/tcpip/include/lan.h
    branches/wlan-bringup/drivers/network/tcpip/tcpip/dispatch.c
    branches/wlan-bringup/lib/drivers/ip/network/ip.c

Modified: branches/wlan-bringup/drivers/network/tcpip/datalink/lan.c
URL: http://svn.reactos.org/svn/reactos/branches/wlan-bringup/drivers/network/tcpip/datalink/lan.c?rev=54944&r1=54943&r2=54944&view=diff
==============================================================================
--- branches/wlan-bringup/drivers/network/tcpip/datalink/lan.c [iso-8859-1] (original)
+++ branches/wlan-bringup/drivers/network/tcpip/datalink/lan.c [iso-8859-1] Fri Jan 13 22:38:28 2012
@@ -23,6 +23,11 @@
     UINT BytesTransferred;
     BOOLEAN LegacyReceive;
 } LAN_WQ_ITEM, *PLAN_WQ_ITEM;
+
+typedef struct _RECONFIGURE_CONTEXT {
+    ULONG State;
+    PLAN_ADAPTER Adapter;
+} RECONFIGURE_CONTEXT, *PRECONFIGURE_CONTEXT;
 
 NDIS_HANDLE NdisProtocolHandle = (NDIS_HANDLE)NULL;
 BOOLEAN ProtocolRegistered     = FALSE;
@@ -571,6 +576,9 @@
     ANSI_STRING RegistryDataA;
     ULONG Unused;
     NTSTATUS Status;
+    IP_ADDRESS DefaultMask, Router;
+    
+    AddrInitIPv4(&DefaultMask, 0);
 
     TcpipRegistryPath.MaximumLength = sizeof(WCHAR) * 150;
     TcpipRegistryPath.Length = 0;
@@ -591,8 +599,7 @@
     
     if (!NT_SUCCESS(Status))
     {
-        Interface->DhcpEnabled = TRUE;
-        return TRUE;
+        return FALSE;
     }
     else
     {
@@ -630,10 +637,12 @@
                                              &RegistryDataU,
                                              TRUE);
                 
-                AddrInitIPv4(&Interface->StaticUnicast, inet_addr(RegistryDataA.Buffer));
+                AddrInitIPv4(&Interface->Unicast, inet_addr(RegistryDataA.Buffer));
+
+                if (!AddrIsUnspecified(&Interface->Unicast))
+                    IPAddInterfaceRoute(Interface);
                 
                 RtlFreeAnsiString(&RegistryDataA);
-                
             }
 
             Status = ZwQueryValueKey(ParameterHandle,
@@ -650,7 +659,7 @@
                                              &RegistryDataU,
                                              TRUE);
                 
-                AddrInitIPv4(&Interface->StaticNetmask, inet_addr(RegistryDataA.Buffer));
+                AddrInitIPv4(&Interface->Netmask, inet_addr(RegistryDataA.Buffer));
                 
                 RtlFreeAnsiString(&RegistryDataA);
             }
@@ -670,16 +679,13 @@
                                              &RegistryDataU,
                                              TRUE);
                 
-                AddrInitIPv4(&Interface->StaticRouter, inet_addr(RegistryDataA.Buffer));
+                AddrInitIPv4(&Router, inet_addr(RegistryDataA.Buffer));
+                
+                if (!AddrIsUnspecified(&Router))
+                    RouterCreateRoute(&DefaultMask, &DefaultMask, &Router, Interface, 1);
                 
                 RtlFreeAnsiString(&RegistryDataA);
             }
-            
-            Interface->DhcpEnabled = FALSE;
-        }
-        else
-        {
-            Interface->DhcpEnabled = TRUE;
         }
         
         ZwClose(ParameterHandle);
@@ -688,38 +694,27 @@
     return TRUE;
 }
 
-BOOLEAN ReconfigureAdapter(PLAN_ADAPTER Adapter, BOOLEAN FinishedReset)
-{
+BOOLEAN ReconfigureAdapter(PRECONFIGURE_CONTEXT Context)
+{
+    PLAN_ADAPTER Adapter = Context->Adapter;
     PIP_INTERFACE Interface = Adapter->Context;
     //NDIS_STATUS NdisStatus;
     IP_ADDRESS DefaultMask;
 
     /* Initalize the default unspecified address (0.0.0.0) */
     AddrInitIPv4(&DefaultMask, 0);
-    if (Adapter->State == LAN_STATE_STARTED && !FinishedReset)
+    if (Context->State == LAN_STATE_STARTED &&
+        !Context->Adapter->CompletingReset)
     {
-        /* Set the static IP configuration */
-        if (!Interface->DhcpEnabled)
-        {
-            /* Reset the IP information */
-            Interface->Unicast = Interface->StaticUnicast;
-            Interface->Netmask = Interface->StaticNetmask;
-
-            /* Compute the broadcast address */
-            Interface->Broadcast.Type = IP_ADDRESS_V4;
-            Interface->Broadcast.Address.IPv4Address = Interface->Unicast.Address.IPv4Address |
-                                                      ~Interface->Netmask.Address.IPv4Address;
-            
-            /* Add the interface route for a static IP */
-            if (!AddrIsUnspecified(&Interface->Unicast))
-                IPAddInterfaceRoute(Interface);
-
-            /* Add the default route */
-            if (!AddrIsUnspecified(&Interface->StaticRouter))
-                RouterCreateRoute(&DefaultMask, &DefaultMask, &Interface->StaticRouter, Interface, 1);
-        }
-    }
-    else if (!FinishedReset)
+        /* Read the IP configuration */
+        ReadIpConfiguration(Interface);
+
+        /* Compute the broadcast address */
+        Interface->Broadcast.Type = IP_ADDRESS_V4;
+        Interface->Broadcast.Address.IPv4Address = Interface->Unicast.Address.IPv4Address |
+                                                  ~Interface->Netmask.Address.IPv4Address;
+    }
+    else if (!Context->Adapter->CompletingReset)
     {
         /* Clear IP configuration */
         Interface->Unicast = DefaultMask;
@@ -732,9 +727,15 @@
         /* Destroy all cached neighbors */
         NBDestroyNeighborsForInterface(Interface);
     }
+    
+    Context->Adapter->CompletingReset = FALSE;
 
     /* We're done here if the adapter isn't connected */
-    if (Adapter->State != LAN_STATE_STARTED) return TRUE;
+    if (Context->State != LAN_STATE_STARTED)
+    {
+        Adapter->State = Context->State;
+        return TRUE;
+    }
     
     /* NDIS Bug! */
 #if 0
@@ -770,8 +771,21 @@
     if (NdisStatus != NDIS_STATUS_SUCCESS)
         return FALSE;
 #endif
+
+    Adapter->State = Context->State;
     
     return TRUE;
+}
+
+VOID ReconfigureAdapterWorker(PVOID Context)
+{
+    PRECONFIGURE_CONTEXT ReconfigureContext = Context;
+    
+    /* Complete the reconfiguration asynchronously */
+    ReconfigureAdapter(ReconfigureContext);
+    
+    /* Free the context */
+    ExFreePool(ReconfigureContext);
 }
 
 VOID NTAPI ProtocolStatus(
@@ -789,8 +803,15 @@
  */
 {
     PLAN_ADAPTER Adapter = BindingContext;
+    PRECONFIGURE_CONTEXT Context;
 
     TI_DbgPrint(DEBUG_DATALINK, ("Called.\n"));
+    
+    Context = ExAllocatePool(NonPagedPool, sizeof(RECONFIGURE_CONTEXT));
+    if (!Context)
+        return;
+    
+    Context->Adapter = Adapter;
 
     switch(GeneralStatus)
     {
@@ -798,36 +819,47 @@
             DbgPrint("NDIS_STATUS_MEDIA_CONNECT\n");
 
             if (Adapter->State == LAN_STATE_STARTED)
-                break;
-
-            Adapter->OldState = Adapter->State;
-            Adapter->State = LAN_STATE_STARTED;
+            {
+                ExFreePool(Context);
+                return;
+            }
+
+            Context->State = LAN_STATE_STARTED;
             break;
             
         case NDIS_STATUS_MEDIA_DISCONNECT:
             DbgPrint("NDIS_STATUS_MEDIA_DISCONNECT\n");
             
             if (Adapter->State == LAN_STATE_STOPPED)
-                break;
+            {
+                ExFreePool(Context);
+                return;
+            }
             
-            Adapter->OldState = Adapter->State;
-            Adapter->State = LAN_STATE_STOPPED;
+            Context->State = LAN_STATE_STOPPED;
             break;
 
         case NDIS_STATUS_RESET_START:
             Adapter->OldState = Adapter->State;
             Adapter->State = LAN_STATE_RESETTING;
             /* Nothing else to do here */
-            break;
+            ExFreePool(Context);
+            return;
 
         case NDIS_STATUS_RESET_END:
-            Adapter->State = Adapter->OldState;
+            Adapter->CompletingReset = TRUE;
+            Context->State = Adapter->OldState;
             break;
 
         default:
             DbgPrint("Unhandled status: %x", GeneralStatus);
-            break;
-    }
+            ExFreePool(Context);
+            return;
+    }
+
+    /* Queue the work item */
+    if (!ChewCreate(ReconfigureAdapterWorker, Context))
+        ExFreePool(Context);
 }
 
 VOID NTAPI ProtocolStatusComplete(NDIS_HANDLE NdisBindingContext)
@@ -837,15 +869,7 @@
  *     BindingContext = Pointer to a device context (LAN_ADAPTER)
  */
 {
-    PLAN_ADAPTER Adapter = NdisBindingContext;
-
     TI_DbgPrint(DEBUG_DATALINK, ("Called.\n"));
-    
-    if (Adapter->State != LAN_STATE_RESETTING)
-    {
-        ReconfigureAdapter(Adapter,
-                           (Adapter->State == Adapter->OldState));
-    }
 }
 
 NDIS_STATUS NTAPI
@@ -1361,14 +1385,7 @@
     IPRegisterInterface(IF);
 
     /* Set adapter state */
-    Adapter->State = LAN_STATE_STARTED;
     Adapter->Context = IF;
-    
-    /* Read adapter IP configuration */
-    ReadIpConfiguration(IF);
-    
-    /* Configure the adapter */
-    ReconfigureAdapter(Adapter, FALSE);
 
     /* Set packet filter so we can send and receive packets */
     NdisStatus = NDISCall(Adapter,
@@ -1383,6 +1400,9 @@
         IPDestroyInterface(IF);
         return FALSE;
     }
+    
+    /* Indicate media connect (our drivers are broken and don't do this) */
+    ProtocolStatus(Adapter, NDIS_STATUS_MEDIA_CONNECT, NULL, 0);
 
     return TRUE;
 }

Modified: branches/wlan-bringup/drivers/network/tcpip/include/ip.h
URL: http://svn.reactos.org/svn/reactos/branches/wlan-bringup/drivers/network/tcpip/include/ip.h?rev=54944&r1=54943&r2=54944&view=diff
==============================================================================
--- branches/wlan-bringup/drivers/network/tcpip/include/ip.h [iso-8859-1] (original)
+++ branches/wlan-bringup/drivers/network/tcpip/include/ip.h [iso-8859-1] Fri Jan 13 22:38:28 2012
@@ -156,12 +156,10 @@
     UINT  MinFrameSize;           /* Minimum frame size in bytes */
     UINT  MTU;                    /* Maximum transmission unit */
     UINT  Speed;                  /* Link speed */
-    IP_ADDRESS Unicast, StaticUnicast;/* Unicast address */
-    IP_ADDRESS PointToPoint, StaticPointToPoint;/* Point to point address */
-    IP_ADDRESS Netmask, StaticNetmask;/* Netmask */
+    IP_ADDRESS Unicast;           /* Unicast address */
+    IP_ADDRESS PointToPoint;      /* Point to point address */
+    IP_ADDRESS Netmask;           /* Netmask */
     IP_ADDRESS Broadcast;         /* Broadcast */
-    IP_ADDRESS StaticRouter;      /* Static default route */
-    BOOLEAN DhcpEnabled;          /* DHCP enabled */
     UNICODE_STRING Name;          /* Adapter name (GUID) */
     UNICODE_STRING Description;   /* Adapter description (Human readable) */
     PUCHAR Address;               /* Pointer to interface address */

Modified: branches/wlan-bringup/drivers/network/tcpip/include/lan.h
URL: http://svn.reactos.org/svn/reactos/branches/wlan-bringup/drivers/network/tcpip/include/lan.h?rev=54944&r1=54943&r2=54944&view=diff
==============================================================================
--- branches/wlan-bringup/drivers/network/tcpip/include/lan.h [iso-8859-1] (original)
+++ branches/wlan-bringup/drivers/network/tcpip/include/lan.h [iso-8859-1] Fri Jan 13 22:38:28 2012
@@ -40,6 +40,7 @@
     LIST_ENTRY ListEntry;                   /* Entry on list */
     KSPIN_LOCK Lock;                        /* Lock for this structure */
     UCHAR State, OldState;                  /* State of the adapter */
+    BOOLEAN CompletingReset;                /* Reset is finishing */
     KEVENT Event;                           /* Opening event */
     PVOID Context;                          /* Upper layer context information */
     NDIS_HANDLE NdisHandle;                 /* NDIS binding handle */

Modified: branches/wlan-bringup/drivers/network/tcpip/tcpip/dispatch.c
URL: http://svn.reactos.org/svn/reactos/branches/wlan-bringup/drivers/network/tcpip/tcpip/dispatch.c?rev=54944&r1=54943&r2=54944&view=diff
==============================================================================
--- branches/wlan-bringup/drivers/network/tcpip/tcpip/dispatch.c [iso-8859-1] (original)
+++ branches/wlan-bringup/drivers/network/tcpip/tcpip/dispatch.c [iso-8859-1] Fri Jan 13 22:38:28 2012
@@ -1552,11 +1552,9 @@
 
             IF->Unicast.Type = IP_ADDRESS_V4;
             IF->Unicast.Address.IPv4Address = IpAddrChange->Address;
-            IF->StaticUnicast = IF->Unicast;
 
             IF->Netmask.Type = IP_ADDRESS_V4;
             IF->Netmask.Address.IPv4Address = IpAddrChange->Netmask;
-            IF->StaticNetmask = IF->Netmask;
             
             IF->Broadcast.Type = IP_ADDRESS_V4;
 	    IF->Broadcast.Address.IPv4Address =
@@ -1568,7 +1566,6 @@
             TI_DbgPrint(MID_TRACE,("New Netmask        : %x\n",
                                    IF->Netmask.Address.IPv4Address));
 
-            IF->DhcpEnabled = FALSE;
             IPAddInterfaceRoute( IF );
 
             IpAddrChange->Address = IF->Index;
@@ -1592,16 +1589,13 @@
             IPRemoveInterfaceRoute( IF );
             IF->Unicast.Type = IP_ADDRESS_V4;
             IF->Unicast.Address.IPv4Address = 0;
-            IF->StaticUnicast = IF->Unicast;
 
             IF->Netmask.Type = IP_ADDRESS_V4;
             IF->Netmask.Address.IPv4Address = 0;
-            IF->StaticNetmask = IF->Netmask;
 
             IF->Broadcast.Type = IP_ADDRESS_V4;
             IF->Broadcast.Address.IPv4Address = 0;
 
-            IF->DhcpEnabled = TRUE;
             Status = STATUS_SUCCESS;
         }
     } EndFor(IF);

Modified: branches/wlan-bringup/lib/drivers/ip/network/ip.c
URL: http://svn.reactos.org/svn/reactos/branches/wlan-bringup/lib/drivers/ip/network/ip.c?rev=54944&r1=54943&r2=54944&view=diff
==============================================================================
--- branches/wlan-bringup/lib/drivers/ip/network/ip.c [iso-8859-1] (original)
+++ branches/wlan-bringup/lib/drivers/ip/network/ip.c [iso-8859-1] Fri Jan 13 22:38:28 2012
@@ -214,7 +214,6 @@
 	IF->PointToPoint.Type = IP_ADDRESS_V4;
 	IF->Netmask.Type = IP_ADDRESS_V4;
 	IF->Broadcast.Type = IP_ADDRESS_V4;
-    IF->StaticRouter.Type = IP_ADDRESS_V4;
 
     TcpipInitializeSpinLock(&IF->Lock);
 




More information about the Ros-diffs mailing list