/*
This file is part of Wi-viz (http://wiviz.natetrue.com).

Wi-viz is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License v2 as published by
the Free Software Foundation.

Wi-viz is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with Wi-viz; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
*/
//Structure definitions for wireless packets

#define MAX_HOSTS 257

#ifdef DEFINE_TYPES
typedef unsigned short u_short;
typedef unsigned char u_char;
typedef unsigned int u_int;
#endif

typedef enum {
  mgt_assocRequest = 0,
  mgt_assocResponse = 1,
  mgt_reassocRequest = 2,
  mgt_reassocResponse = 3,
  mgt_probeRequest = 4,
  mgt_probeResponse = 5,
  mgt_beacon = 8,
  mgt_disassoc = 10,
  mgt_auth = 11,
  mgt_deauth = 12
  } wifi_frametype;

typedef struct ieee802_11_hdr {
  u_char frame_control;
  u_char flags;
#define IEEE80211_TO_DS 0x01
#define IEEE80211_FROM_DS 0x02
#define IEEE80211_MORE_FRAG 0x04
#define IEEE80211_RETRY 0x08
#define IEEE80211_PWR_MGT 0x10
#define IEEE80211_MORE_DATA 0x20
#define IEEE80211_WEP_FLAG 0x40
#define IEEE80211_ORDER_FLAG 0x80
  u_short duration;
  u_char addr1[6];
  u_char addr2[6];
  u_char addr3[6];
  u_short frag_and_seq;
  } ieee802_11_hdr;

typedef struct {
  u_char timestamp[8];
  u_short bcn_interval;
  u_short caps;
#define MGT_CAPS_AP 0x1
#define MGT_CAPS_IBSS 0x2
#define MGT_CAPS_WEP 0x10
  } ieee_802_11_mgt_frame;

typedef struct {
  u_char tag;
  u_char length;
  } ieee_802_11_tag;

typedef enum {
  tagSSID = 0,
  tagRates = 1,
  tagChannel = 3,
  tagVendorSpecific = 0xDD
  } i81tag;

typedef struct prism_hdr {
  u_int msg_code;
  u_int msg_length;
  char cap_device[16];
  //char dids[0];
  } prism_hdr;

typedef struct prism_did {
  u_short did;
  u_short status1;
  u_short status2;
  u_short length;
  //int value[0];
  } prism_did;

typedef enum prism_did_num {
  pdn_host_time = 0x1041,
  pdn_mac_time = 0x2041,
  pdn_rssi = 0x4041,
  pdn_sq = 0x5041,
  pdn_datarate = 0x8041,
  pdn_framelen = 0xa041
  } prism_did_num;



//Structure definitions for data collection

typedef enum {
  typeUnknown,
  typeAP,
  typeSta,
  typeAdhocHub
  } host_type;

typedef enum {
  ssUnknown,
  ssUnassociated,
  ssAssociated
  } sta_state;

typedef enum {
  aetUnknown,
  aetUnencrypted,
  aetEncUnknown,
  aetEncWEP,
  aetEncWPA
  } ap_enc_type;

typedef struct {
  u_char bssid[6];
  char * ssid[32];
  u_char ssidlen;
  u_char channel;
  u_short flags;
  ap_enc_type encryption;
  } ap_info;

typedef struct {
  sta_state state;
  u_char connectedBSSID[6];
  } sta_info;

typedef struct {
  u_char occupied;
  u_char mac[6];
  host_type type;
  time_t lastSeen;
  int RSSI;
  ap_info * apInfo;
  sta_info * staInfo;
  } wiviz_host;

//Primary config struct
typedef struct {
  wiviz_host hosts[MAX_HOSTS];
  int numHosts;
  int readFromWl;
  time_t lastKeepAlive;
  int channelHopping;
  int channelDwellTime;
  int channelHopSeq[14];
  int channelHopSeqLen;
  int curChannel;
  int channelHopperPID;
  } wiviz_cfg;