diff options
author | guy <guy> | 2005-06-21 01:03:03 +0000 |
---|---|---|
committer | guy <guy> | 2005-06-21 01:03:03 +0000 |
commit | 959719860dfb7830bdeefe6806c5b0a18ebe36f6 (patch) | |
tree | 87af1afca8d4d48b8e31cc1565c41b71438556ad /pcap-septel.c | |
parent | 32234cde86c9cff17ee88cb1c104e756cf6d1e37 (diff) | |
download | libpcap-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.c | 243 |
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); } |