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