mirror of
https://github.com/acidanthera/audk.git
synced 2025-07-31 01:24:12 +02:00
1. Enabled IP4 layer auto configuration in case cable swap is detected.
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@11582 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
parent
8990b82f4f
commit
9f82599a51
@ -1,7 +1,7 @@
|
|||||||
/** @file
|
/** @file
|
||||||
This code implements the IP4Config and NicIp4Config protocols.
|
This code implements the IP4Config and NicIp4Config protocols.
|
||||||
|
|
||||||
Copyright (c) 2006 - 2010, Intel Corporation. All rights reserved.<BR>
|
Copyright (c) 2006 - 2011, Intel Corporation. All rights reserved.<BR>
|
||||||
This program and the accompanying materials
|
This program and the accompanying materials
|
||||||
are licensed and made available under the terms and conditions of the BSD License
|
are licensed and made available under the terms and conditions of the BSD License
|
||||||
which accompanies this distribution. The full text of the license may be found at<BR>
|
which accompanies this distribution. The full text of the license may be found at<BR>
|
||||||
@ -129,6 +129,17 @@ EfiNicIp4ConfigSetInfo (
|
|||||||
DispatchDpc ();
|
DispatchDpc ();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// A dedicated timer is used to poll underlying media status.In case of
|
||||||
|
// cable swap, a new round auto configuration will be initiated. The timer
|
||||||
|
// starts in DHCP policy only. STATIC policy stops the timer.
|
||||||
|
//
|
||||||
|
if (NicConfig->Source == IP4_CONFIG_SOURCE_DHCP) {
|
||||||
|
gBS->SetTimer (Instance->Timer, TimerPeriodic, TICKS_PER_SECOND);
|
||||||
|
} else if (NicConfig->Source == IP4_CONFIG_SOURCE_STATIC) {
|
||||||
|
gBS->SetTimer (Instance->Timer, TimerCancel, 0);
|
||||||
|
}
|
||||||
|
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -659,3 +670,57 @@ Ip4ConfigCleanConfig (
|
|||||||
Ip4ConfigCleanDhcp4 (Instance);
|
Ip4ConfigCleanDhcp4 (Instance);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
A dedicated timer is used to poll underlying media status. In case of
|
||||||
|
cable swap, a new round auto configuration will be initiated. The timer
|
||||||
|
will signal the IP4 to run the auto configuration again. IP4 driver will free
|
||||||
|
old IP address related resource, such as route table and Interface, then
|
||||||
|
initiate a DHCP process by IP4Config->Start to acquire new IP, eventually
|
||||||
|
create route table for new IP address.
|
||||||
|
|
||||||
|
@param[in] Event The IP4 service instance's heart beat timer.
|
||||||
|
@param[in] Context The IP4 service instance.
|
||||||
|
|
||||||
|
**/
|
||||||
|
VOID
|
||||||
|
EFIAPI
|
||||||
|
MediaChangeDetect (
|
||||||
|
IN EFI_EVENT Event,
|
||||||
|
IN VOID *Context
|
||||||
|
)
|
||||||
|
{
|
||||||
|
BOOLEAN OldMediaPresent;
|
||||||
|
EFI_STATUS Status;
|
||||||
|
EFI_SIMPLE_NETWORK_MODE SnpModeData;
|
||||||
|
IP4_CONFIG_INSTANCE *Instance;
|
||||||
|
|
||||||
|
Instance = (IP4_CONFIG_INSTANCE *) Context;
|
||||||
|
|
||||||
|
OldMediaPresent = Instance->MediaPresent;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Get fresh mode data from MNP, since underlying media status may change
|
||||||
|
//
|
||||||
|
Status = Instance->Mnp->GetModeData (Instance->Mnp, NULL, &SnpModeData);
|
||||||
|
if (EFI_ERROR (Status) && (Status != EFI_NOT_STARTED)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
Instance->MediaPresent = SnpModeData.MediaPresent;
|
||||||
|
//
|
||||||
|
// Media transimit Unpresent to Present means new link movement is detected.
|
||||||
|
//
|
||||||
|
if (!OldMediaPresent && Instance->MediaPresent) {
|
||||||
|
//
|
||||||
|
// Signal the IP4 to run the auto configuration again. IP4 driver will free
|
||||||
|
// old IP address related resource, such as route table and Interface, then
|
||||||
|
// initiate a DHCP round by IP4Config->Start to acquire new IP, eventually
|
||||||
|
// create route table for new IP address.
|
||||||
|
//
|
||||||
|
if (Instance->ReconfigEvent != NULL) {
|
||||||
|
Status = gBS->SignalEvent (Instance->ReconfigEvent);
|
||||||
|
DispatchDpc ();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
/** @file
|
/** @file
|
||||||
Header file for IP4Config driver.
|
Header file for IP4Config driver.
|
||||||
|
|
||||||
Copyright (c) 2006 - 2010, Intel Corporation. All rights reserved.<BR>
|
Copyright (c) 2006 - 2011, Intel Corporation. All rights reserved.<BR>
|
||||||
This program and the accompanying materials
|
This program and the accompanying materials
|
||||||
are licensed and made available under the terms and conditions of the BSD License
|
are licensed and made available under the terms and conditions of the BSD License
|
||||||
which accompanies this distribution. The full text of the license may be found at<BR>
|
which accompanies this distribution. The full text of the license may be found at<BR>
|
||||||
@ -128,6 +128,16 @@ typedef struct _IP4_CONFIG_INSTANCE {
|
|||||||
EFI_DHCP4_PROTOCOL *Dhcp4;
|
EFI_DHCP4_PROTOCOL *Dhcp4;
|
||||||
EFI_HANDLE Dhcp4Handle;
|
EFI_HANDLE Dhcp4Handle;
|
||||||
EFI_EVENT Dhcp4Event;
|
EFI_EVENT Dhcp4Event;
|
||||||
|
|
||||||
|
//
|
||||||
|
// A dedicated timer is used to poll underlying media status
|
||||||
|
//
|
||||||
|
EFI_EVENT Timer;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Underlying media present status.
|
||||||
|
//
|
||||||
|
BOOLEAN MediaPresent;
|
||||||
} IP4_CONFIG_INSTANCE;
|
} IP4_CONFIG_INSTANCE;
|
||||||
|
|
||||||
#define IP4_CONFIG_INSTANCE_FROM_IP4CONFIG(this) \
|
#define IP4_CONFIG_INSTANCE_FROM_IP4CONFIG(this) \
|
||||||
@ -496,4 +506,23 @@ EfiIp4ConfigGetData (
|
|||||||
OUT EFI_IP4_IPCONFIG_DATA *ConfigData OPTIONAL
|
OUT EFI_IP4_IPCONFIG_DATA *ConfigData OPTIONAL
|
||||||
);
|
);
|
||||||
|
|
||||||
|
/**
|
||||||
|
A dedicated timer is used to poll underlying media status. In case of
|
||||||
|
cable swap, a new round auto configuration will be initiated. The timer
|
||||||
|
will signal the IP4 to run the auto configuration again. IP4 driver will free
|
||||||
|
old IP address related resource, such as route table and Interface, then
|
||||||
|
initiate a DHCP round by IP4Config->Start to acquire new IP, eventually
|
||||||
|
create route table for new IP address.
|
||||||
|
|
||||||
|
@param[in] Event The IP4 service instance's heart beat timer.
|
||||||
|
@param[in] Context The IP4 service instance.
|
||||||
|
|
||||||
|
**/
|
||||||
|
VOID
|
||||||
|
EFIAPI
|
||||||
|
MediaChangeDetect (
|
||||||
|
IN EFI_EVENT Event,
|
||||||
|
IN VOID *Context
|
||||||
|
);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
/** @file
|
/** @file
|
||||||
The driver binding for IP4 CONFIG protocol.
|
The driver binding for IP4 CONFIG protocol.
|
||||||
|
|
||||||
Copyright (c) 2006 - 2010, Intel Corporation. All rights reserved.<BR>
|
Copyright (c) 2006 - 2011, Intel Corporation. All rights reserved.<BR>
|
||||||
This program and the accompanying materials
|
This program and the accompanying materials
|
||||||
are licensed and made available under the terms and conditions of the BSD License
|
are licensed and made available under the terms and conditions of the BSD License
|
||||||
which accompanies this distribution. The full text of the license may be found at<BR>
|
which accompanies this distribution. The full text of the license may be found at<BR>
|
||||||
@ -77,7 +77,9 @@ IP4_CONFIG_INSTANCE mIp4ConfigTemplate = {
|
|||||||
(NIC_IP4_CONFIG_INFO *) NULL,
|
(NIC_IP4_CONFIG_INFO *) NULL,
|
||||||
(EFI_DHCP4_PROTOCOL *) NULL,
|
(EFI_DHCP4_PROTOCOL *) NULL,
|
||||||
NULL,
|
NULL,
|
||||||
NULL
|
NULL,
|
||||||
|
NULL,
|
||||||
|
TRUE
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -285,6 +287,21 @@ Ip4ConfigDriverBindingStart (
|
|||||||
goto ON_ERROR;
|
goto ON_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// A dedicated timer is used to poll underlying media status.
|
||||||
|
//
|
||||||
|
Status = gBS->CreateEvent (
|
||||||
|
EVT_NOTIFY_SIGNAL | EVT_TIMER,
|
||||||
|
TPL_CALLBACK,
|
||||||
|
MediaChangeDetect,
|
||||||
|
Instance,
|
||||||
|
&Instance->Timer
|
||||||
|
);
|
||||||
|
|
||||||
|
if (EFI_ERROR (Status)) {
|
||||||
|
goto ON_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Get the previous configure parameters. If an error happend here,
|
// Get the previous configure parameters. If an error happend here,
|
||||||
// just ignore it because the driver should be able to operate.
|
// just ignore it because the driver should be able to operate.
|
||||||
@ -476,6 +493,12 @@ Ip4ConfigDriverBindingStop (
|
|||||||
FreePool (Instance->MacString);
|
FreePool (Instance->MacString);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (Instance->Timer != NULL) {
|
||||||
|
gBS->SetTimer (Instance->Timer, TimerCancel, 0);
|
||||||
|
gBS->CloseEvent (Instance->Timer);
|
||||||
|
Instance->Timer = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
Ip4ConfigCleanConfig (Instance);
|
Ip4ConfigCleanConfig (Instance);
|
||||||
FreePool (Instance);
|
FreePool (Instance);
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user