1/*
2 * Test harness for encoding and decoding information elements.
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 "proto/802.11.h"
19#include "test.h"
20#include "trace.h"
21#include "bcm_encode_ie.h"
22#include "bcm_decode_ie.h"
23
24TEST_DECLARE();
25
26#define BUFFER_SIZE		256
27static uint8 buffer[BUFFER_SIZE];
28static bcm_encode_t enc;
29
30/* --------------------------------------------------------------- */
31
32static void testEncode(void)
33{
34	uint8 adBuffer[BUFFER_SIZE];
35	bcm_encode_t ad;
36
37	TEST(bcm_encode_init(&enc, sizeof(buffer), buffer), "bcm_encode_init failed");
38
39	TEST(bcm_encode_ie_hotspot_indication2(&enc, TRUE, HSPOT_RELEASE_2),
40		"bcm_encode_ie_hotspot_indication2 failed");
41
42	TEST(bcm_encode_ie_interworking(&enc,
43		IW_ANT_WILDCARD_NETWORK, FALSE, FALSE, FALSE, FALSE,
44		TRUE, 0, 0, (struct ether_addr *)"\xff\xff\xff\xff\xff\xff"),
45		"bcm_encode_ie_interworking failed");
46
47	TEST(bcm_encode_init(&ad, sizeof(adBuffer), adBuffer),
48		"bcm_encode_init failed");
49	TEST(bcm_encode_ie_advertisement_protocol_tuple(&ad,
50		ADVP_PAME_BI_DEPENDENT, 0xff, ADVP_ANQP_PROTOCOL_ID),
51		"bcm_encode_ie_advertisement_protocol_tuple failed");
52	TEST(bcm_encode_ie_advertisement_protocol_from_tuple(&enc,
53		bcm_encode_length(&ad),	bcm_encode_buf(&ad)),
54		"bcm_encode_ie_advertisement_protocol_from_tuple failed");
55
56	TEST(bcm_encode_ie_roaming_consortium(&enc, 0xff, 3, (uint8 *)"\x00\x11\x22",
57		4, (uint8 *)"\x55\x66\x77\x88", 4, (uint8 *)"\xaa\xbb\xcc\xdd"),
58		"bcm_encode_ie_roaming_consortium failed");
59
60	TEST(bcm_encode_ie_extended_capabilities(&enc, 0x80000000),
61		"bcm_encode_ie_extended_capabilities failed");
62
63	WL_PRPKT("encoded IEs",	bcm_encode_buf(&enc), bcm_encode_length(&enc));
64}
65
66static void testDecode(void)
67{
68	bcm_decode_t dec;
69	bcm_decode_ie_t ie;
70	bcm_decode_t dec1;
71	bcm_decode_hotspot_indication_t hotspot;
72	bcm_decode_interworking_t interworking;
73	bcm_decode_advertisement_protocol_t advertise;
74	bcm_decode_roaming_consortium_t roam;
75	uint32 cap;
76
77	TEST(bcm_decode_init(&dec, bcm_encode_length(&enc),
78		bcm_encode_buf(&enc)), "bcm_decode_init failed");
79	WL_PRPKT("decode packet", bcm_decode_buf(&dec), bcm_decode_buf_length(&dec));
80
81	TEST(bcm_decode_ie(&dec, &ie) == 5, "bcm_decode_ie failed");
82
83	TEST(bcm_decode_init(&dec1, ie.hotspotIndicationLength,
84		ie.hotspotIndication), "bcm_decode_init failed");
85	TEST(bcm_decode_ie_hotspot_indication2(&dec1, &hotspot),
86		"bcm_decode_ie_hotspot_indication2 failed");
87	TEST(hotspot.isDgafDisabled == TRUE, "invalid data");
88	TEST(hotspot.releaseNumber == HSPOT_RELEASE_2, "invalid data");
89
90	TEST(bcm_decode_init(&dec1, ie.interworkingLength,
91		ie.interworking), "bcm_decode_init failed");
92	TEST(bcm_decode_ie_interworking(&dec1, &interworking), "bcm_decode_ie_interworking failed");
93	TEST(interworking.accessNetworkType == IW_ANT_WILDCARD_NETWORK, "invalid data");
94	TEST(interworking.isInternet == FALSE, "invalid data");
95	TEST(interworking.isAsra == FALSE, "invalid data");
96	TEST(interworking.isEsr == FALSE, "invalid data");
97	TEST(interworking.isUesa == FALSE, "invalid data");
98	TEST(interworking.isVenue == TRUE, "invalid data");
99	TEST(interworking.venueGroup == 0, "invalid data");
100	TEST(interworking.venueType == 0, "invalid data");
101	TEST(interworking.isHessid == TRUE, "invalid data");
102	TEST(memcmp(&interworking.hessid, "\xff\xff\xff\xff\xff\xff",
103		sizeof(interworking.hessid)) == 0, "invalid data");
104
105	TEST(bcm_decode_init(&dec1, ie.advertisementProtocolLength,
106		ie.advertisementProtocol), "bcm_decode_init failed");
107	TEST(bcm_decode_ie_advertisement_protocol(&dec1, &advertise),
108		"bcm_decode_ie_advertisement_protocol failed");
109	TEST(advertise.count == 1, "invalid data");
110	TEST(advertise.protocol[0].queryResponseLimit == 0x7f, "invalid data");
111	TEST(advertise.protocol[0].isPamebi == FALSE, "invalid data");
112	TEST(advertise.protocol[0].protocolId == ADVP_ANQP_PROTOCOL_ID, "invalid data");
113
114	TEST(bcm_decode_init(&dec1, ie.roamingConsortiumLength,
115		ie.roamingConsortium), "bcm_decode_init failed");
116	TEST(bcm_decode_ie_roaming_consortium(&dec1, &roam),
117		"pktDecodeRoamingConsortium failed");
118	TEST(roam.anqpOiCount == 0xff, "invalid data");
119	TEST(roam.count == 3, "invalid data");
120	TEST(memcmp(roam.oi[0].data, "\x00\x11\x22", roam.oi[0].length) == 0,
121		"invalid data");
122	TEST(memcmp(roam.oi[1].data, "\x55\x66\x77\x88", roam.oi[1].length) == 0,
123		"invalid data");
124	TEST(memcmp(roam.oi[2].data, "\xaa\xbb\xcc\xdd", roam.oi[2].length) == 0,
125		"invalid data");
126
127	TEST(bcm_decode_init(&dec1, ie.extendedCapabilityLength,
128		ie.extendedCapability), "bcm_decode_init failed");
129	TEST(bcm_decode_ie_extended_capabilities(&dec1, &cap),
130		"bcm_decode_ie_extended_capabilities failed");
131	TEST(cap == 0x80000000, "invalid data");
132}
133
134static void testDecodeCorruptLength(void)
135{
136	bcm_decode_t dec;
137	bcm_decode_ie_t ie;
138	uint8 *lenPtr;
139	uint8 save;
140
141	TEST(bcm_decode_init(&dec, bcm_encode_length(&enc),
142		bcm_encode_buf(&enc)), "bcm_decode_init failed");
143	WL_PRPKT("decode packet", bcm_decode_buf(&dec), bcm_decode_buf_length(&dec));
144
145	lenPtr = &bcm_decode_buf(&dec)[1];
146	save = *lenPtr;
147	*lenPtr += 1;
148	TEST(bcm_decode_ie(&dec, &ie) == 1, "bcm_decode_ie failed");
149	*lenPtr = 0xff;
150	TEST(bcm_decode_ie(&dec, &ie) == 0, "bcm_decode_ie failed");
151	*lenPtr = save;
152}
153
154int main(int argc, char **argv)
155{
156	(void) argc;
157	(void) argv;
158
159	TRACE_LEVEL_SET(TRACE_ALL);
160	TEST_INITIALIZE();
161
162	testEncode();
163	testDecode();
164	testDecodeCorruptLength();
165
166	TEST_FINALIZE();
167	return 0;
168}
169