Some comments were not understandable.

Added a new case when to destroy interface (when Up() failes and DialOnDemand is disabled).
Forgot some to remove fUpThread in Up().
Changed UpFailedEvent() so that it pretends a connection-lost event (so we can try to redial).
Added ResetOptionHandlers() and DownProtocols/Encapsulators().


git-svn-id: file:///srv/svn/repos/haiku/trunk/current@4351 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Waldemar Kornewald 2003-08-20 11:41:24 +00:00
parent f6a64130ad
commit 103501d9d7
3 changed files with 136 additions and 49 deletions

View File

@ -75,8 +75,6 @@ class PPPStateMachine {
private:
BLocker& Locker()
{ return fLock; }
void LeaveConstructionPhase();
void EnterDestructionPhase();
// private StateMachine methods
void NewState(PPP_STATE next);
@ -121,6 +119,10 @@ class PPPStateMachine {
void BringHandlersUp();
uint32 BringPhaseUp();
void DownProtocols();
void DownEncapsulators();
void ResetOptionHandlers();
private:
PPPInterface *fInterface;

View File

@ -450,6 +450,14 @@ PPPInterface::Up()
while(true) {
if(IsUp()) {
fReportManager.DisableReports(PPP_CONNECTION_REPORT, me);
if(me == fUpThread) {
fLock.Lock();
fDialRetry = 0;
fUpThread = -1;
fLock.Unlock();
}
return true;
}
@ -457,6 +465,11 @@ PPPInterface::Up()
continue;
if(IsUp()) {
if(me == fUpThread) {
fDialRetry = 0;
fUpThread = -1;
}
PPP_REPLY(sender, B_OK);
fReportManager.DisableReports(PPP_CONNECTION_REPORT, me);
return true;
@ -464,6 +477,11 @@ PPPInterface::Up()
if(report.type == PPP_DESTRUCTION_REPORT) {
if(me == fUpThread) {
fDialRetry = 0;
fUpThread = -1;
}
PPP_REPLY(sender, B_OK);
fReportManager.DisableReports(PPP_CONNECTION_REPORT, me);
return false;
@ -476,12 +494,25 @@ PPPInterface::Up()
PPP_REPLY(sender, B_OK);
continue;
} else if(report.code == PPP_REPORT_UP_SUCCESSFUL) {
if(me == fUpThread) {
fDialRetry = 0;
fUpThread = -1;
}
PPP_REPLY(sender, B_OK);
fReportManager.DisableReports(PPP_CONNECTION_REPORT, me);
return true;
} else if(report.code == PPP_REPORT_DOWN_SUCCESSFUL
|| report.code == PPP_REPORT_UP_ABORTED
|| report.code == PPP_REPORT_AUTHENTICATION_FAILED) {
if(me == fUpThread) {
fDialRetry = 0;
fUpThread = -1;
if(!DoesDialOnDemand() && report.code != PPP_REPORT_DOWN_SUCCESSFUL)
fManager->delete_interface(this);
}
PPP_REPLY(sender, B_OK);
fReportManager.DisableReports(PPP_CONNECTION_REPORT, me);
return false;
@ -514,6 +545,11 @@ PPPInterface::Up()
if(fDialRetry >= fDialRetriesLimit) {
fDialRetry = 0;
fUpThread = -1;
if(!DoesDialOnDemand()
&& report.code != PPP_REPORT_DOWN_SUCCESSFUL)
fManager->delete_interface(this);
PPP_REPLY(sender, B_OK);
fReportManager.DisableReports(PPP_CONNECTION_REPORT, me);
return false;
@ -536,6 +572,11 @@ PPPInterface::Up()
fUpThread = -1;
PPP_REPLY(sender, B_OK);
fReportManager.DisableReports(PPP_CONNECTION_REPORT, me);
if(!DoesDialOnDemand()
&& report.code != PPP_REPORT_DOWN_SUCCESSFUL)
fManager->delete_interface(this);
return false;
}
}

View File

@ -40,9 +40,8 @@ PPPStateMachine::NextID()
void
PPPStateMachine::NewState(PPP_STATE next)
{
// TODO:
// if(State() == PPP_OPENED_STATE)
// ResetOptionHandlers();
if(State() == PPP_OPENED_STATE && next != State())
ResetOptionHandlers();
fState = next;
}
@ -195,8 +194,8 @@ PPPStateMachine::DownEvent(PPPInterface *interface)
if(Interface()->IsMultilink() && !Interface()->Parent()) {
uint32 count = 0;
PPPInterface *child;
for(int32 i = 0; i < Interface()->CountChildren(); i++) {
child = Interface()->ChildAt(i);
for(int32 index = 0; index < Interface()->CountChildren(); index++) {
child = Interface()->ChildAt(index);
if(child && child->IsUp())
++count;
@ -213,8 +212,20 @@ PPPStateMachine::DownEvent(PPPInterface *interface)
void
PPPStateMachine::UpFailedEvent(PPPProtocol *protocol)
{
if(protocol->Flags() & PPP_NOT_IMPORTANT)
CloseEvent();
if((protocol->Flags() & PPP_NOT_IMPORTANT) == 0) {
if(Interface()->Mode() == PPP_CLIENT_MODE) {
// pretend we lost connection:
if(Interface()->IsMultilink() && !Interface()->Parent())
for(int32 index = 0; index < Interface()->CountChildren(); index++)
Interface()->ChildAt(index)->StateMachine().CloseEvent();
else if(Interface()->Device())
Interface()->Device()->Down();
else
CloseEvent();
// just to be on the secure side ;)
} else
CloseEvent();
}
}
@ -237,8 +248,20 @@ PPPStateMachine::DownEvent(PPPProtocol *protocol)
void
PPPStateMachine::UpFailedEvent(PPPEncapsulator *encapsulator)
{
if(encapsulator->Flags() & PPP_NOT_IMPORTANT)
CloseEvent();
if((encapsulator->Flags() & PPP_NOT_IMPORTANT) == 0) {
if(Interface()->Mode() == PPP_CLIENT_MODE) {
// pretend we lost connection:
if(Interface()->IsMultilink() && !Interface()->Parent())
for(int32 index = 0; index < Interface()->CountChildren(); index++)
Interface()->ChildAt(index)->StateMachine().CloseEvent();
else if(Interface()->Device())
Interface()->Device()->Down();
else
CloseEvent();
// just to be on the secure side ;)
} else
CloseEvent();
}
}
@ -288,12 +311,6 @@ PPPStateMachine::TLFNotify()
{
LockerHelper locker(fLock);
if(Phase() == PPP_ESTABLISHMENT_PHASE) {
// we may not go down because an OpenEvent indicates that the
// user wants to connect
return false;
}
// from now on no packets may be sent to the device
NewPhase(PPP_DOWN_PHASE);
@ -357,7 +374,7 @@ PPPStateMachine::UpEvent()
return;
}
// TODO: handle server-up!
// TODO: handle server-up! (maybe already done correctly)
NewState(PPP_REQ_SENT_STATE);
InitializeRestartCount();
locker.UnlockNow();
@ -418,10 +435,11 @@ PPPStateMachine::DownEvent()
IllegalEvent(PPP_DOWN_EVENT);
}
// TODO:
// DownProtocols();
// DownEncapsulators();
// ResetOptionHandlers();
DownProtocols();
DownEncapsulators();
fAuthenticationStatus = PPP_NOT_AUTHENTICATED;
fPeerAuthenticationStatus = PPP_NOT_AUTHENTICATED;
NewPhase(PPP_DOWN_PHASE);
@ -451,8 +469,6 @@ PPPStateMachine::DownEvent()
NewState(PPP_INITIAL_STATE);
if(Interface()->DoesAutoRedial()) {
// TODO:
// if we are reconfiguring we should redial, too
if(needsRedial)
Interface()->Redial();
} else if(!Interface()->DoesDialOnDemand())
@ -487,9 +503,9 @@ PPPStateMachine::OpenEvent()
if(Interface()->IsMultilink() && !Interface()->Parent()) {
NewPhase(PPP_ESTABLISHMENT_PHASE);
for(int32 i = 0; i < Interface()->CountChildren(); i++)
if(Interface()->ChildAt(i)->Mode() == Interface()->Mode())
Interface()->ChildAt(i)->StateMachine().OpenEvent();
for(int32 index = 0; index < Interface()->CountChildren(); index++)
if(Interface()->ChildAt(index)->Mode() == Interface()->Mode())
Interface()->ChildAt(index)->StateMachine().OpenEvent();
} else {
locker.UnlockNow();
ThisLayerStarted();
@ -528,8 +544,8 @@ PPPStateMachine::CloseEvent()
ThisLayerDown();
for(int32 i = 0; i < Interface()->CountChildren(); i++)
Interface()->ChildAt(i)->StateMachine().CloseEvent();
for(int32 index = 0; index < Interface()->CountChildren(); index++)
Interface()->ChildAt(index)->StateMachine().CloseEvent();
return;
}
@ -673,7 +689,7 @@ PPPStateMachine::RCRGoodEvent(mbuf *packet)
// tld,scr,sca/8
NewState(PPP_ACK_SENT_STATE);
NewPhase(PPP_ESTABLISHMENT_PHASE);
// tell handlers that we are reconfiguring
// indicates to handlers that we are reconfiguring
locker.UnlockNow();
ThisLayerDown();
SendConfigureRequest();
@ -708,7 +724,7 @@ PPPStateMachine::RCRBadEvent(mbuf *nak, mbuf *reject)
case PPP_OPENED_STATE:
NewState(PPP_REQ_SENT_STATE);
NewPhase(PPP_ESTABLISHMENT_PHASE);
// tell handlers that we are reconfiguring
// indicates to handlers that we are reconfiguring
locker.UnlockNow();
ThisLayerDown();
SendConfigureRequest();
@ -747,8 +763,8 @@ PPPStateMachine::RCAEvent(mbuf *packet)
PPPOptionHandler *handler;
PPPConfigurePacket ack(packet);
for(int32 i = 0; i < LCP().CountOptionHandlers(); i++) {
handler = LCP().OptionHandlerAt(i);
for(int32 index = 0; index < LCP().CountOptionHandlers(); index++) {
handler = LCP().OptionHandlerAt(index);
handler->ParseAck(ack);
}
@ -785,7 +801,7 @@ PPPStateMachine::RCAEvent(mbuf *packet)
case PPP_OPENED_STATE:
NewState(PPP_REQ_SENT_STATE);
NewPhase(PPP_ESTABLISHMENT_PHASE);
// tell handlers that we are reconfiguring
// indicates to handlers that we are reconfiguring
locker.UnlockNow();
ThisLayerDown();
SendConfigureRequest();
@ -811,8 +827,8 @@ PPPStateMachine::RCNEvent(mbuf *packet)
PPPOptionHandler *handler;
PPPConfigurePacket nak_reject(packet);
for(int32 i = 0; i < LCP().CountOptionHandlers(); i++) {
handler = LCP().OptionHandlerAt(i);
for(int32 index = 0; index < LCP().CountOptionHandlers(); index++) {
handler = LCP().OptionHandlerAt(index);
if(nak_reject.Code() == PPP_CONFIGURE_NAK)
handler->ParseNak(nak_reject);
@ -846,7 +862,7 @@ PPPStateMachine::RCNEvent(mbuf *packet)
case PPP_OPENED_STATE:
NewState(PPP_REQ_SENT_STATE);
NewPhase(PPP_ESTABLISHMENT_PHASE);
// tell handlers that we are reconfiguring
// indicates to handlers that we are reconfiguring
locker.UnlockNow();
ThisLayerDown();
SendConfigureRequest();
@ -865,6 +881,9 @@ PPPStateMachine::RTREvent(mbuf *packet)
if(fID == mtod(packet, lcp_packet*)->id)
fID -= 128;
fAuthenticationStatus = PPP_NOT_AUTHENTICATED;
fPeerAuthenticationStatus = PPP_NOT_AUTHENTICATED;
switch(State()) {
case PPP_INITIAL_STATE:
case PPP_STARTING_STATE:
@ -875,7 +894,7 @@ PPPStateMachine::RTREvent(mbuf *packet)
case PPP_ACK_SENT_STATE:
NewState(PPP_REQ_SENT_STATE);
NewPhase(PPP_TERMINATION_PHASE);
// tell handlers that we are terminating
// indicates to handlers that we are terminating
locker.UnlockNow();
SendTerminateAck(packet);
break;
@ -883,7 +902,7 @@ PPPStateMachine::RTREvent(mbuf *packet)
case PPP_OPENED_STATE:
NewState(PPP_STOPPING_STATE);
NewPhase(PPP_TERMINATION_PHASE);
// tell handlers that we are terminating
// indicates to handlers that we are terminating
ZeroRestartCount();
locker.UnlockNow();
ThisLayerDown();
@ -892,7 +911,7 @@ PPPStateMachine::RTREvent(mbuf *packet)
default:
NewPhase(PPP_TERMINATION_PHASE);
// tell handlers that we are terminating
// indicates to handlers that we are terminating
locker.UnlockNow();
SendTerminateAck(packet);
}
@ -1104,7 +1123,7 @@ PPPStateMachine::RCREvent(mbuf *packet)
for(int32 index = 0; index < LCP().CountOptionHandlers();
index++) {
handler = LCP().OptionHandlerAt(i);
handler = LCP().OptionHandlerAt(index);
error = handler->ParseRequest(&request, item, &nak, &reject);
if(error == PPP_UNHANLED)
continue;
@ -1216,11 +1235,9 @@ PPPStateMachine::ThisLayerUp()
void
PPPStateMachine::ThisLayerDown()
{
// TODO:
// DownProtocols();
// DownEncapsulators();
// PPPProtocol/Encapsulator::Down() should block if needed.
DownProtocols();
DownEncapsulators();
}
@ -1273,9 +1290,9 @@ PPPStateMachine::SendConfigureRequest()
request.SetID(NextID());
fConfigureID = request.ID();
for(int32 i = 0; i < LCP().CountOptionHandlers(); i++) {
for(int32 index = 0; index < LCP().CountOptionHandlers(); index++) {
// add all items
if(!LCP().OptionHandlerAt(i)->AddToRequest(&request)) {
if(!LCP().OptionHandlerAt(index)->AddToRequest(&request)) {
CloseEvent();
return;
}
@ -1293,8 +1310,8 @@ PPPStateMachine::SendConfigureAck(mbuf *packet)
mtod(packet, lcp_packet*)->code = PPP_CONFIGURE_ACK;
PPPConfigurePacket ack(packet);
for(int32 i = 0; i < LCP().CountOptionHandlers; i++)
LCP().OptionHandlerAt(i)->SendingAck(&ack);
for(int32 index = 0; index < LCP().CountOptionHandlers; index++)
LCP().OptionHandlerAt(index)->SendingAck(&ack);
LCP().Send(packet);
}
@ -1434,3 +1451,30 @@ PPPStateMachine::BringPhaseUp()
return count;
}
void
PPPStateMachine::DownProtocols()
{
for(int32 index = 0; index < Interface()->CountProtocols(); index++)
Interface()->ProtocolAt(index)->Down();
}
void
PPPStateMachine::DownEncapsulators()
{
PPPEncapsulator *encapsulator_handler = Interface()->FirstEncapsulator();
for(; encapsulator_handler;
encapsulator_handler = encapsulator_handler->Next())
encapsualtor_handler->Down();
}
void
PPPStateMachine::ResetOptionHandlers()
{
for(int32 index = 0; index < LCP().CountOptionHandlers(); index++)
LCP().OptionHandlerAt(index)->Reset();
}