1 /*
2 	Copyright (C) 2007 Tim Seidel
3 	Copyright (C) 2008-2015 DeSmuME team
4 
5 	This file is free software: you can redistribute it and/or modify
6 	it under the terms of the GNU General Public License as published by
7 	the Free Software Foundation, either version 2 of the License, or
8 	(at your option) any later version.
9 
10 	This file is distributed in the hope that it will be useful,
11 	but WITHOUT ANY WARRANTY; without even the implied warranty of
12 	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13 	GNU General Public License for more details.
14 
15 	You should have received a copy of the GNU General Public License
16 	along with the this software.  If not, see <http://www.gnu.org/licenses/>.
17 */
18 
19 #ifndef WIFI_H
20 #define WIFI_H
21 
22 #include <stdio.h>
23 #include <queue>
24 #include "types.h"
25 
26 #ifdef EXPERIMENTAL_WIFI_COMM
27 	#ifdef HOST_WINDOWS
28 		#define WIN32_LEAN_AND_MEAN
29 	#endif
30 
31 	#include <pcap.h>
32 	#define HAVE_REMOTE
33 	#define WPCAP
34 	#define PACKET_SIZE 65535
35 	#define _INC_STDIO
36 #endif
37 
38 
39 #define		REG_WIFI_ID					0x000
40 #define     REG_WIFI_MODE       		0x004
41 #define     REG_WIFI_WEP        		0x006
42 #define		REG_WIFI_TXSTATCNT			0x008
43 #define		REG_WIFI_0A					0x00A
44 #define     REG_WIFI_IF     			0x010
45 #define     REG_WIFI_IE     			0x012
46 #define     REG_WIFI_MAC0       		0x018
47 #define     REG_WIFI_MAC1       		0x01A
48 #define     REG_WIFI_MAC2       		0x01C
49 #define     REG_WIFI_BSS0       		0x020
50 #define     REG_WIFI_BSS1       		0x022
51 #define     REG_WIFI_BSS2       		0x024
52 #define     REG_WIFI_AID_LOW       		0x028
53 #define     REG_WIFI_AID_HIGH      		0x02A
54 #define     REG_WIFI_RETRYLIMIT 		0x02C
55 // 02E - internal
56 #define		REG_WIFI_RXCNT				0x030
57 #define		REG_WIFI_WEPCNT				0x032
58 // 034 - internal
59 
60 #define		REG_WIFI_POWER_US			0x036
61 #define		REG_WIFI_POWER_TX			0x038
62 #define     REG_WIFI_POWERSTATE 		0x03C
63 #define     REG_WIFI_POWERFORCE    		0x040
64 #define     REG_WIFI_RANDOM     		0x044
65 #define		REG_WIFI_POWER_UNK			0x048
66 
67 #define     REG_WIFI_RXRANGEBEGIN       0x050
68 #define     REG_WIFI_RXRANGEEND         0x052
69 #define     REG_WIFI_RXHWWRITECSR       0x054
70 #define     REG_WIFI_WRITECSRLATCH      0x056
71 #define     REG_WIFI_CIRCBUFRADR        0x058
72 #define     REG_WIFI_RXREADCSR          0x05A
73 #define     REG_WIFI_RXBUF_COUNT		0x05C
74 #define     REG_WIFI_CIRCBUFREAD        0x060
75 #define     REG_WIFI_CIRCBUFRD_END      0x062
76 #define     REG_WIFI_CIRCBUFRD_SKIP     0x064
77 #define     REG_WIFI_CIRCBUFWADR        0x068
78 #define		REG_WIFI_TXBUFCOUNT			0x06C
79 #define     REG_WIFI_CIRCBUFWRITE       0x070
80 #define     REG_WIFI_CIRCBUFWR_END      0x074
81 #define     REG_WIFI_CIRCBUFWR_SKIP     0x076
82 
83 // 078 - internal
84 #define     REG_WIFI_TXBUF_BEACON       0x080
85 #define     REG_WIFI_LISTENCOUNT        0x088
86 #define     REG_WIFI_BEACONPERIOD       0x08C
87 #define     REG_WIFI_LISTENINT          0x08E
88 #define 	REG_WIFI_TXBUF_CMD			0x090
89 #define		REG_WIFI_TXBUF_REPLY1		0x094
90 #define		REG_WIFI_TXBUF_REPLY2		0x098
91 // 09C - internal
92 #define     REG_WIFI_TXBUF_LOC1         0x0A0
93 #define     REG_WIFI_TXBUF_LOC2         0x0A4
94 #define     REG_WIFI_TXBUF_LOC3         0x0A8
95 #define     REG_WIFI_TXREQ_RESET        0x0AC
96 #define     REG_WIFI_TXREQ_SET          0x0AE
97 #define		REG_WIFI_TXREQ_READ			0x0B0
98 #define		REG_WIFI_TXRESET			0x0B4
99 #define		REG_WIFI_TXBUSY				0x0B6
100 #define     REG_WIFI_TXSTAT             0x0B8
101 // 0BA - internal
102 #define		REG_WIFI_PREAMBLE			0x0BC
103 // 0C0 - ?
104 // 0C4 - ?
105 // 0C8 - internal
106 #define     REG_WIFI_RXFILTER           0x0D0
107 // 0D4 - config
108 // 0D8 - config
109 // 0DA - config
110 #define		REG_WIFI_RXFILTER2			0x0E0
111 
112 #define     REG_WIFI_USCOUNTERCNT       0x0E8
113 #define     REG_WIFI_USCOMPARECNT       0x0EA
114 // 0EC - config
115 #define		REG_WIFI_EXTRACOUNTCNT		0x0EE
116 #define     REG_WIFI_USCOMPARE0         0x0F0
117 #define     REG_WIFI_USCOMPARE1         0x0F2
118 #define     REG_WIFI_USCOMPARE2         0x0F4
119 #define     REG_WIFI_USCOMPARE3         0x0F6
120 #define     REG_WIFI_USCOUNTER0         0x0F8
121 #define     REG_WIFI_USCOUNTER1         0x0FA
122 #define     REG_WIFI_USCOUNTER2         0x0FC
123 #define     REG_WIFI_USCOUNTER3         0x0FE
124 // 100 - internal
125 // 102 - internal
126 // 104 - internal
127 // 106 - internal
128 #define		REG_WIFI_CONTENTFREE		0x10C
129 #define		REG_WIFI_PREBEACONCOUNT		0x110
130 #define		REG_WIFI_EXTRACOUNT			0x118
131 #define 	REG_WIFI_BEACONCOUNT1		0x11C
132 
133 // 120 to 132 - config/internal ports
134 #define 	REG_WIFI_BEACONCOUNT2		0x134
135 // 140 to 154 - config ports
136 
137 #define     REG_WIFI_BBCNT				0x158
138 #define     REG_WIFI_BBWRITE			0x15A
139 #define     REG_WIFI_BBREAD				0x15C
140 #define     REG_WIFI_BBBUSY				0x15E
141 #define		REG_WIFI_BBMODE				0x160
142 #define		REG_WIFI_BBPOWER			0x168
143 
144 // 16A to 178 - internal
145 
146 #define     REG_WIFI_RFDATA2  			0x17C
147 #define     REG_WIFI_RFDATA1  			0x17E
148 #define     REG_WIFI_RFBUSY				0x180
149 #define     REG_WIFI_RFCNT		  		0x184
150 
151 // 190 - internal
152 // 194 - ?
153 // 198 - internal
154 #define		REG_WIFI_RFPINS				0x19C
155 // 1A0 - internal
156 // 1A2 - internal
157 #define		REG_WIFI_MAYBE_RATE			0x1A4
158 
159 #define		REG_WIFI_RXSTAT_INC_IF		0x1A8
160 #define		REG_WIFI_RXSTAT_INC_IE		0x1AA
161 #define		REG_WIFI_RXSTAT_OVF_IF		0x1AC
162 #define		REG_WIFI_RXSTAT_OVF_IE		0x1AE
163 #define		REG_WIFI_TXERR_COUNT		0x1C0
164 #define		REG_WIFI_RX_COUNT			0x1C4
165 
166 // 1D0 to 1DE - related to multiplayer. argh.
167 
168 #define		REG_WIFI_RFSTATUS			0x214
169 #define		REG_WIFI_IF_SET				0x21C
170 #define 	REG_WIFI_TXSEQNO			0x210
171 #define		REG_WIFI_RXTXADDR			0x268
172 #define		REG_WIFI_POWERACK			0x2D0
173 
174 
175 #define		WIFI_IOREG(reg)				wifiMac.IOPorts[(reg) >> 1]
176 
177 /* WIFI misc constants */
178 #define		WIFI_CHIPID					0x1440		/* emulates "old" wifi chip, new is 0xC340 */
179 
180 /* Referenced as RF_ in dswifi: rffilter_t */
181 /* based on the documentation for the RF2958 chip of RF Micro Devices */
182 /* using the register names as in docs ( http://www.rfmd.com/pdfs/2958.pdf )*/
183 /* even tho every register only has 18 bits we are using u32 */
184 typedef struct rffilter_t
185 {
186 	union CFG1
187 	{
188 		struct
189 		{
190 /* 0*/		unsigned IF_VGA_REG_EN:1;
191 /* 1*/		unsigned IF_VCO_REG_EN:1;
192 /* 2*/		unsigned RF_VCO_REG_EN:1;
193 /* 3*/		unsigned HYBERNATE:1;
194 /* 4*/		unsigned :10;
195 /*14*/		unsigned REF_SEL:2;
196 /*16*/		unsigned :2;
197 		} bits;
198 		u32 val;
199 	} CFG1;
200 	union IFPLL1
201 	{
202 		struct
203 		{
204 /* 0*/		unsigned DAC:4;
205 /* 4*/		unsigned :5;
206 /* 9*/		unsigned P1:1;
207 /*10*/		unsigned LD_EN1:1;
208 /*11*/		unsigned AUTOCAL_EN1:1;
209 /*12*/		unsigned PDP1:1;
210 /*13*/		unsigned CPL1:1;
211 /*14*/		unsigned LPF1:1;
212 /*15*/		unsigned VTC_EN1:1;
213 /*16*/		unsigned KV_EN1:1;
214 /*17*/		unsigned PLL_EN1:1;
215 		} bits;
216 		u32 val;
217 	} IFPLL1;
218 	union IFPLL2
219 	{
220 		struct
221 		{
222 /* 0*/		unsigned IF_N:16;
223 /*16*/		unsigned :2;
224 		} bits;
225 		u32 val;
226 	} IFPLL2;
227 	union IFPLL3
228 	{
229 		struct
230 		{
231 /* 0*/		unsigned KV_DEF1:4;
232 /* 4*/		unsigned CT_DEF1:4;
233 /* 8*/		unsigned DN1:9;
234 /*17*/		unsigned :1;
235 		} bits;
236 		u32 val;
237 	} IFPLL3;
238 	union RFPLL1
239 	{
240 		struct
241 		{
242 /* 0*/      unsigned DAC:4;
243 /* 4*/      unsigned :5;
244 /* 9*/      unsigned P:1;
245 /*10*/      unsigned LD_EN:1;
246 /*11*/      unsigned AUTOCAL_EN:1;
247 /*12*/      unsigned PDP:1;
248 /*13*/      unsigned CPL:1;
249 /*14*/      unsigned LPF:1;
250 /*15*/      unsigned VTC_EN:1;
251 /*16*/      unsigned KV_EN:1;
252 /*17*/      unsigned PLL_EN:1;
253 		} bits;
254 		u32 val;
255 	} RFPLL1;
256 	union RFPLL2
257 	{
258 		struct
259 		{
260 /* 0*/      unsigned NUM2:6;
261 /* 6*/      unsigned N2:12;
262 		} bits;
263 		u32 val;
264 	} RFPLL2;
265 	union RFPLL3
266 	{
267 		struct
268 		{
269 /* 0*/		unsigned NUM2:18;
270 		} bits;
271 		u32 val;
272 	} RFPLL3;
273 	union RFPLL4
274 	{
275 		struct
276 		{
277 /* 0*/		unsigned KV_DEF:4;
278 /* 4*/      unsigned CT_DEF:4;
279 /* 8*/      unsigned DN:9;
280 /*17*/      unsigned :1;
281 		} bits;
282 		u32 val;
283 	} RFPLL4;
284 	union CAL1
285 	{
286 		struct
287 		{
288 /* 0*/      unsigned LD_WINDOW:3;
289 /* 3*/      unsigned M_CT_VALUE:5;
290 /* 8*/      unsigned TLOCK:5;
291 /*13*/      unsigned TVCO:5;
292 		} bits;
293 		u32 val;
294 	} CAL1;
295 	union TXRX1
296 	{
297 		struct
298 		{
299 /* 0*/      unsigned TXBYPASS:1;
300 /* 1*/      unsigned INTBIASEN:1;
301 /* 2*/      unsigned TXENMODE:1;
302 /* 3*/      unsigned TXDIFFMODE:1;
303 /* 4*/      unsigned TXLPFBW:3;
304 /* 7*/      unsigned RXLPFBW:3;
305 /*10*/      unsigned TXVGC:5;
306 /*15*/      unsigned PCONTROL:2;
307 /*17*/      unsigned RXDCFBBYPS:1;
308 		} bits;
309 		u32 val;
310 	} TXRX1;
311 	union PCNT1
312 	{
313 		struct
314 		{
315 /* 0*/      unsigned TX_DELAY:3;
316 /* 3*/      unsigned PC_OFFSET:6;
317 /* 9*/      unsigned P_DESIRED:6;
318 /*15*/      unsigned MID_BIAS:3;
319 		} bits;
320 		u32 val;
321 	} PCNT1;
322 	union PCNT2
323 	{
324 		struct
325 		{
326 /* 0*/      unsigned MIN_POWER:6;
327 /* 6*/      unsigned MID_POWER:6;
328 /*12*/      unsigned MAX_POWER:6;
329 		} bits;
330 		u32 val;
331 	} PCNT2;
332 	union VCOT1
333 	{
334 		struct
335 		{
336 /* 0*/      unsigned :16;
337 /*16*/      unsigned AUX1:1;
338 /*17*/      unsigned AUX:1;
339 		} bits;
340 		u32 val;
341 	} VCOT1;
342 } rffilter_t;
343 
344 /* baseband chip refered as BB_, dataformat is unknown yet */
345 /* it has at least 105 bytes of functional data */
346 typedef struct
347 {
348 	u8    data[105];
349 } bb_t;
350 
351 /* communication interface between RF,BB and the mac */
352 typedef union
353 {
354 	struct {
355 /* 0*/  unsigned wordsize:5;
356 /* 5*/  unsigned :2;
357 /* 7*/  unsigned readOperation:1;
358 /* 8*/  unsigned :8;
359 	} bits;
360 	u16 val;
361 } rfIOCnt_t;
362 
363 typedef union
364 {
365 	struct {
366 /* 0*/		unsigned busy:1;
367 /* 1*/      unsigned :15;
368 	} bits;
369 	u16 val;
370 } rfIOStat_t;
371 
372 typedef union
373 {
374 	struct {
375 /* 0*/  unsigned content:18;
376 /*18*/  unsigned address:5;
377 /*23*/  unsigned :9;
378 	} bits;
379 	struct {
380 /* 0*/  unsigned low:16;
381 /*16*/  unsigned high:16;
382 	} val16;
383 	u16 array16[2];
384 	u32 val;
385 } rfIOData_t;
386 
387 typedef union
388 {
389 	struct {
390 /* 0*/  unsigned address:7;
391 /* 7*/  unsigned :5;
392 /*12*/  unsigned mode:2;
393 /*14*/  unsigned enable:1;
394 /*15*/  unsigned :1;
395 	} bits;
396 	u16 val;
397 } bbIOCnt_t;
398 
399 #define WIFI_IRQ_RXEND					0
400 #define WIFI_IRQ_TXEND					1
401 #define WIFI_IRQ_RXINC					2
402 #define WIFI_IRQ_TXERROR	            3
403 #define WIFI_IRQ_RXOVF					4
404 #define WIFI_IRQ_TXERROVF				5
405 #define WIFI_IRQ_RXSTART				6
406 #define WIFI_IRQ_TXSTART				7
407 #define WIFI_IRQ_TXCOUNTEXP				8
408 #define WIFI_IRQ_RXCOUNTEXP				9
409 #define WIFI_IRQ_RFWAKEUP               11
410 #define WIFI_IRQ_UNK					12
411 #define WIFI_IRQ_TIMEPOSTBEACON			13
412 #define WIFI_IRQ_TIMEBEACON             14
413 #define WIFI_IRQ_TIMEPREBEACON          15
414 
415 struct Wifi_TXSlot
416 {
417 	u16 RegVal;
418 
419 	u16 CurAddr;
420 	int RemPreamble; // preamble time in �s
421 	int RemHWords;
422 	u32 TimeMask; // 3 = 2mbps, 7 = 1mbps
423 	bool NotStarted;
424 };
425 
426 #define WIFI_TXSLOT_LOC1		0
427 #define WIFI_TXSLOT_MPCMD		1
428 #define WIFI_TXSLOT_LOC2		2
429 #define WIFI_TXSLOT_LOC3		3
430 #define WIFI_TXSLOT_BEACON		4
431 #define WIFI_TXSLOT_MPREPLY		5
432 #define WIFI_TXSLOT_NUM			6
433 
434 struct Wifi_RXPacket
435 {
436 	u8* Data;
437 	int CurOffset;
438 	int RemHWords;
439 	bool NotStarted;
440 };
441 
442 typedef std::queue<Wifi_RXPacket> Wifi_RXPacketQueue;
443 
444 enum EAPStatus
445 {
446 	APStatus_Disconnected = 0,
447 	APStatus_Authenticated,
448 	APStatus_Associated
449 };
450 
451 /* wifimac_t: the buildin mac (arm7 addressrange: 0x04800000-0x04FFFFFF )*/
452 /* http://www.akkit.org/info/dswifi.htm#WifiIOMap */
453 
454 typedef struct
455 {
456 	/* power */
457 	BOOL powerOn;
458 	BOOL powerOnPending;
459 
460 	/* status */
461 	u16 rfStatus;
462 	u16 rfPins;
463 
464 	/* wifi interrupt handling */
465     u16   IE;
466     u16   IF;
467 
468 	/* modes */
469 	u16 macMode;
470 	u16 wepMode;
471 	BOOL WEP_enable;
472 
473 	/* sending */
474 	u16 TXStatCnt;
475 	u16 TXPower;
476 	u16 TXCnt;
477 	u16 TXStat;
478 	u16 TXSeqNo;
479 	Wifi_TXSlot TXSlots[WIFI_TXSLOT_NUM];
480 	int TXCurSlot;
481 	u16 TXBusy;
482 
483 	/* receiving */
484 	u16 RXCnt;
485 	u16 RXCheckCounter;
486 	u8 RXNum;
487 	Wifi_RXPacketQueue RXPacketQueue;
488 
489 	u16 RXStatIncIF, RXStatIncIE;
490 	u16 RXStatOvfIF, RXStatOvfIE;
491 	u8 RXStat[16];
492 	u16 RXTXAddr;
493 
494 	/* addressing/handshaking */
495 	union
496 	{
497 		//TODO - is this endian safe? don't think so
498 		u16  words[3];
499 		u8	 bytes[6];
500 	} mac;
501 	union
502 	{
503 		u16  words[3];
504 		u8	 bytes[6];
505 	} bss;
506 	u16 aid;
507 	u16 pid; /* player ID or aid_low */
508 	u16 retryLimit;
509 
510 	/* timing */
511 	u64 GlobalUsecTimer;
512 	BOOL crystalEnabled;
513 	u64 usec;
514 	BOOL usecEnable;
515 	u64 ucmp;
516 	BOOL ucmpEnable;
517 	u32 eCount;
518 	BOOL eCountEnable;
519 	u16 BeaconInterval;
520 	u16 BeaconCount1;
521 	u16 BeaconCount2;
522 	u16 ListenInterval;
523 	u16 ListenCount;
524 
525 	/* subchips */
526     rffilter_t 	RF;
527 	bb_t        BB;
528 
529 	/* subchip communications */
530     rfIOCnt_t   rfIOCnt;
531 	rfIOStat_t  rfIOStatus;
532 	rfIOData_t  rfIOData;
533     bbIOCnt_t   bbIOCnt;
534 
535 	/* buffers */
536 	u16         RAM[0x1000];
537 	u16         RXRangeBegin;
538 	u16         RXRangeEnd;
539 	u16			RXWriteCursor;
540 	u16         RXReadCursor;
541 	u16         RXUnits;
542 	u16			RXBufCount;
543 	u16         CircBufReadAddress;
544 	u16         CircBufWriteAddress;
545 	u16         CircBufRdEnd;
546 	u16         CircBufRdSkip;
547 	u16         CircBufWrEnd;
548 	u16         CircBufWrSkip;
549 
550 	/* I/O ports */
551 	u16			IOPorts[0x800];
552 
553 	/* others */
554 	u16			randomSeed;
555 
556 } wifimac_t;
557 
558 
559 typedef struct
560 {
561 	EAPStatus status;
562 	u16 seqNum;
563 
564 } SoftAP_t;
565 
566 // desmume host communication
567 #ifdef EXPERIMENTAL_WIFI_COMM
568 typedef struct pcap pcap_t;
569 extern pcap_t *wifi_bridge;
570 #endif
571 
572 extern wifimac_t wifiMac;
573 extern SoftAP_t SoftAP;
574 
575 bool WIFI_Init();
576 void WIFI_DeInit();
577 void WIFI_Reset();
578 
579 /* subchip communication IO functions */
580 void WIFI_setRF_CNT(u16 val);
581 void WIFI_setRF_DATA(u16 val, u8 part);
582 u16  WIFI_getRF_DATA(u8 part);
583 u16  WIFI_getRF_STATUS();
584 
585 void WIFI_setBB_CNT(u16 val);
586 u8   WIFI_getBB_DATA();
587 void WIFI_setBB_DATA(u8 val);
588 
589 /* wifimac io */
590 void WIFI_write16(u32 address, u16 val);
591 u16  WIFI_read16(u32 address);
592 
593 /* wifimac timing */
594 void WIFI_usTrigger();
595 
596 
597 /* DS WFC profile data documented here : */
598 /* http://dsdev.bigredpimp.com/2006/07/31/aoss-wfc-profile-data/ */
599 /* Note : we use bytes to avoid endianness issues */
600 typedef struct _FW_WFCProfile
601 {
602 	char SSID[32];
603 	char SSID_WEP64[32];
604 	char WEPKEY_PART1[16];
605 	char WEPKEY_PART2[16];
606 	char WEPKEY_PART3[16];
607 	char WEPKEY_PART4[16];
608 	u8 IP_ADDRESS[4];
609 	u8 GATEWAY[4];
610 	u8 PRIM_DNS[4];
611 	u8 SEC_DNS[4];
612 	u8 SUBNET_MASK;
613 	u8 WEP64_KEY_AOSS[20];
614 	u8 UNK1;
615 	u8 WEP_MODE;
616 	u8 STATUS;
617 	u8 UNK2[7];
618 	u8 UNK3;
619 	u8 UNK4[14];
620 	u8 CRC16[2];
621 
622 } FW_WFCProfile;
623 
624 class WifiHandler
625 {
626 public:
627 #ifdef EXPERIMENTAL_WIFI_COMM
WIFI_SocketsAvailable()628 	virtual bool WIFI_SocketsAvailable() { return true; }
WIFI_PCapAvailable()629 	virtual bool WIFI_PCapAvailable() { return false; }
WIFI_GetUniqueMAC(u8 * mac)630 	virtual void WIFI_GetUniqueMAC(u8* mac) {}
WIFI_WFCWarning()631 	virtual bool WIFI_WFCWarning() { return false; }
632 
PCAP_findalldevs(pcap_if_t ** alldevs,char * errbuf)633 	virtual int PCAP_findalldevs(pcap_if_t** alldevs, char* errbuf) { return -1; }
PCAP_freealldevs(pcap_if_t * alldevs)634 	virtual void PCAP_freealldevs(pcap_if_t* alldevs) {}
PCAP_open(const char * source,int snaplen,int flags,int readtimeout,char * errbuf)635 	virtual pcap_t* PCAP_open(const char* source, int snaplen, int flags, int readtimeout, char* errbuf) { return NULL; }
PCAP_close(pcap_t * dev)636 	virtual void PCAP_close(pcap_t* dev) {}
PCAP_setnonblock(pcap_t * dev,int nonblock,char * errbuf)637 	virtual int PCAP_setnonblock(pcap_t* dev, int nonblock, char* errbuf) { return -1; }
PCAP_sendpacket(pcap_t * dev,const u_char * data,int len)638 	virtual int PCAP_sendpacket(pcap_t* dev, const u_char* data, int len) { return -1; }
PCAP_dispatch(pcap_t * dev,int num,pcap_handler callback,u_char * userdata)639 	virtual int PCAP_dispatch(pcap_t* dev, int num, pcap_handler callback, u_char* userdata) { return -1; }
640 #endif
641 };
642 
643 #ifndef HOST_WINDOWS
644 class UnixWifiHandler : public WifiHandler
645 {
646 #ifdef EXPERIMENTAL_WIFI_COMM
WIFI_SocketsAvailable()647 	virtual bool WIFI_SocketsAvailable() { return true; }
WIFI_PCapAvailable()648 	virtual bool WIFI_PCapAvailable() { return true; }
WIFI_WFCWarning()649 	virtual bool WIFI_WFCWarning() { return false; }
650 
PCAP_findalldevs(pcap_if_t ** alldevs,char * errbuf)651 	virtual int PCAP_findalldevs(pcap_if_t** alldevs, char* errbuf) {
652 		return pcap_findalldevs(alldevs, errbuf); }
653 
PCAP_freealldevs(pcap_if_t * alldevs)654 	virtual void PCAP_freealldevs(pcap_if_t* alldevs) {
655 		pcap_freealldevs(alldevs); }
656 
PCAP_open(const char * source,int snaplen,int flags,int readtimeout,char * errbuf)657 	virtual pcap_t* PCAP_open(const char* source, int snaplen, int flags, int readtimeout, char* errbuf) {
658 		return pcap_open_live(source, snaplen, flags, readtimeout, errbuf); }
659 
PCAP_close(pcap_t * dev)660 	virtual void PCAP_close(pcap_t* dev) {
661 		pcap_close(dev); }
662 
PCAP_setnonblock(pcap_t * dev,int nonblock,char * errbuf)663 	virtual int PCAP_setnonblock(pcap_t* dev, int nonblock, char* errbuf) {
664 		return pcap_setnonblock(dev, nonblock, errbuf); }
665 
PCAP_sendpacket(pcap_t * dev,const u_char * data,int len)666 	virtual int PCAP_sendpacket(pcap_t* dev, const u_char* data, int len) {
667 		return pcap_sendpacket(dev, data, len); }
668 
PCAP_dispatch(pcap_t * dev,int num,pcap_handler callback,u_char * userdata)669 	virtual int PCAP_dispatch(pcap_t* dev, int num, pcap_handler callback, u_char* userdata) {
670 		return pcap_dispatch(dev, num, callback, userdata); }
671 #endif
672 };
673 #endif
674 
675 /* wifi data to be stored in firmware, when no firmware image was loaded */
676 extern u8 FW_Mac[6];
677 extern const u8 FW_WIFIInit[32];
678 extern const u8 FW_BBInit[105];
679 extern const u8 FW_RFInit[36];
680 extern const u8 FW_RFChannel[6*14];
681 extern const u8 FW_BBChannel[14];
682 extern FW_WFCProfile FW_WFCProfile1;
683 extern FW_WFCProfile FW_WFCProfile2;
684 extern FW_WFCProfile FW_WFCProfile3;
685 extern WifiHandler *CurrentWifiHandler;
686 
687 #endif
688