1478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project/* 2478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * Copyright (c) 1999 - 2005 NetGroup, Politecnico di Torino (Italy) 3511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall * Copyright (c) 2005 - 2008 CACE Technologies, Davis (California) 4478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * All rights reserved. 5478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * 6478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * Redistribution and use in source and binary forms, with or without 7478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * modification, are permitted provided that the following conditions 8478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * are met: 9478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * 10478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * 1. Redistributions of source code must retain the above copyright 11478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * notice, this list of conditions and the following disclaimer. 12478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * 2. Redistributions in binary form must reproduce the above copyright 13478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * notice, this list of conditions and the following disclaimer in the 14478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * documentation and/or other materials provided with the distribution. 15478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * 3. Neither the name of the Politecnico di Torino, CACE Technologies 16478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * nor the names of its contributors may be used to endorse or promote 17478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * products derived from this software without specific prior written 18478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * permission. 19478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * 20478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 21478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 22478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 23478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 24478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 25478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 26478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 27478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 28478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 29478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 30478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 31478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * 32478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project */ 33478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 34478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#ifndef lint 35478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Projectstatic const char rcsid[] _U_ = 36511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall "@(#) $Header: /tcpdump/master/libpcap/pcap-win32.c,v 1.42 2008-05-21 22:15:25 gianluca Exp $ (LBL)"; 37478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#endif 38478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 39478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#include <pcap-int.h> 40478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#include <Packet32.h> 41511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#ifdef __MINGW32__ 42511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#ifdef __MINGW64__ 43511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#include <ntddndis.h> 44511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#else /*__MINGW64__*/ 45511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#include <ddk/ntddndis.h> 46511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#include <ddk/ndis.h> 47511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#endif /*__MINGW64__*/ 48511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#else /*__MINGW32__*/ 49511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#include <ntddndis.h> 50511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#endif /*__MINGW32__*/ 51478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#ifdef HAVE_DAG_API 52478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#include <dagnew.h> 53478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#include <dagapi.h> 54478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#endif /* HAVE_DAG_API */ 55478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#ifdef __MINGW32__ 56478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Projectint* _errno(); 57478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#define errno (*_errno()) 58478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#endif /* __MINGW32__ */ 59478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 60478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Projectstatic int pcap_setfilter_win32_npf(pcap_t *, struct bpf_program *); 61478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Projectstatic int pcap_setfilter_win32_dag(pcap_t *, struct bpf_program *); 62478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Projectstatic int pcap_getnonblock_win32(pcap_t *, char *); 63478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Projectstatic int pcap_setnonblock_win32(pcap_t *, int, char *); 64478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 65511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall/*dimension of the buffer in the pcap_t structure*/ 66511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#define WIN32_DEFAULT_USER_BUFFER_SIZE 256000 67511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall 68511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall/*dimension of the buffer in the kernel driver NPF */ 69511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#define WIN32_DEFAULT_KERNEL_BUFFER_SIZE 1000000 70478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 71478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project/* Equivalent to ntohs(), but a lot faster under Windows */ 72478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#define SWAPS(_X) ((_X & 0xff) << 8) | (_X >> 8) 73478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 74478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project/* 75511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall * Private data for capturing on WinPcap devices. 76511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall */ 77511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrallstruct pcap_win { 78511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall int nonblock; 79511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall 80511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#ifdef HAVE_DAG_API 81511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall int dag_fcs_bits; /* Number of checksum bits from link layer */ 82511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#endif 83511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall}; 84511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall 85511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall/* 86478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * Header that the WinPcap driver associates to the packets. 87478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * Once was in bpf.h 88478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project */ 89478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Projectstruct bpf_hdr { 90478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project struct timeval bh_tstamp; /* time stamp */ 91478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project bpf_u_int32 bh_caplen; /* length of captured portion */ 92478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project bpf_u_int32 bh_datalen; /* original length of packet */ 93478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project u_short bh_hdrlen; /* length of bpf header (this struct 94478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project plus alignment padding) */ 95478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project}; 96478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 97511eca30a483e912c274e1d8ba3a0f8f081e2227JP AbgrallCRITICAL_SECTION g_PcapCompileCriticalSection; 98511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall 99511eca30a483e912c274e1d8ba3a0f8f081e2227JP AbgrallBOOL WINAPI DllMain( 100511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall HANDLE hinstDLL, 101511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall DWORD dwReason, 102511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall LPVOID lpvReserved 103511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall) 104511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall{ 105511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall if (dwReason == DLL_PROCESS_ATTACH) 106511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall { 107511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall InitializeCriticalSection(&g_PcapCompileCriticalSection); 108511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall } 109511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall 110511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall return TRUE; 111511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall} 112511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall 113478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project/* Start winsock */ 114478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Projectint 115478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Projectwsockinit() 116478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project{ 117478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project WORD wVersionRequested; 118478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project WSADATA wsaData; 119478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project int err; 120478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project wVersionRequested = MAKEWORD( 1, 1); 121478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project err = WSAStartup( wVersionRequested, &wsaData ); 122478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project if ( err != 0 ) 123478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project { 124478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project return -1; 125478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project } 126478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project return 0; 127478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project} 128478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 129478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 130478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Projectstatic int 131478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Projectpcap_stats_win32(pcap_t *p, struct pcap_stat *ps) 132478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project{ 133478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 134478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project if(PacketGetStats(p->adapter, (struct bpf_stat*)ps) != TRUE){ 135478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project snprintf(p->errbuf, PCAP_ERRBUF_SIZE, "PacketGetStats error: %s", pcap_win32strerror()); 136478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project return -1; 137478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project } 138478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 139478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project return 0; 140478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project} 141478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 142511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall/* Set the dimension of the kernel-level capture buffer */ 143511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrallstatic int 144511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrallpcap_setbuff_win32(pcap_t *p, int dim) 145511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall{ 146511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall if(PacketSetBuff(p->adapter,dim)==FALSE) 147511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall { 148511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall snprintf(p->errbuf, PCAP_ERRBUF_SIZE, "driver error: not enough memory to allocate the kernel buffer"); 149511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall return -1; 150511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall } 151511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall return 0; 152511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall} 153511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall 154511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall/* Set the driver working mode */ 155511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrallstatic int 156511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrallpcap_setmode_win32(pcap_t *p, int mode) 157511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall{ 158511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall if(PacketSetMode(p->adapter,mode)==FALSE) 159511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall { 160511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall snprintf(p->errbuf, PCAP_ERRBUF_SIZE, "driver error: working mode not recognized"); 161511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall return -1; 162511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall } 163511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall 164511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall return 0; 165511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall} 166511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall 167511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall/*set the minimum amount of data that will release a read call*/ 168511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrallstatic int 169511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrallpcap_setmintocopy_win32(pcap_t *p, int size) 170511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall{ 171511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall if(PacketSetMinToCopy(p->adapter, size)==FALSE) 172511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall { 173511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall snprintf(p->errbuf, PCAP_ERRBUF_SIZE, "driver error: unable to set the requested mintocopy size"); 174511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall return -1; 175511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall } 176511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall return 0; 177511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall} 178511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall 179511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall/*return the Adapter for a pcap_t*/ 180511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrallstatic Adapter * 181511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrallpcap_getadapter_win32(pcap_t *p) 182511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall{ 183511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall return p->adapter; 184511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall} 185511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall 186478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Projectstatic int 187478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Projectpcap_read_win32_npf(pcap_t *p, int cnt, pcap_handler callback, u_char *user) 188478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project{ 189478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project int cc; 190478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project int n = 0; 191478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project register u_char *bp, *ep; 192478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 193478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project cc = p->cc; 194478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project if (p->cc == 0) { 195478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project /* 196478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * Has "pcap_breakloop()" been called? 197478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project */ 198478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project if (p->break_loop) { 199478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project /* 200478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * Yes - clear the flag that indicates that it 201478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * has, and return -2 to indicate that we were 202478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * told to break out of the loop. 203478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project */ 204478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project p->break_loop = 0; 205478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project return (-2); 206478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project } 207478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 208478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project /* capture the packets */ 209478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project if(PacketReceivePacket(p->adapter,p->Packet,TRUE)==FALSE){ 210478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project snprintf(p->errbuf, PCAP_ERRBUF_SIZE, "read error: PacketReceivePacket failed"); 211478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project return (-1); 212478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project } 213478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 214478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project cc = p->Packet->ulBytesReceived; 215478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 216478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project bp = p->Packet->Buffer; 217478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project } 218478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project else 219478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project bp = p->bp; 220478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 221478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project /* 222478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * Loop through each packet. 223478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project */ 224478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#define bhp ((struct bpf_hdr *)bp) 225478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project ep = bp + cc; 226478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project while (1) { 227478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project register int caplen, hdrlen; 228478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 229478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project /* 230478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * Has "pcap_breakloop()" been called? 231478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * If so, return immediately - if we haven't read any 232478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * packets, clear the flag and return -2 to indicate 233478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * that we were told to break out of the loop, otherwise 234478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * leave the flag set, so that the *next* call will break 235478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * out of the loop without having read any packets, and 236478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * return the number of packets we've processed so far. 237478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project */ 238478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project if (p->break_loop) { 239478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project if (n == 0) { 240478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project p->break_loop = 0; 241478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project return (-2); 242478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project } else { 243478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project p->bp = bp; 244478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project p->cc = ep - bp; 245478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project return (n); 246478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project } 247478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project } 248478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project if (bp >= ep) 249478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project break; 250478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 251478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project caplen = bhp->bh_caplen; 252478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project hdrlen = bhp->bh_hdrlen; 253478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 254478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project /* 255478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * XXX A bpf_hdr matches a pcap_pkthdr. 256478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project */ 257478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project (*callback)(user, (struct pcap_pkthdr*)bp, bp + hdrlen); 258511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall bp += Packet_WORDALIGN(caplen + hdrlen); 259511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall if (++n >= cnt && !PACKET_COUNT_IS_UNLIMITED(cnt)) { 260478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project p->bp = bp; 261478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project p->cc = ep - bp; 262478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project return (n); 263478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project } 264478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project } 265478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#undef bhp 266478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project p->cc = 0; 267478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project return (n); 268478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project} 269478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 270478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#ifdef HAVE_DAG_API 271478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Projectstatic int 272478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Projectpcap_read_win32_dag(pcap_t *p, int cnt, pcap_handler callback, u_char *user) 273478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project{ 274511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall struct pcap_win *pw = p->priv; 275478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project u_char *dp = NULL; 276478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project int packet_len = 0, caplen = 0; 277478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project struct pcap_pkthdr pcap_header; 278478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project u_char *endofbuf; 279478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project int n = 0; 280478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project dag_record_t *header; 281478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project unsigned erf_record_len; 282478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project ULONGLONG ts; 283478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project int cc; 284478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project unsigned swt; 285478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project unsigned dfp = p->adapter->DagFastProcess; 286478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 287478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project cc = p->cc; 288478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project if (cc == 0) /* Get new packets only if we have processed all the ones of the previous read */ 289478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project { 290478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project /* Get new packets from the network */ 291478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project if(PacketReceivePacket(p->adapter, p->Packet, TRUE)==FALSE){ 292478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project snprintf(p->errbuf, PCAP_ERRBUF_SIZE, "read error: PacketReceivePacket failed"); 293478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project return (-1); 294478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project } 295478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 296478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project cc = p->Packet->ulBytesReceived; 297478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project if(cc == 0) 298478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project /* The timeout has expired but we no packets arrived */ 299478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project return 0; 300478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project header = (dag_record_t*)p->adapter->DagBuffer; 301478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project } 302478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project else 303478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project header = (dag_record_t*)p->bp; 304478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 305478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project endofbuf = (char*)header + cc; 306478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 307478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project /* 308478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * Cycle through the packets 309478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project */ 310478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project do 311478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project { 312478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project erf_record_len = SWAPS(header->rlen); 313478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project if((char*)header + erf_record_len > endofbuf) 314478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project break; 315478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 316478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project /* Increase the number of captured packets */ 317511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall pw->stat.ps_recv++; 318478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 319478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project /* Find the beginning of the packet */ 320478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project dp = ((u_char *)header) + dag_record_size; 321478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 322478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project /* Determine actual packet len */ 323478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project switch(header->type) 324478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project { 325478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project case TYPE_ATM: 326478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project packet_len = ATM_SNAPLEN; 327478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project caplen = ATM_SNAPLEN; 328478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project dp += 4; 329478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 330478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project break; 331478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 332478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project case TYPE_ETH: 333478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project swt = SWAPS(header->wlen); 334511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall packet_len = swt - (pw->dag_fcs_bits); 335478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project caplen = erf_record_len - dag_record_size - 2; 336478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project if (caplen > packet_len) 337478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project { 338478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project caplen = packet_len; 339478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project } 340478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project dp += 2; 341478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 342478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project break; 343478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 344478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project case TYPE_HDLC_POS: 345478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project swt = SWAPS(header->wlen); 346511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall packet_len = swt - (pw->dag_fcs_bits); 347478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project caplen = erf_record_len - dag_record_size; 348478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project if (caplen > packet_len) 349478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project { 350478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project caplen = packet_len; 351478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project } 352478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 353478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project break; 354478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project } 355478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 356478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project if(caplen > p->snapshot) 357478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project caplen = p->snapshot; 358478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 359478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project /* 360478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * Has "pcap_breakloop()" been called? 361478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * If so, return immediately - if we haven't read any 362478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * packets, clear the flag and return -2 to indicate 363478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * that we were told to break out of the loop, otherwise 364478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * leave the flag set, so that the *next* call will break 365478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * out of the loop without having read any packets, and 366478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * return the number of packets we've processed so far. 367478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project */ 368478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project if (p->break_loop) 369478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project { 370478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project if (n == 0) 371478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project { 372478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project p->break_loop = 0; 373478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project return (-2); 374478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project } 375478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project else 376478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project { 377478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project p->bp = (char*)header; 378478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project p->cc = endofbuf - (char*)header; 379478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project return (n); 380478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project } 381478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project } 382478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 383478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project if(!dfp) 384478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project { 385478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project /* convert between timestamp formats */ 386478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project ts = header->ts; 387478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project pcap_header.ts.tv_sec = (int)(ts >> 32); 388478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project ts = (ts & 0xffffffffi64) * 1000000; 389478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project ts += 0x80000000; /* rounding */ 390478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project pcap_header.ts.tv_usec = (int)(ts >> 32); 391478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project if (pcap_header.ts.tv_usec >= 1000000) { 392478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project pcap_header.ts.tv_usec -= 1000000; 393478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project pcap_header.ts.tv_sec++; 394478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project } 395478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project } 396478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 397478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project /* No underlaying filtering system. We need to filter on our own */ 398478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project if (p->fcode.bf_insns) 399478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project { 400478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project if (bpf_filter(p->fcode.bf_insns, dp, packet_len, caplen) == 0) 401478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project { 402478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project /* Move to next packet */ 403478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project header = (dag_record_t*)((char*)header + erf_record_len); 404478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project continue; 405478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project } 406478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project } 407478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 408478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project /* Fill the header for the user suppplied callback function */ 409478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project pcap_header.caplen = caplen; 410478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project pcap_header.len = packet_len; 411478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 412478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project /* Call the callback function */ 413478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project (*callback)(user, &pcap_header, dp); 414478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 415478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project /* Move to next packet */ 416478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project header = (dag_record_t*)((char*)header + erf_record_len); 417478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 418478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project /* Stop if the number of packets requested by user has been reached*/ 419511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall if (++n >= cnt && !PACKET_COUNT_IS_UNLIMITED(cnt)) 420478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project { 421478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project p->bp = (char*)header; 422478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project p->cc = endofbuf - (char*)header; 423478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project return (n); 424478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project } 425478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project } 426478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project while((u_char*)header < endofbuf); 427478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 428478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project return 1; 429478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project} 430478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#endif /* HAVE_DAG_API */ 431478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 432478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project/* Send a packet to the network */ 433478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Projectstatic int 434478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Projectpcap_inject_win32(pcap_t *p, const void *buf, size_t size){ 435478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project LPPACKET PacketToSend; 436478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 437478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project PacketToSend=PacketAllocatePacket(); 438478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 439478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project if (PacketToSend == NULL) 440478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project { 441478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project snprintf(p->errbuf, PCAP_ERRBUF_SIZE, "send error: PacketAllocatePacket failed"); 442478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project return -1; 443478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project } 444478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 445478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project PacketInitPacket(PacketToSend,(PVOID)buf,size); 446478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project if(PacketSendPacket(p->adapter,PacketToSend,TRUE) == FALSE){ 447478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project snprintf(p->errbuf, PCAP_ERRBUF_SIZE, "send error: PacketSendPacket failed"); 448478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project PacketFreePacket(PacketToSend); 449478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project return -1; 450478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project } 451478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 452478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project PacketFreePacket(PacketToSend); 453478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 454478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project /* 455478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * We assume it all got sent if "PacketSendPacket()" succeeded. 456478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * "pcap_inject()" is expected to return the number of bytes 457478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * sent. 458478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project */ 459478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project return size; 460478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project} 461478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 462478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Projectstatic void 463511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrallpcap_cleanup_win32(pcap_t *p) 464478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project{ 465478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project if (p->adapter != NULL) { 466478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project PacketCloseAdapter(p->adapter); 467478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project p->adapter = NULL; 468478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project } 469478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project if (p->Packet) { 470478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project PacketFreePacket(p->Packet); 471478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project p->Packet = NULL; 472478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project } 473511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall pcap_cleanup_live_common(p); 474478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project} 475478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 476511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrallstatic int 477511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrallpcap_activate_win32(pcap_t *p) 478478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project{ 479511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall struct pcap_win *pw = p->priv; 480478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project NetType type; 481478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 482511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall if (p->opt.rfmon) { 483511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall /* 484511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall * No monitor mode on Windows. It could be done on 485511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall * Vista with drivers that support the native 802.11 486511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall * mechanism and monitor mode. 487511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall */ 488511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall return (PCAP_ERROR_RFMON_NOTSUP); 489511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall } 490511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall 491478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project /* Init WinSock */ 492478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project wsockinit(); 493478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 494511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall p->adapter = PacketOpenAdapter(p->opt.source); 495478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 496478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project if (p->adapter == NULL) 497478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project { 498478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project /* Adapter detected but we are not able to open it. Return failure. */ 499511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall snprintf(p->errbuf, PCAP_ERRBUF_SIZE, "Error opening adapter: %s", pcap_win32strerror()); 500511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall return PCAP_ERROR; 501478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project } 502478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 503478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project /*get network type*/ 504478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project if(PacketGetNetType (p->adapter,&type) == FALSE) 505478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project { 506511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall snprintf(p->errbuf, PCAP_ERRBUF_SIZE, "Cannot determine the network type: %s", pcap_win32strerror()); 507478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project goto bad; 508478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project } 509478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 510478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project /*Set the linktype*/ 511478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project switch (type.LinkType) 512478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project { 513478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project case NdisMediumWan: 514478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project p->linktype = DLT_EN10MB; 515478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project break; 516478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 517478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project case NdisMedium802_3: 518478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project p->linktype = DLT_EN10MB; 519478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project /* 520478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * This is (presumably) a real Ethernet capture; give it a 521478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * link-layer-type list with DLT_EN10MB and DLT_DOCSIS, so 522478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * that an application can let you choose it, in case you're 523478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * capturing DOCSIS traffic that a Cisco Cable Modem 524478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * Termination System is putting out onto an Ethernet (it 525478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * doesn't put an Ethernet header onto the wire, it puts raw 526478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * DOCSIS frames out on the wire inside the low-level 527478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * Ethernet framing). 528478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project */ 529478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project p->dlt_list = (u_int *) malloc(sizeof(u_int) * 2); 530478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project /* 531478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * If that fails, just leave the list empty. 532478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project */ 533478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project if (p->dlt_list != NULL) { 534478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project p->dlt_list[0] = DLT_EN10MB; 535478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project p->dlt_list[1] = DLT_DOCSIS; 536478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project p->dlt_count = 2; 537478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project } 538478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project break; 539478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 540478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project case NdisMediumFddi: 541478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project p->linktype = DLT_FDDI; 542478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project break; 543478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 544478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project case NdisMedium802_5: 545478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project p->linktype = DLT_IEEE802; 546478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project break; 547478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 548478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project case NdisMediumArcnetRaw: 549478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project p->linktype = DLT_ARCNET; 550478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project break; 551478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 552478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project case NdisMediumArcnet878_2: 553478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project p->linktype = DLT_ARCNET; 554478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project break; 555478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 556478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project case NdisMediumAtm: 557478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project p->linktype = DLT_ATM_RFC1483; 558478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project break; 559478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 560478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project case NdisMediumCHDLC: 561478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project p->linktype = DLT_CHDLC; 562478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project break; 563478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 564478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project case NdisMediumPPPSerial: 565478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project p->linktype = DLT_PPP_SERIAL; 566478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project break; 567478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 568478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project case NdisMediumNull: 569478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project p->linktype = DLT_NULL; 570478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project break; 571478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 572478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project case NdisMediumBare80211: 573478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project p->linktype = DLT_IEEE802_11; 574478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project break; 575478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 576478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project case NdisMediumRadio80211: 577478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project p->linktype = DLT_IEEE802_11_RADIO; 578478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project break; 579478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 580478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project case NdisMediumPpi: 581478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project p->linktype = DLT_PPI; 582478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project break; 583478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 584478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project default: 585478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project p->linktype = DLT_EN10MB; /*an unknown adapter is assumed to be ethernet*/ 586478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project break; 587478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project } 588478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 589478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project /* Set promiscuous mode */ 590511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall if (p->opt.promisc) 591478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project { 592478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 593478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project if (PacketSetHwFilter(p->adapter,NDIS_PACKET_TYPE_PROMISCUOUS) == FALSE) 594478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project { 595511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall snprintf(p->errbuf, PCAP_ERRBUF_SIZE, "failed to set hardware filter to promiscuous mode"); 596478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project goto bad; 597478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project } 598478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project } 599478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project else 600478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project { 601478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project if (PacketSetHwFilter(p->adapter,NDIS_PACKET_TYPE_ALL_LOCAL) == FALSE) 602478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project { 603511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall snprintf(p->errbuf, PCAP_ERRBUF_SIZE, "failed to set hardware filter to non-promiscuous mode"); 604478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project goto bad; 605478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project } 606478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project } 607478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 608478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project /* Set the buffer size */ 609511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall p->bufsize = WIN32_DEFAULT_USER_BUFFER_SIZE; 610478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 611478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project /* allocate Packet structure used during the capture */ 612478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project if((p->Packet = PacketAllocatePacket())==NULL) 613478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project { 614511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall snprintf(p->errbuf, PCAP_ERRBUF_SIZE, "failed to allocate the PACKET structure"); 615478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project goto bad; 616478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project } 617478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 618478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project if(!(p->adapter->Flags & INFO_FLAG_DAG_CARD)) 619478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project { 620478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project /* 621478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * Traditional Adapter 622478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project */ 623511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall /* 624511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall * If the buffer size wasn't explicitly set, default to 625511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall * WIN32_DEFAULT_USER_BUFFER_SIZE. 626511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall */ 627511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall if (p->opt.buffer_size == 0) 628511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall p->opt.buffer_size = WIN32_DEFAULT_KERNEL_BUFFER_SIZE; 629511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall 630511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall if(PacketSetBuff(p->adapter,p->opt.buffer_size)==FALSE) 631511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall { 632511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall snprintf(p->errbuf, PCAP_ERRBUF_SIZE, "driver error: not enough memory to allocate the kernel buffer"); 633511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall goto bad; 634511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall } 635478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 636511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall p->buffer = (u_char *)malloc(p->bufsize); 637478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project if (p->buffer == NULL) 638478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project { 639511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall snprintf(p->errbuf, PCAP_ERRBUF_SIZE, "malloc: %s", pcap_strerror(errno)); 640478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project goto bad; 641478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project } 642478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 643478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project PacketInitPacket(p->Packet,(BYTE*)p->buffer,p->bufsize); 644478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 645511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall if (p-opt.immediate) 646478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project { 647511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall /* tell the driver to copy the buffer as soon as data arrives */ 648511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall if(PacketSetMinToCopy(p->adapter,0)==FALSE) 649511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall { 650511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall snprintf(p->errbuf, PCAP_ERRBUF_SIZE,"Error calling PacketSetMinToCopy: %s", pcap_win32strerror()); 651511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall goto bad; 652511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall } 653478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project } 654511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall else 655478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project { 656511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall /* tell the driver to copy the buffer only if it contains at least 16K */ 657511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall if(PacketSetMinToCopy(p->adapter,16000)==FALSE) 658511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall { 659511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall snprintf(p->errbuf, PCAP_ERRBUF_SIZE,"Error calling PacketSetMinToCopy: %s", pcap_win32strerror()); 660511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall goto bad; 661511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall } 662478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project } 663478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project } 664478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project else 665478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#ifdef HAVE_DAG_API 666478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project { 667478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project /* 668478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * Dag Card 669478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project */ 670478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project LONG status; 671478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project HKEY dagkey; 672478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project DWORD lptype; 673478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project DWORD lpcbdata; 674478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project int postype = 0; 675478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project char keyname[512]; 676478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 677478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project snprintf(keyname, sizeof(keyname), "%s\\CardParams\\%s", 678478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project "SYSTEM\\CurrentControlSet\\Services\\DAG", 679511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall strstr(_strlwr(p->opt.source), "dag")); 680478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project do 681478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project { 682478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project status = RegOpenKeyEx(HKEY_LOCAL_MACHINE, keyname, 0, KEY_READ, &dagkey); 683478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project if(status != ERROR_SUCCESS) 684478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project break; 685478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 686478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project status = RegQueryValueEx(dagkey, 687478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project "PosType", 688478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project NULL, 689478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project &lptype, 690478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project (char*)&postype, 691478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project &lpcbdata); 692478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 693478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project if(status != ERROR_SUCCESS) 694478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project { 695478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project postype = 0; 696478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project } 697478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 698478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project RegCloseKey(dagkey); 699478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project } 700478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project while(FALSE); 701478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 702478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 703478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project p->snapshot = PacketSetSnapLen(p->adapter, snaplen); 704478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 705478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project /* Set the length of the FCS associated to any packet. This value 706478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * will be subtracted to the packet length */ 707511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall pw->dag_fcs_bits = p->adapter->DagFcsLen; 708478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project } 709478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#else 710478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project goto bad; 711478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#endif /* HAVE_DAG_API */ 712478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 713511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall PacketSetReadTimeout(p->adapter, p->opt.timeout); 714478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 715478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#ifdef HAVE_DAG_API 716478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project if(p->adapter->Flags & INFO_FLAG_DAG_CARD) 717478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project { 718478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project /* install dag specific handlers for read and setfilter */ 719478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project p->read_op = pcap_read_win32_dag; 720478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project p->setfilter_op = pcap_setfilter_win32_dag; 721478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project } 722478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project else 723478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project { 724478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#endif /* HAVE_DAG_API */ 725478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project /* install traditional npf handlers for read and setfilter */ 726478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project p->read_op = pcap_read_win32_npf; 727478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project p->setfilter_op = pcap_setfilter_win32_npf; 728478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#ifdef HAVE_DAG_API 729478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project } 730478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#endif /* HAVE_DAG_API */ 731478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project p->setdirection_op = NULL; /* Not implemented. */ 732478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project /* XXX - can this be implemented on some versions of Windows? */ 733478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project p->inject_op = pcap_inject_win32; 734478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project p->set_datalink_op = NULL; /* can't change data link type */ 735478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project p->getnonblock_op = pcap_getnonblock_win32; 736478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project p->setnonblock_op = pcap_setnonblock_win32; 737478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project p->stats_op = pcap_stats_win32; 738511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall p->setbuff_op = pcap_setbuff_win32; 739511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall p->setmode_op = pcap_setmode_win32; 740511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall p->setmintocopy_op = pcap_setmintocopy_win32; 741511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall p->getadapter_op = pcap_getadapter_win32; 742511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall p->cleanup_op = pcap_cleanup_win32; 743478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 744511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall return (0); 745478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Projectbad: 746511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall pcap_cleanup_win32(p); 747511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall return (PCAP_ERROR); 748478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project} 749478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 750511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrallpcap_t * 751511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrallpcap_create_interface(const char *device, char *ebuf) 752511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall{ 753511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall pcap_t *p; 754511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall 755511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall if (strlen(device) == 1) 756511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall { 757511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall /* 758511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall * It's probably a unicode string 759511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall * Convert to ascii and pass it to pcap_create_common 760511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall * 761511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall * This wonderful hack is needed because pcap_lookupdev still returns 762511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall * unicode strings, and it's used by windump when no device is specified 763511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall * in the command line 764511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall */ 765511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall size_t length; 766511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall char* deviceAscii; 767511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall 768511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall length = wcslen((wchar_t*)device); 769511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall 770511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall deviceAscii = (char*)malloc(length + 1); 771511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall 772511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall if (deviceAscii == NULL) 773511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall { 774511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall snprintf(ebuf, PCAP_ERRBUF_SIZE, "Malloc failed"); 775511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall return NULL; 776511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall } 777511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall 778511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall snprintf(deviceAscii, length + 1, "%ws", (wchar_t*)device); 779511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall p = pcap_create_common(deviceAscii, ebuf, sizeof (struct pcap_win)); 780511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall free(deviceAscii); 781511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall } 782511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall else 783511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall { 784511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall p = pcap_create_common(device, ebuf, sizeof (struct pcap_win)); 785511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall } 786511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall 787511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall if (p == NULL) 788511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall return (NULL); 789511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall 790511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall p->activate_op = pcap_activate_win32; 791511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall return (p); 792511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall} 793478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 794478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Projectstatic int 795478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Projectpcap_setfilter_win32_npf(pcap_t *p, struct bpf_program *fp) 796478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project{ 797478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project if(PacketSetBpf(p->adapter,fp)==FALSE){ 798478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project /* 799478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * Kernel filter not installed. 800478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * XXX - fall back on userland filtering, as is done 801478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * on other platforms? 802478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project */ 803478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project snprintf(p->errbuf, PCAP_ERRBUF_SIZE, "Driver error: cannot set bpf filter: %s", pcap_win32strerror()); 804478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project return (-1); 805478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project } 806478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 807478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project /* 808478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * Discard any previously-received packets, as they might have 809478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * passed whatever filter was formerly in effect, but might 810478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * not pass this filter (BIOCSETF discards packets buffered 811478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * in the kernel, so you can lose packets in any case). 812478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project */ 813478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project p->cc = 0; 814478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project return (0); 815478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project} 816478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 817478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project/* 818478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * We filter at user level, since the kernel driver does't process the packets 819478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project */ 820478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Projectstatic int 821478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Projectpcap_setfilter_win32_dag(pcap_t *p, struct bpf_program *fp) { 822478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 823478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project if(!fp) 824478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project { 825478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project strncpy(p->errbuf, "setfilter: No filter specified", sizeof(p->errbuf)); 826478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project return -1; 827478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project } 828478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 829478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project /* Install a user level filter */ 830478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project if (install_bpf_program(p, fp) < 0) 831478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project { 832478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project snprintf(p->errbuf, sizeof(p->errbuf), 833478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project "setfilter, unable to install the filter: %s", pcap_strerror(errno)); 834478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project return -1; 835478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project } 836478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 837478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project return (0); 838478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project} 839478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 840478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Projectstatic int 841478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Projectpcap_getnonblock_win32(pcap_t *p, char *errbuf) 842478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project{ 843511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall struct pcap_win *pw = p->priv; 844511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall 845478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project /* 846478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * XXX - if there were a PacketGetReadTimeout() call, we 847478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * would use it, and return 1 if the timeout is -1 848478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * and 0 otherwise. 849478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project */ 850511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall return (pw->nonblock); 851478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project} 852478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 853478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Projectstatic int 854478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Projectpcap_setnonblock_win32(pcap_t *p, int nonblock, char *errbuf) 855478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project{ 856511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall struct pcap_win *pw = p->priv; 857478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project int newtimeout; 858478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 859478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project if (nonblock) { 860478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project /* 861478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * Set the read timeout to -1 for non-blocking mode. 862478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project */ 863478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project newtimeout = -1; 864478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project } else { 865478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project /* 866478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * Restore the timeout set when the device was opened. 867478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * (Note that this may be -1, in which case we're not 868478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * really leaving non-blocking mode.) 869478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project */ 870511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall newtimeout = p->opt.timeout; 871478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project } 872478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project if (!PacketSetReadTimeout(p->adapter, newtimeout)) { 873511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall snprintf(errbuf, PCAP_ERRBUF_SIZE, 874478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project "PacketSetReadTimeout: %s", pcap_win32strerror()); 875478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project return (-1); 876478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project } 877511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall pw->nonblock = (newtimeout == -1); 878478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project return (0); 879478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project} 880478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 881511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall/*platform-dependent routine to add devices other than NDIS interfaces*/ 882511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrallint 883511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrallpcap_platform_finddevs(pcap_if_t **alldevsp, char *errbuf) 884478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project{ 885511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall return (0); 886478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project} 887