Commit 82058a0a authored by Jean Tourrilhes's avatar Jean Tourrilhes Committed by David S. Miller

[IRDA]: fix IrNET poll with empty disco log

poll would improperly exit when the discovery log
was empty
Signed-off-by: default avatarJean Tourrilhes <jt@hpl.hp.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 4e7612d0
...@@ -632,7 +632,7 @@ irda_irnet_destroy(irnet_socket * self) ...@@ -632,7 +632,7 @@ irda_irnet_destroy(irnet_socket * self)
self->iriap = NULL; self->iriap = NULL;
} }
/* Cleanup eventual discoveries from connection attempt */ /* Cleanup eventual discoveries from connection attempt or control channel */
if(self->discoveries != NULL) if(self->discoveries != NULL)
{ {
/* Cleanup our copy of the discovery log */ /* Cleanup our copy of the discovery log */
......
...@@ -171,18 +171,44 @@ irnet_ctrl_write(irnet_socket * ap, ...@@ -171,18 +171,44 @@ irnet_ctrl_write(irnet_socket * ap,
#ifdef INITIAL_DISCOVERY #ifdef INITIAL_DISCOVERY
/*------------------------------------------------------------------*/ /*------------------------------------------------------------------*/
/* /*
* Function irnet_read_discovery_log (self) * Function irnet_get_discovery_log (self)
*
* Query the content on the discovery log if not done
*
* This function query the current content of the discovery log
* at the startup of the event channel and save it in the internal struct.
*/
static void
irnet_get_discovery_log(irnet_socket * ap)
{
__u16 mask = irlmp_service_to_hint(S_LAN);
/* Ask IrLMP for the current discovery log */
ap->discoveries = irlmp_get_discoveries(&ap->disco_number, mask,
DISCOVERY_DEFAULT_SLOTS);
/* Check if the we got some results */
if(ap->discoveries == NULL)
ap->disco_number = -1;
DEBUG(CTRL_INFO, "Got the log (0x%p), size is %d\n",
ap->discoveries, ap->disco_number);
}
/*------------------------------------------------------------------*/
/*
* Function irnet_read_discovery_log (self, event)
* *
* Read the content on the discovery log * Read the content on the discovery log
* *
* This function dump the current content of the discovery log * This function dump the current content of the discovery log
* at the startup of the event channel. * at the startup of the event channel.
* Return 1 if written on the control channel... * Return 1 if wrote an event on the control channel...
* *
* State of the ap->disco_XXX variables : * State of the ap->disco_XXX variables :
* at socket creation : disco_index = 0 ; disco_number = 0 * Socket creation : discoveries = NULL ; disco_index = 0 ; disco_number = 0
* while reading : disco_index = X ; disco_number = Y * While reading : discoveries = ptr ; disco_index = X ; disco_number = Y
* After reading : disco_index = Y ; disco_number = -1 * After reading : discoveries = NULL ; disco_index = Y ; disco_number = -1
*/ */
static inline int static inline int
irnet_read_discovery_log(irnet_socket * ap, irnet_read_discovery_log(irnet_socket * ap,
...@@ -201,19 +227,8 @@ irnet_read_discovery_log(irnet_socket * ap, ...@@ -201,19 +227,8 @@ irnet_read_discovery_log(irnet_socket * ap,
} }
/* Test if it's the first time and therefore we need to get the log */ /* Test if it's the first time and therefore we need to get the log */
if(ap->disco_index == 0) if(ap->discoveries == NULL)
{ irnet_get_discovery_log(ap);
__u16 mask = irlmp_service_to_hint(S_LAN);
/* Ask IrLMP for the current discovery log */
ap->discoveries = irlmp_get_discoveries(&ap->disco_number, mask,
DISCOVERY_DEFAULT_SLOTS);
/* Check if the we got some results */
if(ap->discoveries == NULL)
ap->disco_number = -1;
DEBUG(CTRL_INFO, "Got the log (0x%p), size is %d\n",
ap->discoveries, ap->disco_number);
}
/* Check if we have more item to dump */ /* Check if we have more item to dump */
if(ap->disco_index < ap->disco_number) if(ap->disco_index < ap->disco_number)
...@@ -417,7 +432,14 @@ irnet_ctrl_poll(irnet_socket * ap, ...@@ -417,7 +432,14 @@ irnet_ctrl_poll(irnet_socket * ap,
mask |= POLLIN | POLLRDNORM; mask |= POLLIN | POLLRDNORM;
#ifdef INITIAL_DISCOVERY #ifdef INITIAL_DISCOVERY
if(ap->disco_number != -1) if(ap->disco_number != -1)
mask |= POLLIN | POLLRDNORM; {
/* Test if it's the first time and therefore we need to get the log */
if(ap->discoveries == NULL)
irnet_get_discovery_log(ap);
/* Recheck */
if(ap->disco_number != -1)
mask |= POLLIN | POLLRDNORM;
}
#endif /* INITIAL_DISCOVERY */ #endif /* INITIAL_DISCOVERY */
DEXIT(CTRL_TRACE, " - mask=0x%X\n", mask); DEXIT(CTRL_TRACE, " - mask=0x%X\n", mask);
......
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