Lines Matching +full:send +full:- +full:empty
2 * UPnP WPS Device - Event processing
3 * Copyright (c) 2000-2003 Intel Corporation
4 * Copyright (c) 2006-2007 Sony Corporation
5 * Copyright (c) 2008-2009 Atheros Communications
6 * Copyright (c) 2009-2010, Jouni Malinen <j@w1.fi>
41 * Event information that we send to each subscriber is remembered in this
54 struct wpabuf *data; /* event data to send */
59 /* event_clean -- clean sockets etc. of event
64 if (e->s->current_event == e) in event_clean()
65 e->s->current_event = NULL; in event_clean()
66 http_client_free(e->http_event); in event_clean()
67 e->http_event = NULL; in event_clean()
71 /* event_delete -- delete single unqueued event
78 wpabuf_free(e->data); in event_delete()
83 /* event_dequeue -- get next event from the queue
84 * Returns NULL if empty.
89 e = dl_list_first(&s->event_queue, struct wps_event_, list); in event_dequeue()
93 dl_list_del(&e->list); in event_dequeue()
99 /* wps_upnp_event_delete_all -- delete entire event queue and current event */
105 if (s->current_event) { in wps_upnp_event_delete_all()
106 event_delete(s->current_event); in wps_upnp_event_delete_all()
107 /* will set: s->current_event = NULL; */ in wps_upnp_event_delete_all()
113 * event_retry - Called when we had a failure delivering event msg
119 struct subscription *s = e->s; in event_retry()
120 struct upnp_wps_device_sm *sm = s->sm; in event_retry()
125 /* will set: s->current_event = NULL; */ in event_retry()
128 e->retry++; in event_retry()
129 wpa_printf(MSG_DEBUG, "WPS UPnP: Try address %d", e->retry); in event_retry()
131 if (e->retry >= dl_list_len(&s->addr_list)) { in event_retry()
133 "for %s", e->addr->domain_and_port); in event_retry()
135 s->last_event_failed = 1; in event_retry()
136 if (!dl_list_empty(&s->event_queue)) in event_retry()
137 wps_upnp_event_send_all_later(s->sm); in event_retry()
140 dl_list_add(&s->event_queue, &e->list); in event_retry()
150 buf = wpabuf_alloc(1000 + os_strlen(e->addr->path) + in event_build_message()
151 wpabuf_len(e->data)); in event_build_message()
154 wpabuf_printf(buf, "NOTIFY %s HTTP/1.1\r\n", e->addr->path); in event_build_message()
156 wpabuf_printf(buf, "HOST: %s\r\n", e->addr->domain_and_port); in event_build_message()
157 wpabuf_put_str(buf, "CONTENT-TYPE: text/xml; charset=\"utf-8\"\r\n" in event_build_message()
162 uuid_bin2str(e->s->uuid, b, 80); in event_build_message()
165 wpabuf_printf(buf, "SEQ: %u\r\n", e->subscriber_sequence); in event_build_message()
166 wpabuf_printf(buf, "CONTENT-LENGTH: %d\r\n", in event_build_message()
167 (int) wpabuf_len(e->data)); in event_build_message()
168 wpabuf_put_str(buf, "\r\n"); /* terminating empty line */ in event_build_message()
169 wpabuf_put_buf(buf, e->data); in event_build_message()
176 struct subscription *s = e->s; in event_addr_failure()
178 e->addr->num_failures++; in event_addr_failure()
179 wpa_printf(MSG_DEBUG, "WPS UPnP: Failed to send event %p to %s " in event_addr_failure()
181 e, e->addr->domain_and_port, e->addr->num_failures); in event_addr_failure()
183 if (e->addr->num_failures < MAX_FAILURES) { in event_addr_failure()
194 "address %s due to errors", s, e->addr->domain_and_port); in event_addr_failure()
195 dl_list_del(&e->addr->list); in event_addr_failure()
196 subscr_addr_delete(e->addr); in event_addr_failure()
197 e->addr = NULL; in event_addr_failure()
199 if (dl_list_empty(&s->addr_list)) { in event_addr_failure()
203 dl_list_del(&s->list); in event_addr_failure()
217 struct subscription *s = e->s; in event_http_cb()
225 e, e->addr->domain_and_port); in event_http_cb()
226 e->addr->num_failures = 0; in event_http_cb()
227 s->last_event_failed = 0; in event_http_cb()
230 /* Schedule sending more if there is more to send */ in event_http_cb()
231 if (!dl_list_empty(&s->event_queue)) in event_http_cb()
232 wps_upnp_event_send_all_later(s->sm); in event_http_cb()
235 wpa_printf(MSG_DEBUG, "WPS UPnP: Event send failure"); in event_http_cb()
243 wpa_printf(MSG_DEBUG, "WPS UPnP: Event send timeout"); in event_http_cb()
250 /* event_send_start -- prepare to send a event message to subscriber
253 * -- The message is sent via TCP and we have to keep the stream open
255 * -- But we might have other event happen in the meantime...
258 * -- If multiple URLs are provided then we are supposed to try successive
260 * -- The URLs might use domain names instead of dotted decimal addresses,
262 * -- Doing the initial TCP connect can take a while, so we have to come
263 * back after connection and then send the data.
267 * Prerequisite: No current event send (s->current_event == NULL)
268 * and non-empty queue.
278 * nonempty event queue and ONLY with at least one address to send to. in event_send_start()
280 if (dl_list_empty(&s->addr_list) || in event_send_start()
281 s->current_event || in event_send_start()
282 dl_list_empty(&s->event_queue)) in event_send_start()
283 return -1; in event_send_start()
285 s->current_event = e = event_dequeue(s); in event_send_start()
289 dl_list_for_each(e->addr, &s->addr_list, struct subscr_addr, list) in event_send_start()
290 if (itry++ == e->retry) in event_send_start()
292 if (itry < e->retry) in event_send_start()
293 return -1; in event_send_start()
298 return -1; in event_send_start()
301 e->http_event = http_client_addr(&e->addr->saddr, buf, 0, in event_send_start()
303 if (e->http_event == NULL) { in event_send_start()
306 return -1; in event_send_start()
313 /* event_send_all_later_handler -- actually send events as needed */
320 sm->event_send_all_queued = 0; in event_send_all_later_handler()
321 dl_list_for_each_safe(s, tmp, &sm->subscriptions, struct subscription, in event_send_all_later_handler()
323 if (s->current_event == NULL /* not busy */ && in event_send_all_later_handler()
324 !dl_list_empty(&s->event_queue) /* more to do */) { in event_send_all_later_handler()
337 /* wps_upnp_event_send_all_later -- schedule sending events to all subscribers
340 * -- After getting a subscription, we should not send the first event
342 * -- Possible stack depth or infinite recursion issues.
350 if (sm->event_send_all_queued) in wps_upnp_event_send_all_later()
352 sm->event_send_all_queued = 1; in wps_upnp_event_send_all_later()
358 /* wps_upnp_event_send_stop_all -- cleanup */
361 if (sm->event_send_all_queued) in wps_upnp_event_send_stop_all()
363 sm->event_send_all_queued = 0; in wps_upnp_event_send_stop_all()
368 * wps_upnp_event_add - Add a new event to a queue
372 * Returns: 0 on success, -1 on error, 1 on max event queue limit reached
380 len = dl_list_len(&s->event_queue); in wps_upnp_event_add()
394 if (s->last_event_failed && probereq && len > 0) { in wps_upnp_event_add()
402 return -1; in wps_upnp_event_add()
407 return -1; in wps_upnp_event_add()
408 dl_list_init(&e->list); in wps_upnp_event_add()
409 e->s = s; in wps_upnp_event_add()
410 e->data = wpabuf_dup(data); in wps_upnp_event_add()
411 if (e->data == NULL) { in wps_upnp_event_add()
413 return -1; in wps_upnp_event_add()
415 e->subscriber_sequence = s->next_subscriber_sequence++; in wps_upnp_event_add()
416 if (s->next_subscriber_sequence == 0) in wps_upnp_event_add()
417 s->next_subscriber_sequence++; in wps_upnp_event_add()
420 dl_list_add_tail(&s->event_queue, &e->list); in wps_upnp_event_add()
421 wps_upnp_event_send_all_later(s->sm); in wps_upnp_event_add()