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