1/*
2 * Copyright 2008, ASUSTek Inc.
3 * All Rights Reserved.
4 *
5 * THIS SOFTWARE IS OFFERED "AS IS", AND ASUS GRANTS NO WARRANTIES OF ANY
6 * KIND, EXPRESS OR IMPLIED, BY STATUTE, COMMUNICATION OR OTHERWISE. BROADCOM
7 * SPECIFICALLY DISCLAIMS ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS
8 * FOR A SPECIFIC PURPOSE OR NONINFRINGEMENT CONCERNING THIS SOFTWARE.
9 *
10 */
11#ifdef WLEVENT
12
13#include <stdio.h>
14#include <stdlib.h>
15#include <string.h>
16#include <unistd.h>
17#include <shutils.h>
18#include <rc.h>
19#include <wlioctl.h>
20#include <syslog.h>
21
22#include <sys/socket.h>
23#include <errno.h>
24#include <sys/ioctl.h>
25#include <net/if.h>
26#include <linux/if_packet.h>
27#include <linux/if_ether.h>   /* The L2 protocols */
28#include <bcmnvram.h>
29
30#define BRIF "br0"
31char tmpstr[32];
32char APMAC[18];
33
34char *getStatusStr(int status)
35{
36	switch(status){
37		case 0:
38			return "successful";
39		case 1:
40			return "failed";
41		case 2:
42			return "timed out";
43		case 3:
44			return "no matching network found";
45		case 4:
46			return "aborted";
47		case 5:
48			return "packet not ack'd";
49		case 6:
50			return "AUTH or ASSOC packet was unsolicited";
51		case 7:
52			return "attempt to assoc to an auto auth configuration";
53		default:
54			memset(tmpstr, 0, 32);
55			sprintf(tmpstr, "Unknown(%x)", status);
56
57			return tmpstr;
58	}
59}
60
61char *getRoamReasonStr(int reason)
62{
63	switch(reason){
64		case 0:
65			return "initial assoc";
66		case 1:
67			return "low RSSI";
68		case 2:
69			return "DEAUTH indication";
70		case 3:
71			return "DISASSOC indication";
72		case 4:
73			return "lost beacons";
74		case 5:
75			return "fast roam failure";
76		case 6:
77			return "request by AP";
78		case 7:
79			return "TSPEC rejection";
80		case 8:
81			return "better AP";
82		default:
83			memset(tmpstr, 0, 32);
84			sprintf(tmpstr, "Unknown(%x)", reason);
85
86			return tmpstr;
87	}
88}
89
90char *getPruneReasonStr(int reason)
91{
92	switch(reason){
93		case 1:
94			return "ecryption mismatch";
95		case 2:
96			return "AP uses a broadcast BSSID";
97		case 3:
98			return "STA's MAC addr is in AP's MAC deny list";
99		case 4:
100			return "STA's MAC addr is not in AP's MAC allow list";
101		case 5:
102			return "AP not allowed due to regulatory restriction";
103		case 6:
104			return "AP does not support STA locale spectrum mgmt";
105		case 7:
106			return "AP is on a radar channel of STA locale";
107		case 8:
108			return "STA does not support AP's RSN";
109		case 9:
110			return "No rates in common with AP";
111		case 10:
112			return "STA does not support all basic rates of BSS";
113		case 11:
114			return "CCX FAST ROAM: prune previous AP";
115		case 12:
116			return "BSS's cipher not supported";
117		case 13:
118			return "AP is already known to us as a STA";
119		case 14:
120			return "CCX FAST ROAM: prune unqualified AP";
121		case 15:
122			return "AP is already known to us as a WDS peer";
123		case 16:
124			return "QBSS LOAD - AAC is too low";
125		case 17:
126			return "prune home AP";
127		default:
128			memset(tmpstr, 0, 32);
129			sprintf(tmpstr, "Unknown(%x)", reason);
130
131			return tmpstr;
132	}
133}
134
135struct wpa_driver_broadcom_data {
136	void *ctx;
137	int ioctl_sock;
138	int event_sock;
139	char ifname[IFNAMSIZ + 1];
140};
141
142int
143wlevent()
144{
145	int s;
146	struct ifreq ifr;
147	struct sockaddr_ll ll;
148	struct wpa_driver_broadcom_data *drv;
149	struct wpa_supplicant *wpa_s;
150
151	fd_set rfds;
152	int res;
153	int left;
154	//int cc;
155	char wl_buf[8192];
156	bcm_event_t	*event;
157	bcmeth_hdr_t 	*hdr;
158	wl_event_msg_t 	*msg;
159	unsigned char *stamac_p;
160	char STAMAC[27];
161
162	eval("wl", "event_msgs", "0x0fffffffffffffffffffffffffffffff");
163
164	if ((s = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
165		fprintf(stderr, "socket failed!\n");
166		return -1;
167	}
168	else
169	{
170		fprintf(stderr, "socket ok!\n");
171	}
172
173	strncpy(ifr.ifr_name, BRIF, IFNAMSIZ);
174	if (ioctl(s, SIOCGIFINDEX, &ifr) < 0) {
175		fprintf(stderr, "ioctl to get the interface(%s) index failed!\n", ifr.ifr_name);
176		return -1;
177	}
178	else
179	{
180		fprintf(stderr, "ioctl to get the interface(%s) index ok!\n", ifr.ifr_name);
181	}
182
183	drv = (struct wpa_driver_broadcom_data *)malloc(sizeof(*drv));
184	if (drv == NULL)
185		return -1;
186
187	memset(APMAC, 0, sizeof(APMAC));
188	sprintf(APMAC, "%s", nvram_safe_get("il0macaddr"));
189	memset(drv, 0, sizeof(*drv));
190	memset(&wpa_s, 0, sizeof(wpa_s));
191	drv->ctx = &wpa_s;
192	strncpy(drv->ifname, BRIF, sizeof(drv->ifname));
193	drv->ioctl_sock = s;
194
195	s = socket(PF_PACKET, SOCK_RAW, ntohs(ETHER_TYPE_BRCM));
196
197	if (s < 0) {
198		fprintf(stderr, "socket(PF_PACKET, SOCK_RAW, ntohs(ETHER_TYPE_BRCM)) failed!\n");
199		close(drv->ioctl_sock);
200		free(drv);
201		return -1;
202	}
203	else
204	{
205		fprintf(stderr, "socket(PF_PACKET, SOCK_RAW, ntohs(ETHER_TYPE_BRCM)) ok!\n");
206	}
207
208	memset(&ll, 0, sizeof(ll));
209	ll.sll_family = AF_PACKET;
210	ll.sll_protocol = ntohs(ETHER_TYPE_BRCM);
211	ll.sll_ifindex = ifr.ifr_ifindex;
212	ll.sll_hatype = 0;
213	ll.sll_pkttype = PACKET_HOST;
214	ll.sll_halen = 0;
215
216	if (bind(s, (struct sockaddr *) &ll, sizeof(ll)) < 0) {
217		fprintf(stderr, "bind(netlink) failed!\n");
218		close(s);
219		close(drv->ioctl_sock);
220		free(drv);
221		return -1;
222	}
223	else
224	{
225		drv->event_sock = s;
226		fprintf(stderr, "bind(netlink) ok!\n");
227	}
228
229	while (1)
230	{
231		FD_ZERO(&rfds);
232		FD_SET(drv->event_sock, &rfds);
233
234		res = select(drv->event_sock + 1, &rfds, NULL, NULL, NULL);
235
236		if (res < 0 && errno != EINTR && errno != 0) {
237			fprintf(stderr, "select error\n");
238			goto out;
239		}
240
241		if (res <= 0)
242			continue;
243
244		if (FD_ISSET(drv->event_sock, &rfds)) {
245			left = recv(drv->event_sock, wl_buf, sizeof wl_buf, 0);
246
247			if ((drv->event_sock<0) || (left<0))
248			{
249				fprintf(stderr, "recv failed\n");
250			}
251			else
252			{
253				/* check if it is the even subtype */
254				event = (bcm_event_t *)wl_buf;
255				hdr = (bcmeth_hdr_t *)&(event->bcm_hdr);
256				//msg = (bcm_event_t *)&(event->event);
257				msg = (wl_event_msg_t *)&(event->event);
258				stamac_p = (unsigned char *)&(msg->addr);
259				sprintf(STAMAC, "%02X:%02X:%02X:%02X:%02X:%02X", stamac_p[0], stamac_p[1], stamac_p[2], stamac_p[3], stamac_p[4], stamac_p[5]);
260
261				switch(ntohl(msg->event_type))
262				{
263#if 0
264					case WLC_E_SET_SSID:		/* indicates status of set SSID */
265						fprintf(stderr, "BROADCOM: device %s, set SSID message, status: %s, reason: %s\n", STAMAC, getStatusStr(ntohl(msg->status)), getRoamReasonStr(ntohl(msg->reason)));
266						syslog(LOG_NOTICE, "BROADCOM: device %s, set SSID message, status: %s, reason: %s\n", STAMAC, getStatusStr(ntohl(msg->status)), getRoamReasonStr(ntohl(msg->reason)));
267						break;
268					case WLC_E_JOIN:		/* differentiates join IBSS from found (WLC_E_START) IBSS */
269						fprintf(stderr, "BROADCOM: device %s, join SSID message, status: %s, reason: %s\n", STAMAC, getStatusStr(ntohl(msg->status)), getRoamReasonStr(ntohl(msg->reason)));
270						syslog(LOG_NOTICE, "BROADCOM: device %s, join SSID message, status: %s, reason: %s\n", STAMAC, getStatusStr(ntohl(msg->status)), getRoamReasonStr(ntohl(msg->reason)));
271						break;
272					case WLC_E_START:		/* STA founded an IBSS or AP started a BSS */
273						fprintf(stderr, "BROADCOM: device %s, founded IBSS/BSS message, status: %s, reason: %s\n", STAMAC, getStatusStr(ntohl(msg->status)), getRoamReasonStr(ntohl(msg->reason)));
274						syslog(LOG_NOTICE, "BROADCOM: device %s, founded IBSS/BSS message, status: %s, reason: %s\n", STAMAC, getStatusStr(ntohl(msg->status)), getRoamReasonStr(ntohl(msg->reason)));
275						break;
276					case WLC_E_AUTH:		/* 802.11 AUTH request */
277						fprintf(stderr, "BROADCOM: device %s, AUTH request message, status: %s, reason: %s\n", STAMAC, getStatusStr(ntohl(msg->status)), getRoamReasonStr(ntohl(msg->reason)));
278						syslog(LOG_NOTICE, "BROADCOM: device %s, AUTH request message, status: %s, reason: %s\n", STAMAC, getStatusStr(ntohl(msg->status)), getRoamReasonStr(ntohl(msg->reason)));
279						break;
280					case WLC_E_AUTH_IND:		/* 802.11 AUTH indication */
281						fprintf(stderr, "BROADCOM: device %s, AUTH indication message, status: %s, reason: %s\n", STAMAC, getStatusStr(ntohl(msg->status)), getRoamReasonStr(ntohl(msg->reason)));
282						syslog(LOG_NOTICE, "BROADCOM: device %s, AUTH indication message, status: %s, reason: %s\n", STAMAC, getStatusStr(ntohl(msg->status)), getRoamReasonStr(ntohl(msg->reason)));
283						break;
284					case WLC_E_DEAUTH:		/* 802.11 DEAUTH request */
285						fprintf(stderr, "BROADCOM: device %s, DEAUTH request message, status: %s, reason: %s\n", STAMAC, getStatusStr(ntohl(msg->status)), getRoamReasonStr(ntohl(msg->reason)));
286						syslog(LOG_NOTICE, "BROADCOM: device %s, DEAUTH request message, status: %s, reason: %s\n", STAMAC, getStatusStr(ntohl(msg->status)), getRoamReasonStr(ntohl(msg->reason)));
287						break;
288					case WLC_E_DEAUTH_IND:		/* 802.11 DEAUTH indication */
289						fprintf(stderr, "BROADCOM: device %s, DEAUTH indication message, status: %s, reason: %s\n", STAMAC, getStatusStr(ntohl(msg->status)), getRoamReasonStr(ntohl(msg->reason)));
290						syslog(LOG_NOTICE, "BROADCOM: device %s, DEAUTH indication message, status: %s, reason: %s\n", STAMAC, getStatusStr(ntohl(msg->status)), getRoamReasonStr(ntohl(msg->reason)));
291						break;
292					case WLC_E_ASSOC:		/* 802.11 ASSOC request */
293						fprintf(stderr, "BROADCOM: device %s, ASSOC request message, status: %s, reason: %s\n", STAMAC, getStatusStr(ntohl(msg->status)), getRoamReasonStr(ntohl(msg->reason)));
294						syslog(LOG_NOTICE, "BROADCOM: device %s, ASSOC request message, status: %s, reason: %s\n", STAMAC, getStatusStr(ntohl(msg->status)), getRoamReasonStr(ntohl(msg->reason)));
295						break;
296					case WLC_E_ASSOC_IND:		/* 802.11 ASSOC indication */
297						fprintf(stderr, "BROADCOM: device %s, ASSOC indication message, status: %s, reason: %s\n", STAMAC, getStatusStr(ntohl(msg->status)), getRoamReasonStr(ntohl(msg->reason)));
298						syslog(LOG_NOTICE, "BROADCOM: device %s, ASSOC indication message, status: %s, reason: %s\n", STAMAC, getStatusStr(ntohl(msg->status)), getRoamReasonStr(ntohl(msg->reason)));
299						break;
300					case WLC_E_REASSOC:		/* 802.11 REASSOC request */
301						fprintf(stderr, "BROADCOM: device %s, REASSOC request message, status: %s, reason: %s\n", STAMAC, getStatusStr(ntohl(msg->status)), getRoamReasonStr(ntohl(msg->reason)));
302						syslog(LOG_NOTICE, "BROADCOM: device %s, REASSOC request message, status: %s, reason: %s\n", STAMAC, getStatusStr(ntohl(msg->status)), getRoamReasonStr(ntohl(msg->reason)));
303						break;
304					case WLC_E_REASSOC_IND:		/* 802.11 REASSOC indication */
305						fprintf(stderr, "BROADCOM: device %s, REASSOC indication message, status: %s, reason: %s\n", STAMAC, getStatusStr(ntohl(msg->status)), getRoamReasonStr(ntohl(msg->reason)));
306						syslog(LOG_NOTICE, "BROADCOM: device %s, REASSOC indication message, status: %s, reason: %s\n", STAMAC, getStatusStr(ntohl(msg->status)), getRoamReasonStr(ntohl(msg->reason)));
307						break;
308					case WLC_E_DISASSOC:		/* 802.11 DISASSOC request */
309						fprintf(stderr, "BROADCOM: device %s, DISASSOC request message, status: %s, reason: %s\n", STAMAC, getStatusStr(ntohl(msg->status)), getRoamReasonStr(ntohl(msg->reason)));
310						syslog(LOG_NOTICE, "BROADCOM: device %s, DISASSOC request message, status: %s, reason: %s\n", STAMAC, getStatusStr(ntohl(msg->status)), getRoamReasonStr(ntohl(msg->reason)));
311						break;
312					case WLC_E_DISASSOC_IND:	/* 802.11 DISASSOC indication */
313						fprintf(stderr, "BROADCOM: device %s, DISASSOC indication message, status: %s, reason: %s\n", STAMAC, getStatusStr(ntohl(msg->status)), getRoamReasonStr(ntohl(msg->reason)));
314						syslog(LOG_NOTICE, "BROADCOM: device %s, DISASSOC indication message, status: %s, reason: %s\n", STAMAC, getStatusStr(ntohl(msg->status)), getRoamReasonStr(ntohl(msg->reason)));
315						break;
316					case WLC_E_QUIET_START:		/* 802.11h Quiet period started */
317						fprintf(stderr, "BROADCOM: device %s, Quiet period started message, status: %s, reason: %s\n", STAMAC, getStatusStr(ntohl(msg->status)), getRoamReasonStr(ntohl(msg->reason)));
318						syslog(LOG_NOTICE, "BROADCOM: device %s, Quiet period started message, status: %s, reason: %s\n", STAMAC, getStatusStr(ntohl(msg->status)), getRoamReasonStr(ntohl(msg->reason)));
319						break;
320					case WLC_E_QUIET_END:		/* 802.11h Quiet period ended */
321						fprintf(stderr, "BROADCOM: device %s, Quiet period ended message, status: %s, reason: %s\n", STAMAC, getStatusStr(ntohl(msg->status)), getRoamReasonStr(ntohl(msg->reason)));
322						syslog(LOG_NOTICE, "BROADCOM: device %s, Quiet period ended message, status: %s, reason: %s\n", STAMAC, getStatusStr(ntohl(msg->status)), getRoamReasonStr(ntohl(msg->reason)));
323						break;
324					case WLC_E_BEACON_RX:		/* internal use: IBSS mode: saw another STA's BEACONS */
325						fprintf(stderr, "BROADCOM: device %s, IBSS mode: saw another STA's BEACONS message, status: %s, reason: %s\n", STAMAC, getStatusStr(ntohl(msg->status)), getRoamReasonStr(ntohl(msg->reason)));
326						syslog(LOG_NOTICE, "BROADCOM: device %s, IBSS mode: saw another STA's BEACONS message, status: %s, reason: %s\n", STAMAC, getStatusStr(ntohl(msg->status)), getRoamReasonStr(ntohl(msg->reason)));
327						break;
328					case WLC_E_LINK:		/* generic link indication */
329						fprintf(stderr, "BROADCOM: device %s, generic link indication message, status: %s, reason: %s\n", STAMAC, getStatusStr(ntohl(msg->status)), getRoamReasonStr(ntohl(msg->reason)));
330						syslog(LOG_NOTICE, "BROADCOM: device %s, generic link indication message, status: %s, reason: %s\n", STAMAC, getStatusStr(ntohl(msg->status)), getRoamReasonStr(ntohl(msg->reason)));
331						break;
332					case WLC_E_MIC_ERROR:		/* TKIP MIC error occurred */
333						fprintf(stderr, "BROADCOM: device %s, TKIP MIC error occurred message, status: %s, reason: %s\n", STAMAC, getStatusStr(ntohl(msg->status)), getRoamReasonStr(ntohl(msg->reason)));
334						syslog(LOG_NOTICE, "BROADCOM: device %s, TKIP MIC error occurred message, status: %s, reason: %s\n", STAMAC, getStatusStr(ntohl(msg->status)), getRoamReasonStr(ntohl(msg->reason)));
335						break;
336					case WLC_E_NDIS_LINK:		/* NDIS style link indication */
337						fprintf(stderr, "BROADCOM: device %s, NDIS style link indication message, status: %s, reason: %s\n", STAMAC, getStatusStr(ntohl(msg->status)), getRoamReasonStr(ntohl(msg->reason)));
338						syslog(LOG_NOTICE, "BROADCOM: device %s, NDIS style link indication message, status: %s, reason: %s\n", STAMAC, getStatusStr(ntohl(msg->status)), getRoamReasonStr(ntohl(msg->reason)));
339						break;
340					case WLC_E_ROAM:		/* roam attempt occurred: indicate status & reason for roam */
341						fprintf(stderr, "BROADCOM: device %s, roam attempt occurred message, status: %s, reason: %s\n", STAMAC, getStatusStr(ntohl(msg->status)), getRoamReasonStr(ntohl(msg->reason)));
342						syslog(LOG_NOTICE, "BROADCOM: device %s, roam attempt occurred message, status: %s, reason: %s\n", STAMAC, getStatusStr(ntohl(msg->status)), getRoamReasonStr(ntohl(msg->reason)));
343						break;
344#endif
345					case WLC_E_TXFAIL:		/* change in dot11FailedCount (txfail) */
346						if(strncasecmp(APMAC, STAMAC, 17))
347						{
348							eval("wl", "deauthenticate", STAMAC);
349							fprintf(stderr, "deauthenticate device %s !!!\n", STAMAC);
350						}
351//						fprintf(stderr, "BROADCOM: device %s, change in dot11FailedCount message, status: %s, reason: %s\n", STAMAC, getStatusStr(ntohl(msg->status)), getRoamReasonStr(ntohl(msg->reason)));
352//						syslog(LOG_NOTICE, "BROADCOM: device %s, change in dot11FailedCount message, status: %s, reason: %s\n", STAMAC, getStatusStr(ntohl(msg->status)), getRoamReasonStr(ntohl(msg->reason)));
353						break;
354#if 0
355					case WLC_E_PMKID_CACHE:		/* WPA2 pmkid cache indication */
356						fprintf(stderr, "BROADCOM: device %s, WPA2 pmkid cache indication message, status: %s, reason: %s\n", STAMAC, getStatusStr(ntohl(msg->status)), getRoamReasonStr(ntohl(msg->reason)));
357						syslog(LOG_NOTICE, "BROADCOM: device %s, WPA2 pmkid cache indication message, status: %s, reason: %s\n", STAMAC, getStatusStr(ntohl(msg->status)), getRoamReasonStr(ntohl(msg->reason)));
358						break;
359					case WLC_E_RETROGRADE_TSF:	/* current AP's TSF value went backward */
360						fprintf(stderr, "BROADCOM: device %s, current AP's TSF value went backward message, status: %s, reason: %s\n", STAMAC, getStatusStr(ntohl(msg->status)), getRoamReasonStr(ntohl(msg->reason)));
361						syslog(LOG_NOTICE, "BROADCOM: device %s, current AP's TSF value went backward message, status: %s, reason: %s\n", STAMAC, getStatusStr(ntohl(msg->status)), getRoamReasonStr(ntohl(msg->reason)));
362						break;
363					case WLC_E_PRUNE:		/* AP was pruned from join list for reason */
364						fprintf(stderr, "BROADCOM: device %s, AP was pruned from join list for reason message, status: %s, reason: %s\n", STAMAC, getStatusStr(ntohl(msg->status)), getPruneReasonStr(ntohl(msg->reason)));
365						syslog(LOG_NOTICE, "BROADCOM: device %s, AP was pruned from join list for reason message, status: %s, reason: %s\n", STAMAC, getStatusStr(ntohl(msg->status)), getPruneReasonStr(ntohl(msg->reason)));
366						break;
367					case WLC_E_AUTOAUTH:		/* report AutoAuth table entry match for join attempt */
368						fprintf(stderr, "BROADCOM: device %s, report AutoAuth table entry match for join attempt message, status: %s, reason: %s\n", STAMAC, getStatusStr(ntohl(msg->status)), getRoamReasonStr(ntohl(msg->reason)));
369						syslog(LOG_NOTICE, "BROADCOM: device %s, report AutoAuth table entry match for join attempt message, status: %s, reason: %s\n", STAMAC, getStatusStr(ntohl(msg->status)), getRoamReasonStr(ntohl(msg->reason)));
370						break;
371					case WLC_E_EAPOL_MSG:		/* Event encapsulating an EAPOL message */
372						fprintf(stderr, "BROADCOM: device %s, Event encapsulating an EAPOL message, status: %s, reason: %s\n", STAMAC, getStatusStr(ntohl(msg->status)), getRoamReasonStr(ntohl(msg->reason)));
373						syslog(LOG_NOTICE, "BROADCOM: device %s, Event encapsulating an EAPOL message, status: %s, reason: %s\n", STAMAC, getStatusStr(ntohl(msg->status)), getRoamReasonStr(ntohl(msg->reason)));
374						break;
375					case WLC_E_SCAN_COMPLETE:	/* Scan results are ready or scan was aborted */
376						fprintf(stderr, "BROADCOM: device %s, Scan results are ready or scan was aborted, status: %s, reason: %s\n", STAMAC, getStatusStr(ntohl(msg->status)), getRoamReasonStr(ntohl(msg->reason)));
377						syslog(LOG_NOTICE, "BROADCOM: device %s, Scan results are ready or scan was aborted, status: %s, reason: %s\n", STAMAC, getStatusStr(ntohl(msg->status)), getRoamReasonStr(ntohl(msg->reason)));
378						break;
379					case WLC_E_ADDTS_IND:		/* indicate to host addts fail/success */
380						fprintf(stderr, "BROADCOM: device %s, indicate to host addts fail/success, status: %s, reason: %s\n", STAMAC, getStatusStr(ntohl(msg->status)), getRoamReasonStr(ntohl(msg->reason)));
381						syslog(LOG_NOTICE, "BROADCOM: device %s, indicate to host addts fail/success, status: %s, reason: %s\n", STAMAC, getStatusStr(ntohl(msg->status)), getRoamReasonStr(ntohl(msg->reason)));
382						break;
383					case WLC_E_DELTS_IND:		/* indicate to host delts fail/success */
384						fprintf(stderr, "BROADCOM: device %s, indicate to host delts fail/success, status: %s, reason: %s\n", STAMAC, getStatusStr(ntohl(msg->status)), getRoamReasonStr(ntohl(msg->reason)));
385						syslog(LOG_NOTICE, "BROADCOM: device %s, indicate to host delts fail/success, status: %s, reason: %s\n", STAMAC, getStatusStr(ntohl(msg->status)), getRoamReasonStr(ntohl(msg->reason)));
386						break;
387					case WLC_E_BCNSENT_IND:		/* indicate to host of beacon transmit */
388						fprintf(stderr, "BROADCOM: device %s, indicate to host of beacon transmit, status: %s, reason: %s\n", STAMAC, getStatusStr(ntohl(msg->status)), getRoamReasonStr(ntohl(msg->reason)));
389						syslog(LOG_NOTICE, "BROADCOM: device %s, indicate to host of beacon transmit, status: %s, reason: %s\n", STAMAC, getStatusStr(ntohl(msg->status)), getRoamReasonStr(ntohl(msg->reason)));
390						break;
391					case WLC_E_BCNRX_MSG:		/* Send the received beacon up to the host */
392						fprintf(stderr, "BROADCOM: device %s, Send the received beacon up to the host, status: %s, reason: %s\n", STAMAC, getStatusStr(ntohl(msg->status)), getRoamReasonStr(ntohl(msg->reason)));
393						syslog(LOG_NOTICE, "BROADCOM: device %s, Send the received beacon up to the host, status: %s, reason: %s\n", STAMAC, getStatusStr(ntohl(msg->status)), getRoamReasonStr(ntohl(msg->reason)));
394						break;
395					case WLC_E_LAST:		/* highest val + 1 for range checking */
396						fprintf(stderr, "BROADCOM: device %s, LAST message, status: %s, reason: %s\n", STAMAC, getStatusStr(ntohl(msg->status)), getRoamReasonStr(ntohl(msg->reason)));
397						syslog(LOG_NOTICE, "BROADCOM: device %s, LAST message, status: %s, reason: %s\n", STAMAC, getStatusStr(ntohl(msg->status)), getRoamReasonStr(ntohl(msg->reason)));
398						break;
399#endif
400					default:
401						//fprintf(stderr, "BROADCOM: device %s, UNKNOWN message (%x)\n", STAMAC, ntohl(msg->event_type));
402						//syslog(LOG_NOTICE, "BROADCOM: device %s, UNKNOWN message (%x)\n", STAMAC, ntohl(msg->event_type));
403						break;
404				}
405
406				/*fprintf(stderr, "\n");
407				for(cc=0;cc<left;cc++)
408				{
409					if(cc%16==0) fprintf(stderr, "\n");
410					fprintf(stderr, "%02x ", (unsigned char)wl_buf[cc]);
411				};
412				fprintf(stderr, "\n\n");//*/
413			}
414		}
415	}
416
417out:
418	return 0;
419}
420#endif
421