summaryrefslogtreecommitdiff
path: root/pcap-septel.c
diff options
context:
space:
mode:
authorguy <guy>2005-06-21 01:03:03 +0000
committerguy <guy>2005-06-21 01:03:03 +0000
commit959719860dfb7830bdeefe6806c5b0a18ebe36f6 (patch)
tree87af1afca8d4d48b8e31cc1565c41b71438556ad /pcap-septel.c
parent32234cde86c9cff17ee88cb1c104e756cf6d1e37 (diff)
downloadlibpcap-959719860dfb7830bdeefe6806c5b0a18ebe36f6.tar.gz
The data link layer isn't settable, so get rid of
"septel_set_datalink()". It's also always the same, so get rid of "septel_get_datalink()". Add an inject routine that just returns an error. Get rid of a malloc() whose result was neither used nor freed. Clean up indentation.
Diffstat (limited to 'pcap-septel.c')
-rw-r--r--pcap-septel.c243
1 files changed, 116 insertions, 127 deletions
diff --git a/pcap-septel.c b/pcap-septel.c
index eae6e164..9f0233ec 100644
--- a/pcap-septel.c
+++ b/pcap-septel.c
@@ -1,7 +1,7 @@
/*
* pcap-septel.c: Packet capture interface for Intel/Septel card.
*
- * The functionality of this code attempts to mimic that of pcap-linux as much
+ * The functionality of this code attempts to mimic that of pcap-linux as much
* as possible. This code is compiled in several different ways depending on
* whether SEPTEL_ONLY and HAVE_SEPTEL_API are defined. If HAVE_SEPTEL_API is
* not defined it should not get compiled in, otherwise if SEPTEL_ONLY is
@@ -16,7 +16,7 @@
#ifndef lint
static const char rcsid[] _U_ =
- "@(#) $Header: /tcpdump/master/libpcap/pcap-septel.c,v 1.1 2005-06-20 21:27:10 guy Exp $";
+ "@(#) $Header: /tcpdump/master/libpcap/pcap-septel.c,v 1.2 2005-06-21 01:03:03 guy Exp $";
#endif
#ifdef HAVE_CONFIG_H
@@ -47,7 +47,7 @@ static const char rcsid[] _U_ =
#endif /* HAVE_SEPTEL_API */
#ifdef SEPTEL_ONLY
-/* This code is required when compiling for a DAG device only. */
+/* This code is required when compiling for a Septel device only. */
#include "pcap-septel.h"
/* Replace dag function names with pcap equivalent. */
@@ -57,8 +57,6 @@ static const char rcsid[] _U_ =
static int septel_setfilter(pcap_t *p, struct bpf_program *fp);
static int septel_stats(pcap_t *p, struct pcap_stat *ps);
-static int septel_set_datalink(pcap_t *p, int dlt);
-static int septel_get_datalink(pcap_t *p);
static int septel_setnonblock(pcap_t *p, int nonblock, char *errbuf);
static void septel_platform_close(pcap_t *p) {
@@ -74,121 +72,130 @@ static void septel_platform_close(pcap_t *p) {
*/
static int septel_read(pcap_t *p, int cnt, pcap_handler callback, u_char *user) {
- HDR *h;
- MSG *m;
- int processed = 0 ;
- int t = 0 ;
-
- /* identifier for the message queue of the module(upe) from which we are capturing
- * packets.These IDs are defined in system.txt . By default it is set to 0x2d
- * so change it to 0xdd for technical reason and therefore the module id for upe becomes:
- * LOCAL 0xdd * upe - Example user part task */
- unsigned int id = 0xdd;
+ HDR *h;
+ MSG *m;
+ int processed = 0 ;
+ int t = 0 ;
+
+ /* identifier for the message queue of the module(upe) from which we are capturing
+ * packets.These IDs are defined in system.txt . By default it is set to 0x2d
+ * so change it to 0xdd for technical reason and therefore the module id for upe becomes:
+ * LOCAL 0xdd * upe - Example user part task */
+ unsigned int id = 0xdd;
+
+ /* process the packets */
+ do {
+
+ unsigned short packet_len = 0;
+ int caplen = 0;
+ int counter = 0;
+ struct pcap_pkthdr pcap_header;
+ u_char *dp ;
+
+ /*
+ * Has "pcap_breakloop()" been called?
+ */
+loop:
+ if (p->break_loop) {
+ /*
+ * Yes - clear the flag that indicates that
+ * it has, and return -2 to indicate that
+ * we were told to break out of the loop.
+ */
+ p->break_loop = 0;
+ return -2;
+ }
- /* process the packets */
+ /*repeat until a packet is read
+ *a NULL message means :
+ * when no packet is in queue or all packets in queue already read */
do {
+ /* receive packet in non-blocking mode
+ * GCT_grab is defined in the septel library software */
+ h = GCT_grab(id);
- unsigned short packet_len = 0;
- int caplen = 0;
- int counter = 0;
- struct pcap_pkthdr pcap_header;
-
- u_char *dp ;
- dp = malloc(320); /* 320 = size of param area */
-
- /*
- * Has "pcap_breakloop()" been called?
- */
- loop:
- if (p->break_loop) {
- /*
- * Yes - clear the flag that indicates that
- * it has, and return -2 to indicate that
- * we were told to break out of the loop.
- */
- p->break_loop = 0;
- return -2;
- }
-
- /*repeat until a packet is read
- *a NULL message means :
- * when no packet is in queue or all packets in queue already read */
- do {
- /* receive packet in non-blocking mode
- * GCT_grab is defined in the septel library software */
- h = GCT_grab(id);
-
- m = (MSG*)h;
- /* a couter is added here to avoid an infinite loop
- * that will cause our capture program GUI to freeze while waiting for a packet*/
- counter++ ;
-
- }
- while ((m == NULL)&& (counter< 100)) ;
-
- if (m != NULL) {
+ m = (MSG*)h;
+ /* a couter is added here to avoid an infinite loop
+ * that will cause our capture program GUI to freeze while waiting
+ * for a packet*/
+ counter++ ;
- t = h->type ;
+ }
+ while ((m == NULL)&& (counter< 100)) ;
- /* catch only messages with type = 0xcf00 or 0x8f01 corrsponding to ss7 messages*/
- if ((t != 0xcf00) && (t != 0x8f01)) {
- relm(h);
- goto loop ;
- }
+ if (m != NULL) {
+ t = h->type ;
- dp = get_param(m);/* get pointer to MSG parameter area (m->param) */
- packet_len = m->len;
- caplen = p->snapshot ;
+ /* catch only messages with type = 0xcf00 or 0x8f01 corrsponding to ss7 messages*/
+ /* XXX = why not use API_MSG_TX_REQ for 0xcf00 and API_MSG_RX_IND
+ * for 0x8f01? */
+ if ((t != 0xcf00) && (t != 0x8f01)) {
+ relm(h);
+ goto loop ;
+ }
+ /* XXX - is API_MSG_RX_IND for an MTP2 or MTP3 message? */
+ dp = get_param(m);/* get pointer to MSG parameter area (m->param) */
+ packet_len = m->len;
+ caplen = p->snapshot ;
- if (caplen > packet_len) {
- caplen = packet_len;
- }
- /* Run the packet filter if there is one. */
- if ((p->fcode.bf_insns == NULL) || bpf_filter(p->fcode.bf_insns, dp, packet_len, caplen)) {
+ if (caplen > packet_len) {
+ caplen = packet_len;
+ }
+ /* Run the packet filter if there is one. */
+ if ((p->fcode.bf_insns == NULL) || bpf_filter(p->fcode.bf_insns, dp, packet_len, caplen)) {
+
+
+ /* get a time stamp , consisting of :
+ *
+ * pcap_header.ts.tv_sec:
+ * ----------------------
+ * a UNIX format time-in-seconds when he packet was captured,
+ * i.e. the number of seconds since Epoch time (January 1,1970, 00:00:00 GMT)
+ *
+ * pcap_header.ts.tv_usec :
+ * ------------------------
+ * the number of microseconds since that second
+ * when the packet was captured
+ */
- /* get a time stamp , consisting of :
- *
- * pcap_header.ts.tv_sec:
- * ----------------------
- * a UNIX format time-in-seconds when he packet was captured,
- * i.e. the number of seconds since Epoch time (January 1,1970, 00:00:00 GMT)
- *
- * pcap_header.ts.tv_usec :
- * ------------------------
- * the number of microseconds since that second
- * when the packet was captured
- */
+ (void)gettimeofday(&pcap_header.ts, NULL);
- (void)gettimeofday(&pcap_header.ts, NULL);
+ /* Fill in our own header data */
+ pcap_header.caplen = caplen;
+ pcap_header.len = packet_len;
- /* Fill in our own header data */
- pcap_header.caplen = caplen;
- pcap_header.len = packet_len;
+ /* Count the packet. */
+ p->md.stat.ps_recv++;
- /* Count the packet. */
- p->md.stat.ps_recv++;
+ /* Call the user supplied callback function */
+ callback(user, &pcap_header, dp);
- /* Call the user supplied callback function */
- callback(user, &pcap_header, dp);
+ processed++ ;
- processed++ ;
+ }
+ /* after being processed the packet must be
+ *released in order to receive another one */
+ relm(h);
+ }else
+ processed++;
- }
- /* after being processed the packet must be
- *released in order to receive another one */
- relm(h);
- }else
- processed++;
+ }
+ while (processed < cnt) ;
- }
+ return processed ;
+}
- while (processed < cnt ) ;
- return processed ;
+static int
+septel_inject(pcap_t *handle, const void *buf _U_, size_t size _U_)
+{
+ strlcpy(handle->errbuf, "Sending packets isn't supported on Septel cards",
+ PCAP_ERRBUF_SIZE);
+ return (-1);
}
/*
@@ -214,22 +221,19 @@ pcap_t *septel_open_live(const char *device, int snaplen, int promisc, int to_ms
handle->snapshot = snaplen;
- if ((handle->linktype = septel_get_datalink(handle)) < 0) {
- snprintf(ebuf, PCAP_ERRBUF_SIZE, "septel_get_linktype %s: unknown linktype\n", device);
- goto fail;
- }
+ handle->linktype = DLT_MTP2;
handle->bufsize = 0;
-
/*
- * "select()" and "poll()" don't work on Septel queues
+ * "select()" and "poll()" don't work on Septel queues
*/
handle->selectable_fd = -1;
handle->read_op = septel_read;
+ handle->inject_op = septel_inject;
handle->setfilter_op = septel_setfilter;
- handle->set_datalink_op = septel_set_datalink;
+ handle->set_datalink_op = NULL; /* can't change data link type */
handle->getnonblock_op = pcap_getnonblock_fd;
handle->setnonblock_op = septel_setnonblock;
handle->stats_op = septel_stats;
@@ -239,8 +243,8 @@ pcap_t *septel_open_live(const char *device, int snaplen, int promisc, int to_ms
fail:
if (handle != NULL) {
- free(handle);
- }
+ free(handle);
+ }
return NULL;
}
@@ -271,10 +275,10 @@ unsigned char *p;
/*
* Installs the given bpf filter program in the given pcap structure. There is
* no attempt to store the filter in kernel memory as that is not supported
- * with SEPTEL cards.
+ * with Septel cards.
*/
static int septel_setfilter(pcap_t *p, struct bpf_program *fp) {
-if (!p)
+ if (!p)
return -1;
if (!fp) {
strncpy(p->errbuf, "setfilter: No filter specified",
@@ -292,27 +296,12 @@ if (!p)
p->md.use_bpf = 0;
-
-
- return (0);
+ return (0);
}
static int
-septel_set_datalink(pcap_t *p, int dlt)
-{
- return (0);
-}
-
-static int
septel_setnonblock(pcap_t *p, int nonblock, char *errbuf)
{
- return (0);
-}
-
-static int
-septel_get_datalink(pcap_t *p)
-{
- int linktype = -1;
- return DLT_MTP2;
+ return (0);
}