Remove wsnbridge. Let's focus sniffing efforts on sensniff.
This commit is contained in:
parent
17eb0afbe2
commit
958dcf06f7
|
@ -22,4 +22,8 @@ Look in the host directory
|
||||||
Contiki support
|
Contiki support
|
||||||
---------------
|
---------------
|
||||||
The code promisc for support is needed. This also adds the sensniff
|
The code promisc for support is needed. This also adds the sensniff
|
||||||
format. See rf230-promisc.pat for the rf230bb radions.
|
format.
|
||||||
|
|
||||||
|
References
|
||||||
|
----------
|
||||||
|
https://github.com/g-oikonomou/sensniff
|
||||||
|
|
|
@ -1,17 +0,0 @@
|
||||||
|
|
||||||
CC = gcc
|
|
||||||
CFLAGS = -c
|
|
||||||
SOURCES = wsbridge.c
|
|
||||||
OBJECTS = $(SOURCES:.c=.o)
|
|
||||||
EXE = wsbridge
|
|
||||||
|
|
||||||
all: $(SOURCES) $(EXE)
|
|
||||||
|
|
||||||
$(EXE): $(OBJECTS)
|
|
||||||
$(CC) $(OBJECTS) -o $@
|
|
||||||
|
|
||||||
%.o:%.c
|
|
||||||
$(CC) $(CFLAGS) $< -o $@
|
|
||||||
|
|
||||||
clean:
|
|
||||||
rm *.o
|
|
|
@ -1,38 +0,0 @@
|
||||||
Sniffer application host side
|
|
||||||
=============================
|
|
||||||
This a Unix application to link between the serial port having the
|
|
||||||
sensor node connected and Wireshark or tcpdump. Enclosed is a modified
|
|
||||||
wsbridge (See copyright i file) code to use the format used by sensniff.
|
|
||||||
|
|
||||||
You can also use sensniff which is a Python script. Author of senssniff
|
|
||||||
is George Oikonomou (oikonomou@users.sf.net)
|
|
||||||
|
|
||||||
See:
|
|
||||||
https://github.com/g-oikonomou/sensniff
|
|
||||||
|
|
||||||
|
|
||||||
Function
|
|
||||||
--------
|
|
||||||
The mote captures WSN data and formats according sensniff format sends
|
|
||||||
over the serial line. The data is binary. The wsbridge reads reads serial
|
|
||||||
line (typically /dev/ttyUSB) on Linux systems decodes the sensnaiff and
|
|
||||||
create timestamp and adds the the PCAP farming and writes the result to
|
|
||||||
a FIFO or named pipe. /tmp/wireshark or /tmp/sensniff.
|
|
||||||
|
|
||||||
Bulld
|
|
||||||
-----
|
|
||||||
Just use the Makefile. Put binary for convince in your path.
|
|
||||||
|
|
||||||
Usage
|
|
||||||
-----
|
|
||||||
* wsbridge /dev/ttYUSB
|
|
||||||
* wireshart -k -i /tmp/wireshark
|
|
||||||
|
|
||||||
Default serial port speed
|
|
||||||
-------------------------
|
|
||||||
38400 bps
|
|
||||||
|
|
||||||
References
|
|
||||||
----------
|
|
||||||
http://www.freaklabs.org/index.php/wsbridge.html
|
|
||||||
https://github.com/g-oikonomou/sensniff
|
|
|
@ -1,459 +0,0 @@
|
||||||
/*******************************************************************
|
|
||||||
Copyright (C) 2009 FreakLabs
|
|
||||||
All rights reserved.
|
|
||||||
|
|
||||||
Redistribution and use in source and binary forms, with or without
|
|
||||||
modification, are permitted provided that the following conditions
|
|
||||||
are met:
|
|
||||||
|
|
||||||
1. Redistributions of source code must retain the above copyright
|
|
||||||
notice, this list of conditions and the following disclaimer.
|
|
||||||
2. Redistributions in binary form must reproduce the above copyright
|
|
||||||
notice, this list of conditions and the following disclaimer in the
|
|
||||||
documentation and/or other materials provided with the distribution.
|
|
||||||
3. Neither the name of the the copyright holder nor the names of its contributors
|
|
||||||
may be used to endorse or promote products derived from this software
|
|
||||||
without specific prior written permission.
|
|
||||||
|
|
||||||
THIS SOFTWARE IS PROVIDED BY THE THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND
|
|
||||||
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
||||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
||||||
ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
|
|
||||||
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
||||||
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
|
||||||
OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
|
||||||
HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
|
||||||
LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
|
||||||
OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
|
||||||
SUCH DAMAGE.
|
|
||||||
|
|
||||||
Originally written by Christopher Wang aka Akiba.
|
|
||||||
Please post support questions to the FreakLabs forum.
|
|
||||||
|
|
||||||
*******************************************************************/
|
|
||||||
/*!
|
|
||||||
FreakLabs Freakduino/Wireshark Bridge
|
|
||||||
|
|
||||||
This program allows data from the Freakduino to be piped into wireshark.
|
|
||||||
When the sniffer firmware is loaded into the Freakduino, then the Freakduino
|
|
||||||
will be in promiscuous mode and will just dump any frames it sees. This
|
|
||||||
program takes the frame dump and sends it into Wireshark for analysis. The
|
|
||||||
global header is already set up to inform wireshark that the link layer for
|
|
||||||
all frames will be in IEEE 802.15.4 format. After that, it is up to the user
|
|
||||||
to choose any higher layer protocols to decode above 802.15.4 via the
|
|
||||||
wireshark "enable protocols" menu.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
|
|
||||||
Modified for sensniff format. Magic[4] + Vers[1] + CMD[1] + len[1]
|
|
||||||
Robert Olsson <roolss@kth.se> 2015-11-10
|
|
||||||
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**************************************************************************/
|
|
||||||
#include <stddef.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <errno.h>
|
|
||||||
#include <time.h>
|
|
||||||
#include <stdint.h>
|
|
||||||
#include <signal.h>
|
|
||||||
#include <sys/types.h>
|
|
||||||
#include <sys/stat.h>
|
|
||||||
#include <fcntl.h>
|
|
||||||
#include <termios.h>
|
|
||||||
|
|
||||||
#define PORTBUFSIZE 32
|
|
||||||
#define BUFSIZE 1024
|
|
||||||
#define PACKET_FCS 2
|
|
||||||
#define DEBUG 1
|
|
||||||
#define PIPENAME "/tmp/wireshark"
|
|
||||||
#define BAUDRATE B38400
|
|
||||||
|
|
||||||
enum FSM {
|
|
||||||
START_CAPTURE,
|
|
||||||
PACKET_CAPTURE
|
|
||||||
};
|
|
||||||
|
|
||||||
static int FD_pipe = -1;
|
|
||||||
static int FD_com = -1;
|
|
||||||
static uint8_t port_buf[PORTBUFSIZE];
|
|
||||||
static uint8_t circ_buf[BUFSIZE];
|
|
||||||
static uint16_t rd_idx = 0;
|
|
||||||
static uint16_t wr_idx = 0;
|
|
||||||
static uint8_t len;
|
|
||||||
static uint8_t state = START_CAPTURE;
|
|
||||||
static uint8_t file_write = 0;
|
|
||||||
static fd_set fds;
|
|
||||||
static const uint8_t magic[] = { 0xC1, 0x1F, 0xFE, 0x72 };
|
|
||||||
|
|
||||||
/**************************************************************************/
|
|
||||||
/*!
|
|
||||||
Open the serial port that we'll be communicating with the Freakduino (sniffer)
|
|
||||||
through.
|
|
||||||
*/
|
|
||||||
/**************************************************************************/
|
|
||||||
|
|
||||||
int
|
|
||||||
serial_open(char *portname)
|
|
||||||
{
|
|
||||||
int baud = B38400;
|
|
||||||
int fd; /* file descriptor for the serial port */
|
|
||||||
struct termios tc, tp;
|
|
||||||
|
|
||||||
fd = open(portname, O_RDONLY | O_NOCTTY | O_NDELAY);
|
|
||||||
|
|
||||||
if(fd == -1) { /* if open is unsucessful */
|
|
||||||
printf("serial_open: Unable to open %s.\n", portname);
|
|
||||||
exit(-1);
|
|
||||||
}
|
|
||||||
|
|
||||||
fcntl(fd, F_GETFL);
|
|
||||||
fcntl(fd, F_SETFL, O_RDWR);
|
|
||||||
|
|
||||||
tp.c_cflag = baud | CS8 | CLOCAL | CREAD;
|
|
||||||
tp.c_oflag = 0; /* Raw Input */
|
|
||||||
tp.c_lflag = 0; /* No conoical */
|
|
||||||
tp.c_oflag &= ~(OLCUC | OCRNL | ONOCR | ONLRET | OFILL | OFDEL | NLDLY | CRDLY);
|
|
||||||
|
|
||||||
/* ignore CR, ignore parity */
|
|
||||||
tp.c_iflag = ~(IGNBRK | PARMRK | INPCK | INLCR | IUCLC | IXOFF) |
|
|
||||||
BRKINT | IGNPAR | ICRNL | IXON | ISIG | ICANON;
|
|
||||||
|
|
||||||
tp.c_lflag &= ~(ECHO | ECHONL);
|
|
||||||
tp.c_oflag = 0; /* Raw Input */
|
|
||||||
tp.c_iflag &= ~ISTRIP;
|
|
||||||
|
|
||||||
tcflush(fd, TCIFLUSH);
|
|
||||||
|
|
||||||
cfsetospeed(&tp, baud);
|
|
||||||
cfsetispeed(&tp, baud);
|
|
||||||
|
|
||||||
if(tcsetattr(fd, TCSANOW, &tp) < 0) {
|
|
||||||
perror("Couldn't set term attributes");
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
return fd;
|
|
||||||
}
|
|
||||||
/**************************************************************************/
|
|
||||||
/*!
|
|
||||||
Create the named pipe that we will be communicating with wireshark through.
|
|
||||||
*/
|
|
||||||
/**************************************************************************/
|
|
||||||
static void
|
|
||||||
named_pipe_create(char *name)
|
|
||||||
{
|
|
||||||
int rv = 0;
|
|
||||||
rv = mkfifo(name, 0666);
|
|
||||||
if((rv == -1) && (errno != EEXIST)) {
|
|
||||||
perror("Error creating named pipe");
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
FD_pipe = open(name, O_WRONLY);
|
|
||||||
|
|
||||||
if(FD_pipe == -1) {
|
|
||||||
perror("Error connecting to named pipe");
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/**************************************************************************/
|
|
||||||
/*!
|
|
||||||
Write data to the pipe
|
|
||||||
*/
|
|
||||||
/**************************************************************************/
|
|
||||||
size_t
|
|
||||||
data_write(const void *ptr, size_t size)
|
|
||||||
{
|
|
||||||
ssize_t bytes = 0;
|
|
||||||
if(FD_pipe != -1) {
|
|
||||||
bytes = write(FD_pipe, ptr, size);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/**************************************************************************/
|
|
||||||
/*!
|
|
||||||
Write the global header to wireshark. This is only done once at the
|
|
||||||
beginning of the capture.
|
|
||||||
*/
|
|
||||||
/**************************************************************************/
|
|
||||||
static void
|
|
||||||
write_global_hdr()
|
|
||||||
{
|
|
||||||
uint32_t magic_number = 0xa1b2c3d4; /* magic number */
|
|
||||||
uint16_t version_major = 2; /* major version number */
|
|
||||||
uint16_t version_minor = 4; /* minor version number */
|
|
||||||
int32_t thiszone = 0; /* GMT to local correction */
|
|
||||||
uint32_t sigfigs = 0; /* accuracy of timestamps */
|
|
||||||
uint32_t snaplen = 65535; /* max length of captured packets, in octets */
|
|
||||||
uint32_t network = 195; /* data link type (DLT) - IEEE 802.15.4 */
|
|
||||||
|
|
||||||
data_write(&magic_number, sizeof(magic_number));
|
|
||||||
data_write(&version_major, sizeof(version_major));
|
|
||||||
data_write(&version_minor, sizeof(version_minor));
|
|
||||||
data_write(&thiszone, sizeof(thiszone));
|
|
||||||
data_write(&sigfigs, sizeof(sigfigs));
|
|
||||||
data_write(&snaplen, sizeof(snaplen));
|
|
||||||
data_write(&network, sizeof(network));
|
|
||||||
}
|
|
||||||
/**************************************************************************/
|
|
||||||
/*!
|
|
||||||
Write the frame header into wireshark. This is required for the libpcap
|
|
||||||
format and informs wireshark that a new frame is coming.
|
|
||||||
*/
|
|
||||||
/**************************************************************************/
|
|
||||||
static void
|
|
||||||
write_frame_hdr(uint8_t len)
|
|
||||||
{
|
|
||||||
uint32_t ts_sec; /* timestamp seconds */
|
|
||||||
uint32_t ts_usec; /* timestamp microseconds */
|
|
||||||
uint32_t incl_len; /* number of octets of packet saved in file */
|
|
||||||
uint32_t orig_len; /* actual length of packet */
|
|
||||||
struct timeval tv;
|
|
||||||
|
|
||||||
gettimeofday(&tv, NULL);
|
|
||||||
ts_sec = tv.tv_sec;
|
|
||||||
ts_usec = tv.tv_usec;
|
|
||||||
incl_len = len;
|
|
||||||
orig_len = len + PACKET_FCS;
|
|
||||||
|
|
||||||
data_write(&ts_sec, sizeof(ts_sec));
|
|
||||||
data_write(&ts_usec, sizeof(ts_usec));
|
|
||||||
data_write(&incl_len, sizeof(incl_len));
|
|
||||||
data_write(&orig_len, sizeof(orig_len));
|
|
||||||
}
|
|
||||||
/**************************************************************************/
|
|
||||||
/*!
|
|
||||||
Write one frame into wireshark (via the pipe).
|
|
||||||
*/
|
|
||||||
/**************************************************************************/
|
|
||||||
static void
|
|
||||||
write_frame(uint8_t frame_len)
|
|
||||||
{
|
|
||||||
uint8_t i;
|
|
||||||
|
|
||||||
/* actual frame length for wireshark should not include FCS */
|
|
||||||
frame_len -= PACKET_FCS;
|
|
||||||
|
|
||||||
/* write header to inform WS that new frame has arrived */
|
|
||||||
write_frame_hdr(frame_len);
|
|
||||||
|
|
||||||
/* bump rd_idx. we don't want to write the length byte */
|
|
||||||
rd_idx = (rd_idx + 1) % BUFSIZE;
|
|
||||||
|
|
||||||
/* write frame into wireshark */
|
|
||||||
for(i = 0; i < frame_len; i++) {
|
|
||||||
data_write(&circ_buf[rd_idx], 1);
|
|
||||||
rd_idx = (rd_idx + 1) % BUFSIZE;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* bump rd_idx. we're not using the trailing FCS value */
|
|
||||||
rd_idx = (rd_idx + 1) % BUFSIZE;
|
|
||||||
}
|
|
||||||
/**************************************************************************/
|
|
||||||
/*!
|
|
||||||
Calculate total number of bytes in buffer.
|
|
||||||
*/
|
|
||||||
/**************************************************************************/
|
|
||||||
static uint16_t
|
|
||||||
calc_bytes_in_buf()
|
|
||||||
{
|
|
||||||
if(rd_idx > wr_idx) {
|
|
||||||
/* read index is greater than write. we must have wrapped around */
|
|
||||||
return BUFSIZE - (rd_idx - wr_idx);
|
|
||||||
} else {
|
|
||||||
return wr_idx - rd_idx;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/**************************************************************************/
|
|
||||||
/*!
|
|
||||||
Deal with any received signals. This includes ctrl-C to stop the program.
|
|
||||||
*/
|
|
||||||
/**************************************************************************/
|
|
||||||
static void
|
|
||||||
sig_int(int signo)
|
|
||||||
{
|
|
||||||
(void)signo;
|
|
||||||
if(FD_pipe != -1) {
|
|
||||||
printf("\nClosing pipe.\n");
|
|
||||||
close(FD_pipe);
|
|
||||||
}
|
|
||||||
|
|
||||||
if(FD_com != -1) {
|
|
||||||
printf("\nClosing serial port.\n");
|
|
||||||
close(FD_com);
|
|
||||||
}
|
|
||||||
|
|
||||||
printf("\nSignal captured and devices shut down.\n");
|
|
||||||
|
|
||||||
exit(0);
|
|
||||||
}
|
|
||||||
/**************************************************************************/
|
|
||||||
/*!
|
|
||||||
Init the signals we'll be checking for.
|
|
||||||
*/
|
|
||||||
/**************************************************************************/
|
|
||||||
static void
|
|
||||||
signal_init(void)
|
|
||||||
{
|
|
||||||
signal(SIGINT, sig_int);
|
|
||||||
signal(SIGHUP, sig_int);
|
|
||||||
signal(SIGTERM, sig_int);
|
|
||||||
}
|
|
||||||
int got;
|
|
||||||
int debug;
|
|
||||||
|
|
||||||
/**************************************************************************/
|
|
||||||
/*!
|
|
||||||
Here's the meat of the code.
|
|
||||||
*/
|
|
||||||
/**************************************************************************/
|
|
||||||
int
|
|
||||||
main(int argc, char *argv[])
|
|
||||||
{
|
|
||||||
int nbytes;
|
|
||||||
uint8_t i;
|
|
||||||
|
|
||||||
got = 0;
|
|
||||||
|
|
||||||
/* capture any signals that will terminate program */
|
|
||||||
signal_init();
|
|
||||||
|
|
||||||
/* make sure the COM port is specified */
|
|
||||||
if(argc == 2) {
|
|
||||||
/* open the COM port */
|
|
||||||
if((FD_com = serial_open(argv[1])) == -1) {
|
|
||||||
printf("Serial port not opened.\n");
|
|
||||||
return 0;
|
|
||||||
} else {
|
|
||||||
/* set up the select statement for the COM port. */
|
|
||||||
FD_ZERO(&fds);
|
|
||||||
FD_SET(FD_com, &fds);
|
|
||||||
|
|
||||||
printf("Serial port connected. Waiting for wireshark connection.\n");
|
|
||||||
printf("Open wireshark and connect to local interface: %s\n", PIPENAME);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
printf("Usage: wsbridge <portname>.\n");
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* create and open pipe for wireshark */
|
|
||||||
named_pipe_create(PIPENAME);
|
|
||||||
|
|
||||||
/* wait for wireshark to connect to pipe. Once wireshark */
|
|
||||||
/* connects, then the global header will be written to it. */
|
|
||||||
if(FD_pipe != -1) {
|
|
||||||
write_global_hdr();
|
|
||||||
printf("Client connected to pipe.\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
for(;;) {
|
|
||||||
uint16_t bytes_in_buf;
|
|
||||||
uint8_t frame_len, byte_ctr;
|
|
||||||
|
|
||||||
/* block until there is data in the serial port */
|
|
||||||
select(FD_com + 1, &fds, NULL, NULL, NULL);
|
|
||||||
if(FD_ISSET(FD_com, &fds)) {
|
|
||||||
int ii;
|
|
||||||
/* wait for data to come in on the serial port */
|
|
||||||
if((nbytes = read(FD_com, port_buf, PORTBUFSIZE)) > 0) {
|
|
||||||
|
|
||||||
if(debug) {
|
|
||||||
uint8_t p;
|
|
||||||
printf("read nbytes=%d\n", nbytes);
|
|
||||||
for(i = 0; i < nbytes; i++) {
|
|
||||||
printf(" %02X", port_buf[i]);
|
|
||||||
}
|
|
||||||
printf("\n");
|
|
||||||
}
|
|
||||||
/* write data to circular buffer. loop through all received bytes */
|
|
||||||
for(i = 0; i < nbytes; i++) {
|
|
||||||
switch(state) {
|
|
||||||
case START_CAPTURE:
|
|
||||||
/* new frame starting */
|
|
||||||
if((got == 0) && (port_buf[i] == magic[0])) {
|
|
||||||
got = 1;
|
|
||||||
} else if((got == 1) && (port_buf[i] == magic[1])) {
|
|
||||||
got = 2;
|
|
||||||
} else if((got == 2) && (port_buf[i] == magic[2])) {
|
|
||||||
got = 3;
|
|
||||||
} else if((got == 3) && (port_buf[i] == magic[3])) {
|
|
||||||
got = 4;
|
|
||||||
if(debug) {
|
|
||||||
printf("GOT MAGIC i=%d\n", i);
|
|
||||||
}
|
|
||||||
} else if((got == 4) && (port_buf[i] == 1)) {
|
|
||||||
got = 5;
|
|
||||||
if(debug) {
|
|
||||||
printf("GOT VERSION i=%d\n", port_buf[i]);
|
|
||||||
}
|
|
||||||
} else if((got == 5) && (port_buf[i] == 0)) {
|
|
||||||
got = 6;
|
|
||||||
if(debug) {
|
|
||||||
printf("GOT COMMAND i=%d\n", port_buf[i]);
|
|
||||||
}
|
|
||||||
} else if(got == 6) {
|
|
||||||
len = port_buf[i];
|
|
||||||
byte_ctr = 0;
|
|
||||||
if(debug) {
|
|
||||||
printf("Len = %02X.\n", len);
|
|
||||||
}
|
|
||||||
circ_buf[wr_idx] = len;
|
|
||||||
wr_idx = (wr_idx + 1) % BUFSIZE;
|
|
||||||
state = PACKET_CAPTURE;
|
|
||||||
} else {
|
|
||||||
got = 0;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case PACKET_CAPTURE:
|
|
||||||
/* continue capturing bytes until end of frame */
|
|
||||||
/* write data to circular buffer and increment index */
|
|
||||||
|
|
||||||
circ_buf[wr_idx] = port_buf[i];
|
|
||||||
/* ////printf("%02X ", circ_buf[wr_idx]); */
|
|
||||||
|
|
||||||
wr_idx = (wr_idx + 1) % BUFSIZE;
|
|
||||||
/* track number of received bytes. when received bytes */
|
|
||||||
/* equals frame length, then restart state machine and */
|
|
||||||
/* write bytes to wireshark */
|
|
||||||
byte_ctr++;
|
|
||||||
if(byte_ctr == (len - 1)) {
|
|
||||||
state = START_CAPTURE;
|
|
||||||
file_write = 1;
|
|
||||||
/* printf("\n"); */
|
|
||||||
got = 0;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
fflush(stdout);
|
|
||||||
}
|
|
||||||
/* at least one frame has been written. loop through circular buffer */
|
|
||||||
/* and write out all completed frames */
|
|
||||||
while(file_write) {
|
|
||||||
/* capture frame length and check buffer to see if one or more frames */
|
|
||||||
/* are available. */
|
|
||||||
frame_len = circ_buf[rd_idx];
|
|
||||||
bytes_in_buf = calc_bytes_in_buf();
|
|
||||||
|
|
||||||
if(bytes_in_buf > frame_len) {
|
|
||||||
/* if more than one frame is available, then write one frame to */
|
|
||||||
/* wireshark and then see if any more are available. */
|
|
||||||
write_frame(frame_len);
|
|
||||||
} else if(bytes_in_buf == frame_len) {
|
|
||||||
/* only one frame is available. write to wireshark and then quit */
|
|
||||||
/* the loop */
|
|
||||||
write_frame(frame_len);
|
|
||||||
file_write = 0;
|
|
||||||
} else {
|
|
||||||
/* less than one frame is available. quit the loop and collect more */
|
|
||||||
/* bytes. we normally should not get here. */
|
|
||||||
file_write = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
Loading…
Reference in a new issue