1/*
2 * Test harness for WLAN functions.
3 *
4 * Copyright (C) 2015, Broadcom Corporation
5 * All Rights Reserved.
6 *
7 * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Broadcom Corporation;
8 * the contents of this file may not be disclosed to third parties, copied
9 * or duplicated in any form, in whole or in part, without the prior
10 * written permission of Broadcom Corporation.
11 *
12 * $Id:$
13 */
14
15#include <stdio.h>
16#include <stdlib.h>
17#include <string.h>
18#include <unistd.h>
19#include "trace.h"
20#include "test.h"
21#include "dsp.h"
22#include "wlu_api.h"
23#include "wlan.h"
24
25TEST_DECLARE();
26
27static void wlanEventCallback(void *context, uint32 eventType,
28	wl_event_msg_t *wlEvent, uint8 *data, uint32 length)
29{
30	TEST((int)context == 0x12345678, "invalid context");
31	if (eventType == WLC_E_ESCAN_RESULT) {
32		if (wlEvent->status == WLC_E_STATUS_SUCCESS) {
33			TRACE(TRACE_DEBUG,
34				"WLC_E_ESCAN_RESULT - WLC_E_STATUS_SUCCESS %d\n", length);
35		}
36		else if (wlEvent->status == WLC_E_STATUS_PARTIAL) {
37			wl_escan_result_t *escan_data = (wl_escan_result_t*)data;
38
39			TRACE(TRACE_DEBUG,
40				"WLC_E_ESCAN_RESULT - WLC_E_STATUS_PARTIAL\n");
41
42			if (length >= sizeof(*escan_data)) {
43				wl_bss_info_t *bi = &escan_data->bss_info[0];
44				dump_bss_info(bi);
45			}
46		}
47	}
48}
49
50/* --------------------------------------------------------------- */
51
52static void testIfName(void)
53{
54	wlanT *wlan;
55
56	wlan = wlanCreate();
57	TEST(wlan != 0, "wlanCreate failed");
58	TEST(strcmp(wlanIfName(wlan), "wlan0") == 0, "wlanIfName failed");
59	TEST(wlanDestroy(wlan), "wlanDestroy failed");
60}
61
62static void testEtherAddr(void)
63{
64	wlanT *wlan;
65	struct ether_addr addr;
66
67	wlan = wlanCreate();
68	TEST(wlan != 0, "wlanCreate failed");
69	TEST(wlanEtherAddr(wlan, &addr), "wlanEtherAddr failed");
70	TRACE_MAC_ADDR(TRACE_PRINTF, "ether addr", &addr);
71	TEST(wlanDestroy(wlan), "wlanDestroy failed");
72}
73
74static void testEventMsg(void)
75{
76	wlanT *wlan;
77
78	wlan = wlanCreate();
79	TEST(wlan != 0, "wlanCreate failed");
80	TEST(wlanDisableEventMsg(wlan, WLC_E_ACTION_FRAME_RX), "wlanEnableEventMsg failed");
81	TEST(wlanEnableEventMsg(wlan, WLC_E_ACTION_FRAME_RX), "wlanEnableEventMsg failed");
82	TEST(wlanDestroy(wlan), "wlanDestroy failed");
83}
84
85static void testVendorIe(void)
86{
87	wlanT *wlan;
88	uint8 ie[] = "\x50\x6F\x9A\x10\x01\x02\x03";
89
90	wlan = wlanCreate();
91	TEST(wlan != 0, "wlanCreate failed");
92	TEST(wlanAddVendorIe(wlan, VNDR_IE_PRBREQ_FLAG, sizeof(ie), ie),
93		"wlanAddVendorIe failed");
94	TEST(wlanDeleteVendorIe(wlan, VNDR_IE_PRBREQ_FLAG, sizeof(ie), ie),
95		"wlanDeleteVendorIe failed");
96	TEST(wlanDestroy(wlan), "wlanDestroy failed");
97}
98
99static void testEscan(void)
100{
101	wlanT *wlan;
102
103	wlan = wlanCreate();
104	TEST(wlan != 0, "wlanCreate failed");
105	TEST(wlanStartEscan(wlan, TRUE, -1, -1, -1), "wlanStartEscan failed");
106	sleep(1);
107	TEST(wlanStopScan(wlan), "wlanStopScan failed");
108	TEST(wlanDestroy(wlan), "wlanDestroy failed");
109}
110
111static void testBssTransitionQuery(void)
112{
113	wlanT *wlan;
114
115	wlan = wlanCreate();
116	TEST(wlan != 0, "wlanCreate failed");
117	TEST(wlanBssTransitionQuery(wlan), "wlanBssTransitionQuery failed");
118	TEST(wlanDestroy(wlan), "wlanDestroy failed");
119}
120
121static void testActionFrame(void)
122{
123	wlanT *wlan;
124	struct ether_addr da = {{0x00, 0x11, 0x11, 0x11, 0x11, 0x11}};
125	char data[256];
126	int i;
127
128	data[DOT11_ACTION_CAT_OFF] = DOT11_ACTION_CAT_PUBLIC;
129	data[DOT11_ACTION_ACT_OFF] = GAS_REQUEST_ACTION_FRAME;
130	for (i = DOT11_ACTION_ACT_OFF + 1; i < (int)sizeof(data); i++)
131		data[i] = i;
132
133	wlan = wlanCreate();
134	TEST(wlan != 0, "wlanCreate failed");
135	TEST(wlanActionFrame(wlan, (int)data, 1, 500, &da, &da, sizeof(data), (uint8 *)data),
136		"wlanActionFrame faile");
137	TEST(wlanDestroy(wlan), "wlanDestroy failed");
138}
139
140static void testAssociationStatus(void)
141{
142	wlanT *wlan;
143	int isAssociated;
144	char buffer[1024];
145
146	wlan = wlanCreate();
147	TEST(wlan != 0, "wlanCreate failed");
148	TEST(wlanAssociationStatus(wlan, &isAssociated, sizeof(buffer), (wl_bss_info_t *)buffer),
149		"wlanAssociationStatus failed");
150	if (isAssociated) {
151		dump_bss_info((wl_bss_info_t *)buffer);
152	}
153	else {
154		printf("not associated\n");
155	}
156	TEST(wlanDestroy(wlan), "wlanDestroy failed");
157}
158
159static void testWnm(void)
160{
161	wlanT *wlan;
162	int wMask, rMask;
163
164	wlan = wlanCreate();
165	TEST(wlan != 0, "wlanCreate failed");
166	for (wMask = 0; wMask < 0x10; wMask++) {
167		TEST(wlanWnm(wlan, wMask), "wlanWnm failed");
168		TEST(wlanWnmGet(wlan, &rMask), "wlanWnmGet failed");
169		TEST(wMask == rMask, "invalid data");
170	}
171	TEST(wlanDestroy(wlan), "wlanDestroy failed");
172}
173int main(int argc, char **argv)
174{
175	(void) argc;
176	(void) argv;
177
178	TRACE_LEVEL_SET(TRACE_ALL);
179	TEST_INITIALIZE();
180
181	wlanSubscribeEvent((void *)0x12345678, wlanEventCallback);
182	wlanInitialize();
183
184	testIfName();
185	testEtherAddr();
186	testEventMsg();
187	testVendorIe();
188	testEscan();
189	testBssTransitionQuery();
190	testActionFrame();
191	testAssociationStatus();
192	testWnm();
193
194	wlFree();
195	dspFree();
196
197	wlanDeinitialize();
198	wlanUnsubscribeEvent(wlanEventCallback);
199
200	TEST_FINALIZE();
201	return 0;
202}
203