WPS UPnP: Throttle WLANEvent notifications to 5 per second

Do not send more than five Probe Request WLANEvent notifications
per second. Even though the limit should in theory apply to all
WLANEvents, it is better not to drop EAP notifications because
of Probe Request frames and really, the only real reason for
event bursts is Probe Request frames.
This commit is contained in:
Jouni Malinen 2010-10-17 21:24:12 +03:00
parent 3904567d0b
commit 08a98b6544
2 changed files with 30 additions and 0 deletions

View file

@ -209,6 +209,8 @@
#define MAX_SUBSCRIPTIONS 4 /* how many subscribing clients we handle */ #define MAX_SUBSCRIPTIONS 4 /* how many subscribing clients we handle */
#define MAX_ADDR_PER_SUBSCRIPTION 8 #define MAX_ADDR_PER_SUBSCRIPTION 8
/* Maximum number of Probe Request events per second */
#define MAX_EVENTS_PER_SEC 5
/* Write the current date/time per RFC */ /* Write the current date/time per RFC */
void format_date(struct wpabuf *buf) void format_date(struct wpabuf *buf)
@ -474,12 +476,38 @@ static void upnp_wps_device_send_event(struct upnp_wps_device_sm *sm)
"<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n"
"<e:propertyset xmlns:e=\"urn:schemas-upnp-org:event-1-0\">\n"; "<e:propertyset xmlns:e=\"urn:schemas-upnp-org:event-1-0\">\n";
const char *format_tail = "</e:propertyset>\n"; const char *format_tail = "</e:propertyset>\n";
struct os_time now;
if (dl_list_empty(&sm->subscriptions)) { if (dl_list_empty(&sm->subscriptions)) {
/* optimize */ /* optimize */
return; return;
} }
if (os_get_time(&now) == 0) {
if (now.sec != sm->last_event_sec) {
sm->last_event_sec = now.sec;
sm->num_events_in_sec = 1;
} else {
sm->num_events_in_sec++;
/*
* In theory, this should apply to all WLANEvent
* notifications, but EAP messages are of much higher
* priority and Probe Request notifications should not
* be allowed to drop EAP messages, so only throttle
* Probe Request notifications.
*/
if (sm->num_events_in_sec > MAX_EVENTS_PER_SEC &&
sm->wlanevent_type ==
UPNP_WPS_WLANEVENT_TYPE_PROBE) {
wpa_printf(MSG_DEBUG, "WPS UPnP: Throttle "
"event notifications (%u seen "
"during one second)",
sm->num_events_in_sec);
return;
}
}
}
/* Determine buffer size needed first */ /* Determine buffer size needed first */
buf_size += os_strlen(format_head); buf_size += os_strlen(format_head);
buf_size += 50 + 2 * os_strlen("WLANEvent"); buf_size += 50 + 2 * os_strlen("WLANEvent");

View file

@ -134,6 +134,8 @@ struct upnp_wps_device_sm {
char *wlanevent; /* the last WLANEvent data */ char *wlanevent; /* the last WLANEvent data */
enum upnp_wps_wlanevent_type wlanevent_type; enum upnp_wps_wlanevent_type wlanevent_type;
os_time_t last_event_sec;
unsigned int num_events_in_sec;
/* FIX: maintain separate structures for each UPnP peer */ /* FIX: maintain separate structures for each UPnP peer */
struct upnp_wps_peer peer; struct upnp_wps_peer peer;