Commit 0a082824 authored by Jean Tourrilhes's avatar Jean Tourrilhes Committed by Linus Torvalds

IrDA: Correct fix for IrNET disconnect indication :

if socket is not connected, don't hangup, to allow passive operation
parent 521be5f2
...@@ -211,6 +211,12 @@ ...@@ -211,6 +211,12 @@
* o When receiving a disconnect indication, don't reenable the * o When receiving a disconnect indication, don't reenable the
* PPP Tx queue, this will trigger a reconnect. Instead, close * PPP Tx queue, this will trigger a reconnect. Instead, close
* the channel, which will kill pppd... * the channel, which will kill pppd...
*
* v11 - 20.3.02 - Jean II
* o Oops ! v10 fix disabled IrNET retries and passive behaviour.
* Better fix in irnet_disconnect_indication() :
* - if connected, kill pppd via hangup.
* - if not connected, reenable ppp Tx, which trigger IrNET retry.
*/ */
/***************************** INCLUDES *****************************/ /***************************** INCLUDES *****************************/
......
...@@ -1070,7 +1070,7 @@ irnet_data_indication(void * instance, ...@@ -1070,7 +1070,7 @@ irnet_data_indication(void * instance,
* o attempted to connect, timeout * o attempted to connect, timeout
* o connected, link is broken, LAP has timeout * o connected, link is broken, LAP has timeout
* o connected, other side close the link * o connected, other side close the link
* o connection request on the server no handled * o connection request on the server not handled
*/ */
static void static void
irnet_disconnect_indication(void * instance, irnet_disconnect_indication(void * instance,
...@@ -1121,20 +1121,31 @@ irnet_disconnect_indication(void * instance, ...@@ -1121,20 +1121,31 @@ irnet_disconnect_indication(void * instance,
DEBUG(IRDA_CB_INFO, "Closing our TTP connection.\n"); DEBUG(IRDA_CB_INFO, "Closing our TTP connection.\n");
irttp_close_tsap(self->tsap); irttp_close_tsap(self->tsap);
self->tsap = NULL; self->tsap = NULL;
/* Cleanup & close the PPP channel, which will kill pppd and the rest */
if(self->ppp_open)
ppp_unregister_channel(&self->chan);
self->ppp_open = 0;
} }
/* Cleanup the socket in case we want to reconnect */ /* Cleanup the socket in case we want to reconnect in ppp_output_wakeup() */
self->stsap_sel = 0; self->stsap_sel = 0;
self->daddr = DEV_ADDR_ANY; self->daddr = DEV_ADDR_ANY;
self->tx_flow = FLOW_START; self->tx_flow = FLOW_START;
/* Note : what should we say to ppp ? /* Deal with the ppp instance if it's still alive */
* It seem the ppp_generic and pppd are happy that way and will eventually if(self->ppp_open)
* timeout gracefully, so don't bother them... */ {
if(test_open)
{
/* If we were connected, cleanup & close the PPP channel,
* which will kill pppd (hangup) and the rest */
ppp_unregister_channel(&self->chan);
self->ppp_open = 0;
}
else
{
/* If we were trying to connect, flush (drain) ppp_generic
* Tx queue (most often we have blocked it), which will
* trigger an other attempt to connect. If we are passive,
* this will empty the Tx queue after last try. */
ppp_output_wakeup(&self->chan);
}
}
DEXIT(IRDA_TCB_TRACE, "\n"); DEXIT(IRDA_TCB_TRACE, "\n");
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment