WPS: Convert struct advertisement_state_machine to use struct dl_list

This commit is contained in:
Jouni Malinen 2009-12-19 14:46:52 +02:00
parent ea8f09acb2
commit 158aff0035
3 changed files with 19 additions and 29 deletions

View file

@ -907,6 +907,15 @@ fail:
} }
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) static void upnp_wps_free_subscriptions(struct dl_list *head)
{ {
struct subscription *s, *tmp; struct subscription *s, *tmp;
@ -928,8 +937,7 @@ void upnp_wps_device_stop(struct upnp_wps_device_sm *sm)
wpa_printf(MSG_DEBUG, "WPS UPnP: Stop device"); wpa_printf(MSG_DEBUG, "WPS UPnP: Stop device");
web_listener_stop(sm); web_listener_stop(sm);
while (sm->msearch_replies) upnp_wps_free_msearchreply(&sm->msearch_replies);
msearchreply_state_machine_stop(sm->msearch_replies);
upnp_wps_free_subscriptions(&sm->subscriptions); upnp_wps_free_subscriptions(&sm->subscriptions);
advertisement_state_machine_stop(sm, 1); advertisement_state_machine_stop(sm, 1);
@ -1058,6 +1066,7 @@ upnp_wps_device_init(struct upnp_wps_device_ctx *ctx, struct wps_context *wps,
sm->ctx = ctx; sm->ctx = ctx;
sm->wps = wps; sm->wps = wps;
sm->priv = priv; sm->priv = priv;
dl_list_init(&sm->msearch_replies);
dl_list_init(&sm->subscriptions); dl_list_init(&sm->subscriptions);
return sm; return sm;

View file

@ -31,7 +31,6 @@
#define MULTICAST_MAX_READ 1600 /* max bytes we'll read for UPD request */ #define MULTICAST_MAX_READ 1600 /* max bytes we'll read for UPD request */
struct subscription;
struct upnp_wps_device_sm; struct upnp_wps_device_sm;
struct wps_registrar; struct wps_registrar;
@ -50,9 +49,7 @@ enum advertisement_type_enum {
* separate packets and spread out in time to avoid congestion. * separate packets and spread out in time to avoid congestion.
*/ */
struct advertisement_state_machine { struct advertisement_state_machine {
/* double-linked list */ struct dl_list list;
struct advertisement_state_machine *next;
struct advertisement_state_machine *prev;
struct upnp_wps_device_sm *sm; /* parent */ struct upnp_wps_device_sm *sm; /* parent */
enum advertisement_type_enum type; enum advertisement_type_enum type;
int state; int state;
@ -127,8 +124,7 @@ struct upnp_wps_device_sm {
int ssdp_sd_registered; /* nonzero if we must unregister */ int ssdp_sd_registered; /* nonzero if we must unregister */
unsigned advertise_count; /* how many advertisements done */ unsigned advertise_count; /* how many advertisements done */
struct advertisement_state_machine advertisement; struct advertisement_state_machine advertisement;
struct advertisement_state_machine *msearch_replies; struct dl_list msearch_replies;
int n_msearch_replies; /* no. of pending M-SEARCH replies */
int web_port; /* our port that others get xml files from */ int web_port; /* our port that others get xml files from */
struct http_server *web_srv; struct http_server *web_srv;
/* Note: subscriptions are kept in expiry order */ /* Note: subscriptions are kept in expiry order */

View file

@ -385,18 +385,9 @@ static void msearchreply_state_machine_handler(void *eloop_data,
*/ */
void msearchreply_state_machine_stop(struct advertisement_state_machine *a) 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"); wpa_printf(MSG_DEBUG, "WPS UPnP: M-SEARCH stop");
if (a->next == a) { dl_list_del(&a->list);
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;
}
os_free(a); os_free(a);
sm->n_msearch_replies--;
} }
@ -476,10 +467,12 @@ static void msearchreply_state_machine_start(struct upnp_wps_device_sm *sm,
struct advertisement_state_machine *a; struct advertisement_state_machine *a;
int next_timeout_sec; int next_timeout_sec;
int next_timeout_msec; int next_timeout_msec;
int replies;
replies = dl_list_len(&sm->msearch_replies);
wpa_printf(MSG_DEBUG, "WPS UPnP: M-SEARCH reply start (%d " wpa_printf(MSG_DEBUG, "WPS UPnP: M-SEARCH reply start (%d "
"outstanding)", sm->n_msearch_replies); "outstanding)", replies);
if (sm->n_msearch_replies >= MAX_MSEARCH) { if (replies >= MAX_MSEARCH) {
wpa_printf(MSG_INFO, "WPS UPnP: Too many outstanding " wpa_printf(MSG_INFO, "WPS UPnP: Too many outstanding "
"M-SEARCH replies"); "M-SEARCH replies");
return; return;
@ -503,15 +496,7 @@ static void msearchreply_state_machine_start(struct upnp_wps_device_sm *sm,
goto fail; goto fail;
} }
/* Remember for future cleanup */ /* Remember for future cleanup */
if (sm->msearch_replies) { dl_list_add(&sm->msearch_replies, &a->list);
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++;
return; return;
fail: fail: