1478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project/* 2478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * pcap-septel.c: Packet capture interface for Intel/Septel card. 3478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * 4478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * The functionality of this code attempts to mimic that of pcap-linux as much 5478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * as possible. This code is compiled in several different ways depending on 6478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * whether SEPTEL_ONLY and HAVE_SEPTEL_API are defined. If HAVE_SEPTEL_API is 7478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * not defined it should not get compiled in, otherwise if SEPTEL_ONLY is 8478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * defined then the 'septel_' function calls are renamed to 'pcap_' 9478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * equivalents. If SEPTEL_ONLY is not defined then nothing is altered - the 10478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * septel_ functions will be called as required from their 11478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * pcap-linux/equivalents. 12478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * 13478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * Authors: Gilbert HOYEK (gil_hoyek@hotmail.com), Elias M. KHOURY 14478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * (+961 3 485243) 15478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project */ 16478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 17478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#ifndef lint 18478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Projectstatic const char rcsid[] _U_ = 19511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall "@(#) $Header: /tcpdump/master/libpcap/pcap-septel.c,v 1.4 2008-04-14 20:40:58 guy Exp $"; 20478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#endif 21478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 22478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#ifdef HAVE_CONFIG_H 23478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#include "config.h" 24478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#endif 25478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 26478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#include <sys/param.h> 27478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 28478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#include <stdlib.h> 29478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#include <string.h> 30478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#include <errno.h> 31478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 32478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#include "pcap-int.h" 33478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 34478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#include <ctype.h> 35478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#include <netinet/in.h> 36478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#include <sys/mman.h> 37478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#include <sys/socket.h> 38478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#include <sys/types.h> 39478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#include <unistd.h> 40478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 41478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#include <msg.h> 42478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#include <ss7_inc.h> 43478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#include <sysgct.h> 44478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#include <pack.h> 45478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#include <system.h> 46478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 47478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#include "pcap-septel.h" 48478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 49478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Projectstatic int septel_setfilter(pcap_t *p, struct bpf_program *fp); 50478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Projectstatic int septel_stats(pcap_t *p, struct pcap_stat *ps); 51478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Projectstatic int septel_setnonblock(pcap_t *p, int nonblock, char *errbuf); 52478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 53511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall/* 54511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall * Private data for capturing on Septel devices. 55511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall */ 56511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrallstruct pcap_septel { 57511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall struct pcap_stat stat; 58478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project} 59478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 60478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project/* 61478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * Read at most max_packets from the capture queue and call the callback 62478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * for each of them. Returns the number of packets handled, -1 if an 63478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * error occured, or -2 if we were told to break out of the loop. 64478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project */ 65478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Projectstatic int septel_read(pcap_t *p, int cnt, pcap_handler callback, u_char *user) { 66478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 67511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall struct pcap_septel *ps = p->priv; 68478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project HDR *h; 69478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project MSG *m; 70478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project int processed = 0 ; 71478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project int t = 0 ; 72478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 73478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project /* identifier for the message queue of the module(upe) from which we are capturing 74478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * packets.These IDs are defined in system.txt . By default it is set to 0x2d 75478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * so change it to 0xdd for technical reason and therefore the module id for upe becomes: 76478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * LOCAL 0xdd * upe - Example user part task */ 77478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project unsigned int id = 0xdd; 78478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 79478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project /* process the packets */ 80478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project do { 81478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 82478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project unsigned short packet_len = 0; 83478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project int caplen = 0; 84478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project int counter = 0; 85478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project struct pcap_pkthdr pcap_header; 86478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project u_char *dp ; 87478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 88478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project /* 89478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * Has "pcap_breakloop()" been called? 90478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project */ 91478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Projectloop: 92478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project if (p->break_loop) { 93478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project /* 94478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * Yes - clear the flag that indicates that 95478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * it has, and return -2 to indicate that 96478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * we were told to break out of the loop. 97478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project */ 98478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project p->break_loop = 0; 99478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project return -2; 100478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project } 101478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 102478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project /*repeat until a packet is read 103478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project *a NULL message means : 104478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * when no packet is in queue or all packets in queue already read */ 105478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project do { 106478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project /* receive packet in non-blocking mode 107478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * GCT_grab is defined in the septel library software */ 108478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project h = GCT_grab(id); 109478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 110478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project m = (MSG*)h; 111478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project /* a couter is added here to avoid an infinite loop 112478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * that will cause our capture program GUI to freeze while waiting 113478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * for a packet*/ 114478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project counter++ ; 115478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 116478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project } 117478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project while ((m == NULL)&& (counter< 100)) ; 118478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 119478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project if (m != NULL) { 120478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 121478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project t = h->type ; 122478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 123478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project /* catch only messages with type = 0xcf00 or 0x8f01 corrsponding to ss7 messages*/ 124478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project /* XXX = why not use API_MSG_TX_REQ for 0xcf00 and API_MSG_RX_IND 125478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * for 0x8f01? */ 126478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project if ((t != 0xcf00) && (t != 0x8f01)) { 127478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project relm(h); 128478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project goto loop ; 129478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project } 130478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 131478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project /* XXX - is API_MSG_RX_IND for an MTP2 or MTP3 message? */ 132478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project dp = get_param(m);/* get pointer to MSG parameter area (m->param) */ 133478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project packet_len = m->len; 134478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project caplen = p->snapshot ; 135478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 136478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 137478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project if (caplen > packet_len) { 138478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 139478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project caplen = packet_len; 140478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project } 141478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project /* Run the packet filter if there is one. */ 142478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project if ((p->fcode.bf_insns == NULL) || bpf_filter(p->fcode.bf_insns, dp, packet_len, caplen)) { 143478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 144478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 145478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project /* get a time stamp , consisting of : 146478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * 147478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * pcap_header.ts.tv_sec: 148478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * ---------------------- 149478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * a UNIX format time-in-seconds when he packet was captured, 150478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * i.e. the number of seconds since Epoch time (January 1,1970, 00:00:00 GMT) 151478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * 152478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * pcap_header.ts.tv_usec : 153478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * ------------------------ 154478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * the number of microseconds since that second 155478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * when the packet was captured 156478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project */ 157478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 158478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project (void)gettimeofday(&pcap_header.ts, NULL); 159478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 160478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project /* Fill in our own header data */ 161478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project pcap_header.caplen = caplen; 162478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project pcap_header.len = packet_len; 163478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 164478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project /* Count the packet. */ 165511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall ps->stat.ps_recv++; 166478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 167478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project /* Call the user supplied callback function */ 168478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project callback(user, &pcap_header, dp); 169478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 170478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project processed++ ; 171478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 172478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project } 173478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project /* after being processed the packet must be 174478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project *released in order to receive another one */ 175478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project relm(h); 176478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project }else 177478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project processed++; 178478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 179478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project } 180478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project while (processed < cnt) ; 181478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 182478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project return processed ; 183478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project} 184478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 185478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 186478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Projectstatic int 187478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Projectseptel_inject(pcap_t *handle, const void *buf _U_, size_t size _U_) 188478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project{ 189478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project strlcpy(handle->errbuf, "Sending packets isn't supported on Septel cards", 190478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project PCAP_ERRBUF_SIZE); 191478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project return (-1); 192478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project} 193478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 194478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project/* 195511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall * Activate a handle for a live capture from the given Septel device. Always pass a NULL device 196478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * The promisc flag is ignored because Septel cards have built-in tracing. 197511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall * The timeout is also ignored as it is not supported in hardware. 198478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * 199478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * See also pcap(3). 200478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project */ 201511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrallstatic pcap_t *septel_activate(pcap_t* handle) { 202511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall /* Initialize some components of the pcap structure. */ 203478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project handle->linktype = DLT_MTP2; 204478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 205478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project handle->bufsize = 0; 206478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 207478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project /* 208478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * "select()" and "poll()" don't work on Septel queues 209478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project */ 210478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project handle->selectable_fd = -1; 211478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 212478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project handle->read_op = septel_read; 213478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project handle->inject_op = septel_inject; 214478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project handle->setfilter_op = septel_setfilter; 215478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project handle->set_datalink_op = NULL; /* can't change data link type */ 216478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project handle->getnonblock_op = pcap_getnonblock_fd; 217478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project handle->setnonblock_op = septel_setnonblock; 218478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project handle->stats_op = septel_stats; 219478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 220511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall return 0; 221511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall} 222478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 223511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrallpcap_t *septel_create(const char *device, char *ebuf, int *is_ours) { 224511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall const char *cp; 225511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall pcap_t *p; 226511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall 227511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall /* Does this look like the Septel device? */ 228511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall cp = strrchr(device, '/'); 229511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall if (cp == NULL) 230511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall cp = device; 231511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall if (strcmp(cp, "septel") != 0) { 232511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall /* Nope, it's not "septel" */ 233511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall *is_ours = 0; 234511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall return NULL; 235511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall } 236511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall 237511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall /* OK, it's probably ours. */ 238511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall *is_ours = 1; 239511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall 240511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall p = pcap_create_common(device, ebuf, sizeof (struct pcap_septel)); 241511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall if (p == NULL) 242511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall return NULL; 243511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall 244511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall p->activate_op = septel_activate; 245511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall return p; 246478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project} 247478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 248478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Projectstatic int septel_stats(pcap_t *p, struct pcap_stat *ps) { 249511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall struct pcap_septel *handlep = p->priv; 250511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall /*handlep->stat.ps_recv = 0;*/ 251511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall /*handlep->stat.ps_drop = 0;*/ 252478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 253511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall *ps = handlep->stat; 254478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 255478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project return 0; 256478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project} 257478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 258478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 259478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Projectint 260511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrallseptel_findalldevs(pcap_if_t **devlistp, char *errbuf) 261478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project{ 262478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Projectunsigned char *p; 263478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project const char description[512]= "Intel/Septel device"; 264478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project char name[512]="septel" ; 265478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project int ret = 0; 266478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project pcap_add_if(devlistp,name,0,description,errbuf); 267478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 268478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project return (ret); 269478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project} 270478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 271478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 272478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project/* 273478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * Installs the given bpf filter program in the given pcap structure. There is 274478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * no attempt to store the filter in kernel memory as that is not supported 275478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * with Septel cards. 276478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project */ 277478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Projectstatic int septel_setfilter(pcap_t *p, struct bpf_program *fp) { 278478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project if (!p) 279478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project return -1; 280478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project if (!fp) { 281478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project strncpy(p->errbuf, "setfilter: No filter specified", 282478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project sizeof(p->errbuf)); 283478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project return -1; 284478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project } 285478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 286478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project /* Make our private copy of the filter */ 287478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 288478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project if (install_bpf_program(p, fp) < 0) { 289478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project snprintf(p->errbuf, sizeof(p->errbuf), 290478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project "malloc: %s", pcap_strerror(errno)); 291478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project return -1; 292478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project } 293478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 294478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project return (0); 295478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project} 296478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 297478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 298478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Projectstatic int 299478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Projectseptel_setnonblock(pcap_t *p, int nonblock, char *errbuf) 300478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project{ 301511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall fprintf(errbuf, PCAP_ERRBUF_SIZE, "Non-blocking mode not supported on Septel devices"); 302511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall return (-1); 303478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project} 304