Adding the avr-rss2 platform based on AtMega256RFR2
This commit is contained in:
parent
d3980668ee
commit
ce8e87d60e
91 changed files with 9349 additions and 0 deletions
11
platform/avr-rss2/apps/sniffer/Makefile
Normal file
11
platform/avr-rss2/apps/sniffer/Makefile
Normal file
|
@ -0,0 +1,11 @@
|
|||
DEFINES+=PROJECT_CONF_H=\"project-conf.h\"
|
||||
PROJECT_SOURCEFILES += stub-rdc.c
|
||||
|
||||
CONTIKI_PROJECT = sniffer
|
||||
|
||||
all: $(CONTIKI_PROJECT)
|
||||
|
||||
CONTIKI = ../../../..
|
||||
|
||||
CONTIKI_WITH_RIME = 1
|
||||
include $(CONTIKI)/Makefile.include
|
25
platform/avr-rss2/apps/sniffer/README.md
Normal file
25
platform/avr-rss2/apps/sniffer/README.md
Normal file
|
@ -0,0 +1,25 @@
|
|||
Sniffer application mote side
|
||||
=============================
|
||||
This put the radio in sniff mode and should capure all traffic used
|
||||
on the set channel.
|
||||
|
||||
Default channel
|
||||
---------------
|
||||
26
|
||||
|
||||
Bulld
|
||||
-----
|
||||
make TARGET=avr-rss2
|
||||
|
||||
Default serial port speed
|
||||
-------------------------
|
||||
38400 bps
|
||||
|
||||
More info & uasage
|
||||
------------------
|
||||
Look in the host directory
|
||||
|
||||
Contiki support
|
||||
---------------
|
||||
The code promisc for support is needed. This also adds the sensniff
|
||||
format. See rf230-promisc.pat for the rf230bb radions.
|
17
platform/avr-rss2/apps/sniffer/host/Makefile
Normal file
17
platform/avr-rss2/apps/sniffer/host/Makefile
Normal file
|
@ -0,0 +1,17 @@
|
|||
|
||||
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
|
38
platform/avr-rss2/apps/sniffer/host/README.md
Normal file
38
platform/avr-rss2/apps/sniffer/host/README.md
Normal file
|
@ -0,0 +1,38 @@
|
|||
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
|
459
platform/avr-rss2/apps/sniffer/host/wsbridge.c
Normal file
459
platform/avr-rss2/apps/sniffer/host/wsbridge.c
Normal file
|
@ -0,0 +1,459 @@
|
|||
/*******************************************************************
|
||||
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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
51
platform/avr-rss2/apps/sniffer/project-conf.h
Normal file
51
platform/avr-rss2/apps/sniffer/project-conf.h
Normal file
|
@ -0,0 +1,51 @@
|
|||
/*
|
||||
* Copyright (c) 2010, Loughborough University - Computer Science
|
||||
* 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 Institute 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 INSTITUTE 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.
|
||||
*
|
||||
* This file is part of the Contiki operating system.
|
||||
*/
|
||||
|
||||
/**
|
||||
* \file
|
||||
* Project specific configuration defines for the sniffer example.
|
||||
*
|
||||
* \author
|
||||
* George Oikonomou - <oikonomou@users.sourceforge.net>
|
||||
* Robert Olsson - <robert@radio.sensors.com>
|
||||
*/
|
||||
|
||||
#ifndef PROJECT_CONF_H_
|
||||
#define PROJECT_CONF_H_
|
||||
|
||||
|
||||
#define NETSTACK_CONF_MAC nullmac_driver
|
||||
/* Can see other channels. Interesting. */
|
||||
/* #define NETSTACK_CONF_MAC csma_driver */
|
||||
#define NETSTACK_CONF_RDC stub_rdc_driver
|
||||
|
||||
|
||||
#endif /* PROJECT_CONF_H_ */
|
39
platform/avr-rss2/apps/sniffer/rf230-promisc.pat
Normal file
39
platform/avr-rss2/apps/sniffer/rf230-promisc.pat
Normal file
|
@ -0,0 +1,39 @@
|
|||
diff --git a/cpu/avr/radio/rf230bb/rf230bb.c b/cpu/avr/radio/rf230bb/rf230bb.c
|
||||
index 53959d1..b9f2262 100644
|
||||
--- a/cpu/avr/radio/rf230bb/rf230bb.c
|
||||
+++ b/cpu/avr/radio/rf230bb/rf230bb.c
|
||||
@@ -544,7 +544,7 @@ rf230_set_promiscuous_mode(bool isPromiscuous) {
|
||||
#if RF230_CONF_AUTOACK
|
||||
is_promiscuous = isPromiscuous;
|
||||
/* TODO: Figure out when to pass promisc state to 802.15.4 */
|
||||
-// radio_set_trx_state(is_promiscuous?RX_ON:RX_AACK_ON);
|
||||
+ radio_set_trx_state(is_promiscuous?RX_ON:RX_AACK_ON);
|
||||
#endif
|
||||
}
|
||||
|
||||
@@ -1392,6 +1392,25 @@ PROCESS_THREAD(rf230_process, ev, data)
|
||||
/* Restore interrupts. */
|
||||
HAL_LEAVE_CRITICAL_REGION();
|
||||
PRINTF("rf230_read: %u bytes lqi %u\n",len,rf230_last_correlation);
|
||||
+
|
||||
+ if(is_promiscuous) {
|
||||
+ uint8_t i;
|
||||
+ unsigned const char * rxdata = packetbuf_dataptr();
|
||||
+ /* Print magic */
|
||||
+ putchar(0xC1);
|
||||
+ putchar(0x1F);
|
||||
+ putchar(0xFE);
|
||||
+ putchar(0x72);
|
||||
+ /* Print version */
|
||||
+ putchar(0x01);
|
||||
+ /* Print CMD == frame */
|
||||
+ putchar(0x00);
|
||||
+ putchar(len+3);
|
||||
+
|
||||
+ for (i=0;i<len;i++) putchar(rxdata[i]);
|
||||
+ printf("\n");
|
||||
+ }
|
||||
+
|
||||
#if DEBUG>1
|
||||
{
|
||||
uint8_t i;
|
67
platform/avr-rss2/apps/sniffer/sniffer.c
Normal file
67
platform/avr-rss2/apps/sniffer/sniffer.c
Normal file
|
@ -0,0 +1,67 @@
|
|||
/*
|
||||
* 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 Institute 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 INSTITUTE 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.
|
||||
*
|
||||
* This file is part of the Contiki operating system.
|
||||
*
|
||||
*/
|
||||
|
||||
/*
|
||||
Author: Robert Olsson <robert@radio-sensors.com>
|
||||
*/
|
||||
|
||||
#include "contiki.h"
|
||||
#include "net/rime/rime.h"
|
||||
#include "random.h"
|
||||
#include "dev/button-sensor.h"
|
||||
#include "dev/leds.h"
|
||||
#include <stdio.h>
|
||||
/*---------------------------------------------------------------------------*/
|
||||
|
||||
PROCESS(sniffer_process, "Sniffer process");
|
||||
AUTOSTART_PROCESSES(&sniffer_process);
|
||||
|
||||
/*---------------------------------------------------------------------------*/
|
||||
PROCESS_THREAD(sniffer_process, ev, data)
|
||||
{
|
||||
PROCESS_BEGIN();
|
||||
|
||||
/*
|
||||
To get rf230bb radio in sniff mode we need to have radio in RX_ON.
|
||||
The promisc commands fixes this for us. No need to set PAN and
|
||||
address or MAC to zero is this case. Se Atmel datasheet. There is
|
||||
a chance other radios works the same way.
|
||||
*/
|
||||
|
||||
rf230_set_promiscuous_mode(1);
|
||||
|
||||
printf("Sniffer started\n");
|
||||
|
||||
while(1) {
|
||||
PROCESS_YIELD();
|
||||
}
|
||||
|
||||
PROCESS_END();
|
||||
}
|
||||
/*---------------------------------------------------------------------------*/
|
100
platform/avr-rss2/apps/sniffer/stub-rdc.c
Normal file
100
platform/avr-rss2/apps/sniffer/stub-rdc.c
Normal file
|
@ -0,0 +1,100 @@
|
|||
/*
|
||||
* Copyright (c) 2010, Loughborough University - Computer Science
|
||||
* 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 Institute 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 INSTITUTE 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.
|
||||
*
|
||||
* This file is part of the Contiki operating system.
|
||||
*/
|
||||
|
||||
/**
|
||||
* \file
|
||||
* Definition of a fake RDC driver to be used with passive
|
||||
* examples. The sniffer will never send packets and it will never
|
||||
* push incoming packets up the stack. We do this by defining this
|
||||
* driver as our RDC. We then drop everything
|
||||
*
|
||||
* \author
|
||||
* George Oikonomou - <oikonomou@users.sourceforge.net>
|
||||
*/
|
||||
|
||||
#include "net/mac/mac.h"
|
||||
#include "net/mac/rdc.h"
|
||||
/*---------------------------------------------------------------------------*/
|
||||
static void
|
||||
send(mac_callback_t sent, void *ptr)
|
||||
{
|
||||
if(sent) {
|
||||
sent(ptr, MAC_TX_OK, 1);
|
||||
}
|
||||
}
|
||||
/*---------------------------------------------------------------------------*/
|
||||
static void
|
||||
send_list(mac_callback_t sent, void *ptr, struct rdc_buf_list *list)
|
||||
{
|
||||
if(sent) {
|
||||
sent(ptr, MAC_TX_OK, 1);
|
||||
}
|
||||
}
|
||||
/*---------------------------------------------------------------------------*/
|
||||
static void
|
||||
input(void)
|
||||
{
|
||||
}
|
||||
/*---------------------------------------------------------------------------*/
|
||||
static int
|
||||
on(void)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
/*---------------------------------------------------------------------------*/
|
||||
static int
|
||||
off(int keep_radio_on)
|
||||
{
|
||||
return keep_radio_on;
|
||||
}
|
||||
/*---------------------------------------------------------------------------*/
|
||||
static unsigned short
|
||||
cca(void)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
/*---------------------------------------------------------------------------*/
|
||||
static void
|
||||
init(void)
|
||||
{
|
||||
}
|
||||
/*---------------------------------------------------------------------------*/
|
||||
const struct rdc_driver stub_rdc_driver = {
|
||||
"stub-rdc",
|
||||
init,
|
||||
send,
|
||||
send_list,
|
||||
input,
|
||||
on,
|
||||
off,
|
||||
cca,
|
||||
};
|
||||
/*---------------------------------------------------------------------------*/
|
Loading…
Add table
Add a link
Reference in a new issue