}
+static void upnp_wps_free_msearchreply(struct dl_list *head)
+{
+ struct advertisement_state_machine *a, *tmp;
+ dl_list_for_each_safe(a, tmp, head, struct advertisement_state_machine,
+ list)
+ msearchreply_state_machine_stop(a);
+}
+
+
static void upnp_wps_free_subscriptions(struct dl_list *head)
{
struct subscription *s, *tmp;
wpa_printf(MSG_DEBUG, "WPS UPnP: Stop device");
web_listener_stop(sm);
- while (sm->msearch_replies)
- msearchreply_state_machine_stop(sm->msearch_replies);
+ upnp_wps_free_msearchreply(&sm->msearch_replies);
upnp_wps_free_subscriptions(&sm->subscriptions);
advertisement_state_machine_stop(sm, 1);
sm->ctx = ctx;
sm->wps = wps;
sm->priv = priv;
+ dl_list_init(&sm->msearch_replies);
dl_list_init(&sm->subscriptions);
return sm;
#define MULTICAST_MAX_READ 1600 /* max bytes we'll read for UPD request */
-struct subscription;
struct upnp_wps_device_sm;
struct wps_registrar;
* separate packets and spread out in time to avoid congestion.
*/
struct advertisement_state_machine {
- /* double-linked list */
- struct advertisement_state_machine *next;
- struct advertisement_state_machine *prev;
+ struct dl_list list;
struct upnp_wps_device_sm *sm; /* parent */
enum advertisement_type_enum type;
int state;
int ssdp_sd_registered; /* nonzero if we must unregister */
unsigned advertise_count; /* how many advertisements done */
struct advertisement_state_machine advertisement;
- struct advertisement_state_machine *msearch_replies;
- int n_msearch_replies; /* no. of pending M-SEARCH replies */
+ struct dl_list msearch_replies;
int web_port; /* our port that others get xml files from */
struct http_server *web_srv;
/* Note: subscriptions are kept in expiry order */
*/
void msearchreply_state_machine_stop(struct advertisement_state_machine *a)
{
- struct upnp_wps_device_sm *sm = a->sm;
wpa_printf(MSG_DEBUG, "WPS UPnP: M-SEARCH stop");
- if (a->next == a) {
- sm->msearch_replies = NULL;
- } else {
- if (sm->msearch_replies == a)
- sm->msearch_replies = a->next;
- a->next->prev = a->prev;
- a->prev->next = a->next;
- }
+ dl_list_del(&a->list);
os_free(a);
- sm->n_msearch_replies--;
}
struct advertisement_state_machine *a;
int next_timeout_sec;
int next_timeout_msec;
+ int replies;
+ replies = dl_list_len(&sm->msearch_replies);
wpa_printf(MSG_DEBUG, "WPS UPnP: M-SEARCH reply start (%d "
- "outstanding)", sm->n_msearch_replies);
- if (sm->n_msearch_replies >= MAX_MSEARCH) {
+ "outstanding)", replies);
+ if (replies >= MAX_MSEARCH) {
wpa_printf(MSG_INFO, "WPS UPnP: Too many outstanding "
"M-SEARCH replies");
return;
goto fail;
}
/* Remember for future cleanup */
- if (sm->msearch_replies) {
- a->next = sm->msearch_replies;
- a->prev = a->next->prev;
- a->prev->next = a;
- a->next->prev = a;
- } else {
- sm->msearch_replies = a->next = a->prev = a;
- }
- sm->n_msearch_replies++;
+ dl_list_add(&sm->msearch_replies, &a->list);
return;
fail: