sniffer.h

Go to the documentation of this file.
00001 /* Copyright (c) 2007 Axel Wachtler
00002    All rights reserved.
00003 
00004    Redistribution and use in source and binary forms, with or without
00005    modification, are permitted provided that the following conditions
00006    are met:
00007 
00008    * Redistributions of source code must retain the above copyright
00009      notice, this list of conditions and the following disclaimer.
00010    * Redistributions in binary form must reproduce the above copyright
00011      notice, this list of conditions and the following disclaimer in the
00012      documentation and/or other materials provided with the distribution.
00013    * Neither the name of the authors nor the names of its contributors
00014      may be used to endorse or promote products derived from this software
00015      without specific prior written permission.
00016 
00017    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
00018    AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
00019    IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
00020    ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
00021    LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
00022    CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
00023    SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
00024    INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
00025    CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
00026    ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
00027    POSSIBILITY OF SUCH DAMAGE. */
00028 
00029 /* $Id: sniffer_8h_source.html,v 1.1.1.4 2013/04/09 21:11:58 awachtler Exp $ */
00038 /* === includes ============================================================ */
00039 #include <avr/pgmspace.h>
00040 #include <string.h>
00041 #include <stdint.h>
00042 #include <stdlib.h>
00043 
00044 #include <stdbool.h>
00045 #include <util/crc16.h>
00046 #include <avr/interrupt.h>
00047 #include "transceiver.h"
00048 #include "ioutil.h"
00049 #include "timer.h"
00050 #ifndef SNIFFER_H
00051 #define SNIFFER_H
00052 
00053 /* === macros ============================================================== */
00054 
00055 #define SCAN_PERIOD_MS  (2000)
00056 #define NL "\n"
00057 #define CHANNEL_OFFSET(x)  (x > TRX_MAX_CHANNEL ? TRX_MIN_CHANNEL : (x - TRX_MIN_CHANNEL))
00058 #define CHANNEL_MAX_OFFSET (TRX_NB_CHANNELS-1)
00059 #define VERSION "0.1"
00060 
00064 #define CHANNEL_NEXT_CIRCULAR(x) \
00065     do \
00066     { \
00067         (x)++; \
00068         if ((x) > TRX_MAX_CHANNEL) \
00069         { \
00070             (x) = TRX_MIN_CHANNEL; \
00071         } \
00072     } \
00073     while(0)
00074 
00075 
00076 #ifndef MAX_PACKET_BUFFERS
00077 # define MAX_PACKET_BUFFERS (8)
00078 #endif
00079 /* === types =============================================================== */
00083 typedef enum
00084 {
00086     IDLE,
00088     EDSCAN,
00090     SCAN,
00092     SCAN_DONE,
00094     SNIFF
00095 } SHORTENUM sniffer_state_t;
00096 
00100 typedef struct scan_result_tag
00101 {
00103     uint16_t framecnt;
00105     uint16_t crc_ok;
00106     uint16_t edsum;
00107     uint16_t lqisum;
00108     uint16_t ftypes[8];
00109 } scan_result_t;
00110 
00115 typedef struct sniffer_context_tag
00116 {
00118     volatile sniffer_state_t state;
00120     channel_t cchan;
00122     uint8_t cpage;
00124     uint32_t cmask;
00125 
00127     bool chkcrc;
00128 
00130     timer_hdl_t     thdl;
00132     time_t          scanper;
00134     scan_result_t   scanres[TRX_NB_CHANNELS];
00135     uint8_t         scanres_reset;
00136     uint16_t frames;
00137     uint16_t irq_ur;
00138     uint16_t missed_frames;
00139 } sniffer_context_t;
00140 
00141 typedef struct pcap_packet_tag
00142 {
00144     uint8_t len;
00146     time_stamp_t ts;
00148     uint8_t frame[MAX_FRAME_SIZE];
00149 } pcap_packet_t;
00150 
00151 
00152 typedef struct pcap_pool_tag
00153 {
00154     volatile uint8_t ridx;
00155     volatile uint8_t widx;
00156     pcap_packet_t packet[MAX_PACKET_BUFFERS];
00157 } pcap_pool_t;
00158 
00159 
00160 /* === externals =========================================================== */
00161 extern sniffer_context_t ctx;
00162 
00163 /* === inline functions ==================================================== */
00164 
00168 static inline void scan_update_frame(uint8_t flen, bool crc_ok, uint8_t lqi, uint8_t ed, uint8_t *rxbuf)
00169 {
00170 scan_result_t *scres;
00171 
00172      scres = &ctx.scanres[(ctx.cchan - TRX_MIN_CHANNEL)];
00173      scres->framecnt ++;
00174      scres->edsum +=ed;
00175      scres->lqisum += lqi;
00176 
00177      if (flen < 0x80)
00178      {
00179          /* process valid frame length */
00180          if (crc_ok == true)
00181          {
00182              scres->crc_ok++;
00183              scres->ftypes[rxbuf[0]&7] ++;
00184          }
00185          /* parse beacon */
00186      }
00187 }
00188 
00189 
00190 
00191 /* === prototypes ========================================================== */
00192 #ifdef __cplusplus
00193 extern "C" {
00194 #endif
00195 
00202 void sniffer_start(sniffer_state_t state);
00203 void sniffer_stop(void);
00204 void ctrl_process_input(void);
00205 void scan_init(void);
00206 void scan_continue(void);
00207 #ifdef __cplusplus
00208 } /* extern "C" */
00209 #endif
00210 
00211 #endif  /* #ifndef SNIFFER_H */

This documentation for µracoli was generated on Tue Apr 9 2013 by  doxygen 1.7.1