owlps/libowlps/owlps.h

308 lines
9.0 KiB
C

/*
* This file is part of the rtap localisation project.
*/
#ifndef _LIBOWLPS_H_
#define _LIBOWLPS_H_
#ifdef __cplusplus
extern "C" {
#endif // __cplusplus
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <inttypes.h>
#include <pthread.h>
#include <time.h>
#include <sys/types.h>
#include <math.h>
#include <signal.h>
#include <errno.h>
#include <fcntl.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <net/if.h>
#include <sys/ioctl.h>
#include <iwlib.h>
#include <wireless.h>
// Port on which the positioning request is sent by the mobile:
#define LOC_REQUEST_DEFAULT_PORT 9900
// Port on which listeners and aggregator communicate:
#define AGGREGATE_DEFAULT_PORT 9901
// Port on which aggregator and positioning server communicate:
#define POSITIONER_DEFAULT_PORT 9902
// Port on which autocalibration requests are sent by the listeners:
#define DEFAULT_AUTOCALIBRATION_REQUEST_PORT 9903
// Port on which the aggregator listens for hello messages from the
// listeners, and the listeners listen for orders from the aggregator:
#define DEFAULT_AUTOCALIBRATION_PORT 9904
// Port on which the mobile listens for its position:
#define MOBILE_DEFAULT_PORT 9910
/* Boolean type */
typedef enum {FALSE, TRUE} owl_bool ;
#define OWL_BOOL_TO_STRING(B) ((B) ? "true" : "false")
/* Direction type */
enum {NORTH = 1, EAST, SOUTH, WEST} ;
#define OWL_DIRECTION_MIN 1
#define OWL_DIRECTION_MAX 4
typedef uint8_t owl_direction ;
/* Timestamp type (struct timespec clone with fix-sized fields) */
typedef struct _owl_timestamp
{
uint32_t tv_sec ;
uint32_t tv_nsec ;
} owl_timestamp ;
// Length of a owl_timestamp when converted to string:
#define OWL_TIMESTAMP_STR_LEN 22 // 22 = 10 digits, '.', 10 digits, '\0'
/* Message sent by the listener to the aggregator */
typedef struct _owl_captured_request
{
uint8_t type ; // Type of the captured request
uint8_t ap_mac_addr_bytes[ETHER_ADDR_LEN] ; // MAC of the listener
uint8_t mobile_mac_addr_bytes[ETHER_ADDR_LEN] ; // MAC of the mobile
uint8_t mobile_ip_addr_bytes[4] ; // IP of the mobile
owl_timestamp request_time ; // Request ID (timestamp on the mobile)
owl_timestamp start_time ; // Timestamp of arrival on the listener
uint8_t antenna_signal_dbm ; // Signal strength measured by the listener
/* Calibration data */
float x_position ;
float y_position ;
float z_position ;
owl_direction direction ;
} owl_captured_request ;
/* Message sent by the aggregator to the positioning server containing
* the main data of a request */
typedef struct _owl_request
{
uint8_t type ; // Type of the request
uint8_t mobile_mac_addr_bytes[ETHER_ADDR_LEN] ; // MAC of the mobile
owl_timestamp request_time ; // Request ID (timestamp on the mobile)
uint16_t nb_info ; // Number of (listener MAC;signal strength) couples
} owl_request ;
/* Message sent by the aggregator to the positioning server refering to
* a request, indicating that an AP received the request with a given
* signal strength */
typedef struct _owl_request_info
{
uint8_t ap_mac_addr_bytes[ETHER_ADDR_LEN] ; // MAC of the listener
uint8_t antenna_signal_dbm ; // Signal strength measured by the listener
} owl_request_info ;
/* Hello message sent by the listener to the aggregator */
typedef struct _owl_autocalibration_hello
{
uint8_t ap_mac_addr_bytes[ETHER_ADDR_LEN] ;
} owl_autocalibration_hello ;
/* Message sent to the listener to order an emission */
#define AUTOCALIBRATION_ORDER_SEND 1
typedef struct _owl_autocalibration_order
{
uint8_t order ;
} owl_autocalibration_order ;
/* Positioning request types */
#define OWL_REQUEST_NORMAL 0
#define OWL_REQUEST_CALIBRATION 1
#define OWL_REQUEST_AUTOCALIBRATION 2
#define OWL_REQUEST_IMPLICIT 10
/* Wi-Fi channel frequencies in Hz */
#define CHANNEL_1 2412
#define CHANNEL_2 2417
#define CHANNEL_3 2422
#define CHANNEL_4 2427
#define CHANNEL_5 2432
#define CHANNEL_6 2437
#define CHANNEL_7 2442
#define CHANNEL_8 2447
#define CHANNEL_9 2452
#define CHANNEL_10 2457
#define CHANNEL_11 2462
#define CHANNEL_12 2467
#define CHANNEL_13 2472
#define CHANNEL_14 2477
/* Packet header sizes (in bytes) */
#define IEEE80211_HEADER_SIZE_DATA 24 // Header size for a Data frame
#define LLC_HEADER_SIZE 8
/* IEEE 802.11 frame types */
// Beacon (TODO: convert to mask)
#define RAW_PACKET_TYPE_BEACON 0x80
// Data frame
#define FRAME_TYPE_DATA_MASK 0x08
#define IS_DATA_FRAME(FC1) \
(((FC1) & FRAME_TYPE_DATA_MASK) == FRAME_TYPE_DATA_MASK)
// QoS Data frame
#define FRAME_SUBTYPE_QOS_MASK 0x80
#define DATA_FRAME_IS_QOS(FC1) \
(((FC1) & FRAME_SUBTYPE_QOS_MASK) == FRAME_SUBTYPE_QOS_MASK)
// To/From DS
#define FRAME_FROM_STA_MASK 0x02
#define IS_FRAME_FROM_STA(FC2) \
(((FC2) & FRAME_FROM_STA_MASK) != FRAME_FROM_STA_MASK)
/* Positions of the radiotap header fixed fields (in bytes) */
#define RTAP_P_HREVISION 0 // Header revision
#define RTAP_P_HPAD 1 // Header pad
#define RTAP_P_HLENGTH 2 // Header length
#define RTAP_P_PRESENTFLAGS 4 // Present flags
/* Radiotap field lengths (in bytes) */
#define RTAP_L_HREVISION 1 // Header revision
#define RTAP_L_HPAD 1 // Header pad
#define RTAP_L_HLENGTH 2 // Header length
#define RTAP_L_PRESENTFLAGS 4 // Present flags
#define RTAP_L_MACTS 8 // MAC timestamp (Time Synchronization Function Timer)
#define RTAP_L_FLAGS 1 // autre champ de flags
#define RTAP_L_RATE 1 // Data rate
#define RTAP_L_CHANNEL 2 // Channel frequency
#define RTAP_L_CHANNELTYPE 2 // Channel type
#define RTAP_L_ANTENNASIGNALDBM 1 // SSI signal (dBm)
#define RTAP_L_ANTENNANOISEDBM 1 // SSI noise (dBm)
#define RTAP_L_ANTENNA 1 // Antenna number
#define RTAP_L_FHSS 2 // Hop set and pattern for Frequency-Hopping Spread Spectrum
#define RTAP_L_LOCKQUALITY 2 // Signal quality
#define RTAP_L_TXATTENUATION 2 // Transmit power from max power
#define RTAP_L_TXATTENUATIONDB 2 // Idem (dB)
#define RTAP_L_TXATTENUATIONDBM 1 // Idem (dBm)
#define RTAP_L_ANTENNASIGNALDB 1 // SSI signal (dB)
#define RTAP_L_ANTENNANOISEDB 1 // SSI noise (dB)
#define RTAP_L_FCS 4 // Frame Check Sequence
//#define RTAP_L_CHANNELP // Extended channel info (not implemented)
//#define RTAP_L_EXT // Extension aux Present flags (not emplemented)
/* Positions in 'Present flags' (and present fields 'check' array) */
#define RTAP_MACTS 0
#define RTAP_FLAGS 1
#define RTAP_RATE 2
#define RTAP_CHANNEL 3 // and RTAP_CHANNELTYPE
#define RTAP_FHSS 4
#define RTAP_ANTENNASIGNALDBM 5
#define RTAP_ANTENNANOISEDBM 6
#define RTAP_LOCKQUALITY 7
#define RTAP_TXATTENUATION 8
#define RTAP_TXATTENUATIONDB 9
#define RTAP_TXATTENUATIONDBM 10
#define RTAP_ANTENNA 11
#define RTAP_ANTENNASIGNALDB 12
#define RTAP_ANTENNANOISEDB 13
#define RTAP_FCS 14
//#define RTAP_CHANNELP 18
//#define RTAP_EXT 31
/* Misc. */
// Length of a MAC address in string format (including '\0')
#define OWL_ETHER_ADDR_STRLEN 18
/* Global variables */
extern owl_bool run ;
/* Function error codes */
#define ERR_SETTING_MODE 101
#define ERR_SETTING_CHANNEL 102
#define ERR_READING_CHANNEL 103
#define ERR_READING_MODE 104
#define ERR_BAD_SIGNAL 111
/* Function headers */
// Misc
const char* owl_mac_bytes_to_string(uint8_t *mac_binary) ;
void owl_mac_bytes_to_string_r(uint8_t *mac_binary,
char mac_str[OWL_ETHER_ADDR_STRLEN]) ;
owl_bool owl_mac_equals(uint8_t *mac1, uint8_t *mac2) ;
uint_fast8_t owl_frequency_to_channel(uint_fast16_t channel) ;
// Time
int owl_timestamp_now(owl_timestamp *now) ;
owl_timestamp owl_timespec_to_timestamp(const struct timespec d) ;
owl_timestamp owl_timeval_to_timestamp(const struct timeval d) ;
void owl_timestamp_to_string(char *dst, owl_timestamp src) ;
owl_bool owl_timestamp_equals(owl_timestamp d1, owl_timestamp d2) ;
owl_bool owl_timestamp_is_null(owl_timestamp d) ;
uint64_t owl_timestamp_to_ms(owl_timestamp date) ;
uint_fast32_t owl_time_elapsed_ms(const owl_timestamp d1,
const owl_timestamp d2) ;
owl_timestamp owl_time_elapsed(const owl_timestamp d1,
const owl_timestamp d2) ;
owl_timestamp owl_hton_timestamp(owl_timestamp date) ;
owl_timestamp owl_ntoh_timestamp(owl_timestamp date) ;
// Network
int owl_create_udp_trx_socket(char *server_address,
uint_fast16_t server_port,
struct sockaddr_in *server_description,
struct sockaddr_in *client_description) ;
int owl_create_udp_listening_socket(uint_fast16_t port) ;
int owl_iface_mode_monitor(char *iface) ;
int owl_iface_set_channel(char *iface, uint_fast8_t channel) ;
int owl_iface_channel_hop(char *iface) ;
// Signals
void owl_sigint_handler(int num) ;
void owl_sigterm_handler(int num) ;
// Threads
void owl_close_fd(void *fd) ;
void owl_close_file(void *file) ;
/* Macros */
/*
* Test if a IEEE 802.11 frame is a retry.
* Input: IEEE 802.11 header flags.
* Returns 0 if the Retry bit is absent, a positive value if present.
*/
#define IS_RETRY(IEEE80211_FLAGS) ((IEEE80211_FLAGS) & 0x08)
#ifdef __cplusplus
}
#endif // __cplusplus
#endif // _LIBOWLPS_H_