+\r
+/**\r
+ This dedicated timer is used to poll underlying network media status. In case \r
+ of cable swap or wireless network switch, a new round auto configuration will \r
+ be initiated. The timer will signal the IP4 to run DHCP configuration again. \r
+ IP4 driver will free old IP address related resource, such as route table and \r
+ Interface, then initiate a DHCP process to acquire new IP, eventually create \r
+ route table for new IP address.\r
+\r
+ @param[in] Event The IP4 service instance's heart beat timer.\r
+ @param[in] Context The IP4 service instance.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+Ip4TimerReconfigChecking (\r
+ IN EFI_EVENT Event,\r
+ IN VOID *Context\r
+ )\r
+{\r
+ IP4_SERVICE *IpSb;\r
+ BOOLEAN OldMediaPresent;\r
+ EFI_STATUS Status;\r
+ EFI_SIMPLE_NETWORK_MODE SnpModeData;\r
+\r
+ IpSb = (IP4_SERVICE *) Context;\r
+ NET_CHECK_SIGNATURE (IpSb, IP4_SERVICE_SIGNATURE);\r
+ \r
+ OldMediaPresent = IpSb->MediaPresent;\r
+\r
+ //\r
+ // Get fresh mode data from MNP, since underlying media status may change. \r
+ // Here, it needs to mention that the MediaPresent can also be checked even if \r
+ // EFI_NOT_STARTED returned while this MNP child driver instance isn't configured.\r
+ //\r
+ Status = IpSb->Mnp->GetModeData (IpSb->Mnp, NULL, &SnpModeData);\r
+ if (EFI_ERROR (Status) && (Status != EFI_NOT_STARTED)) {\r
+ return;\r
+ }\r
+\r
+ IpSb->MediaPresent = SnpModeData.MediaPresent;\r
+ //\r
+ // Media transimit Unpresent to Present means new link movement is detected.\r
+ //\r
+ if (!OldMediaPresent && IpSb->MediaPresent && (IpSb->Ip4Config2Instance.Policy == Ip4Config2PolicyDhcp)) {\r
+ //\r
+ // Signal the IP4 to run the dhcp configuration again. IP4 driver will free\r
+ // old IP address related resource, such as route table and Interface, then \r
+ // initiate a DHCP round to acquire new IP, eventually \r
+ // create route table for new IP address.\r
+ //\r
+ if (IpSb->ReconfigEvent != NULL) {\r
+ Status = gBS->SignalEvent (IpSb->ReconfigEvent);\r
+ DispatchDpc ();\r
+ }\r
+ }\r
+}\r