in wireless/ieee802154/i8sak/i8sak_events.c [58:196]
static pthread_addr_t i8sak_eventthread(pthread_addr_t arg)
{
FAR struct i8sak_s *i8sak = (FAR struct i8sak_s *)arg;
union ieee802154_macarg_u macarg;
#ifdef CONFIG_NET_6LOWPAN
struct ieee802154_netmac_s netarg;
#endif
FAR struct i8sak_eventreceiver_s *receiver;
FAR struct ieee802154_primitive_s *primitive = NULL;
int ret = OK;
if (i8sak->mode == I8SAK_MODE_CHAR)
{
macarg.enable = true;
ioctl(i8sak->fd, MAC802154IOC_ENABLE_EVENTS,
(unsigned long)((uintptr_t)&macarg));
}
#ifdef CONFIG_NET_6LOWPAN
else if (i8sak->mode == I8SAK_MODE_NETIF)
{
netarg.u.enable = true;
strlcpy(netarg.ifr_name, i8sak->ifname, IFNAMSIZ);
ioctl(i8sak->fd, MAC802154IOC_ENABLE_EVENTS,
(unsigned long)((uintptr_t)&netarg));
}
#endif
while (i8sak->eventlistener_run)
{
if (i8sak->mode == I8SAK_MODE_CHAR)
{
ret = ioctl(i8sak->fd, MAC802154IOC_GET_EVENT,
(unsigned long)((uintptr_t)&macarg));
primitive = &macarg.primitive;
}
#ifdef CONFIG_NET_6LOWPAN
else if (i8sak->mode == I8SAK_MODE_NETIF)
{
ret = ioctl(i8sak->fd, MAC802154IOC_GET_EVENT,
(unsigned long)((uintptr_t)&netarg));
primitive = &netarg.u.primitive;
}
#endif
if (ret != OK)
{
i8sak->eventlistener_run = false;
continue;
}
ret = sem_wait(&i8sak->eventsem);
if (ret != OK)
{
i8sak->eventlistener_run = false;
continue;
}
/* Loop through event receivers and call callbacks for those receivers
* listening for this event type.
*/
receiver = (FAR struct i8sak_eventreceiver_s *)sq_peek(
&i8sak->eventreceivers);
while (receiver != NULL)
{
if ((primitive->type == IEEE802154_PRIMITIVE_CONF_DATA &&
receiver->filter.confevents.data) ||
(primitive->type == IEEE802154_PRIMITIVE_CONF_ASSOC &&
receiver->filter.confevents.assoc) ||
(primitive->type == IEEE802154_PRIMITIVE_CONF_DISASSOC &&
receiver->filter.confevents.disassoc) ||
(primitive->type == IEEE802154_PRIMITIVE_CONF_GTS &&
receiver->filter.confevents.gts) ||
(primitive->type == IEEE802154_PRIMITIVE_CONF_RESET &&
receiver->filter.confevents.reset) ||
(primitive->type == IEEE802154_PRIMITIVE_CONF_RXENABLE &&
receiver->filter.confevents.rxenable) ||
(primitive->type == IEEE802154_PRIMITIVE_CONF_SCAN &&
receiver->filter.confevents.scan) ||
(primitive->type == IEEE802154_PRIMITIVE_CONF_START &&
receiver->filter.confevents.start) ||
(primitive->type == IEEE802154_PRIMITIVE_CONF_POLL &&
receiver->filter.confevents.poll) ||
(primitive->type == IEEE802154_PRIMITIVE_IND_ASSOC &&
receiver->filter.indevents.assoc) ||
(primitive->type == IEEE802154_PRIMITIVE_IND_DISASSOC &&
receiver->filter.indevents.disassoc) ||
(primitive->type == IEEE802154_PRIMITIVE_IND_BEACONNOTIFY &&
receiver->filter.indevents.beacon) ||
(primitive->type == IEEE802154_PRIMITIVE_IND_GTS &&
receiver->filter.indevents.gts) ||
(primitive->type == IEEE802154_PRIMITIVE_IND_ORPHAN &&
receiver->filter.indevents.orphan) ||
(primitive->type == IEEE802154_PRIMITIVE_IND_COMMSTATUS &&
receiver->filter.indevents.commstatus) ||
(primitive->type == IEEE802154_PRIMITIVE_IND_SYNCLOSS &&
receiver->filter.indevents.syncloss))
{
receiver->cb(primitive, receiver->arg);
if (receiver->oneshot)
{
/* Unlink the receiver from the list */
sq_rem((FAR sq_entry_t *)receiver, &i8sak->eventreceivers);
/* Link the receiver back into the free list */
sq_addlast((FAR sq_entry_t *)receiver,
&i8sak->eventreceivers_free);
}
}
receiver = (FAR struct i8sak_eventreceiver_s *)sq_next(
(FAR sq_entry_t *)receiver);
}
sem_post(&i8sak->eventsem);
}
if (i8sak->mode == I8SAK_MODE_CHAR)
{
macarg.enable = false;
ioctl(i8sak->fd, MAC802154IOC_ENABLE_EVENTS,
(unsigned long)((uintptr_t)&macarg));
}
#ifdef CONFIG_NET_6LOWPAN
else if (i8sak->mode == I8SAK_MODE_NETIF)
{
netarg.u.enable = false;
strlcpy(netarg.ifr_name, i8sak->ifname, IFNAMSIZ);
ioctl(i8sak->fd, MAC802154IOC_ENABLE_EVENTS,
(unsigned long)((uintptr_t)&netarg));
}
#endif
return NULL;
}