[Listener] Send coordinates in autocalib. requests
One can now provide the coordinates of the listener on the command line.
This commit is contained in:
parent
c1f4c4e77e
commit
d1c6abdaf7
3
TODO
3
TODO
|
@ -39,9 +39,6 @@
|
|||
|
||||
* Listener
|
||||
|
||||
- Send coordinates in autocalibration requests
|
||||
The listener should be able to know its own position and transmit
|
||||
it in autocalibration requests.
|
||||
- read_packet(): use ieee80211_header_size for all implicit packets
|
||||
Currently the size is corrected only for data packets.
|
||||
- Fix segfault when rtap_iface is not in monitor mode (?) on Foneras.
|
||||
|
|
|
@ -63,6 +63,8 @@ enum {MODE_ACTIVE = 'a', MODE_PASSIVE = 'p', MODE_MIXED = 'm'} ;
|
|||
void initialise_configuration(int argc, char **argv) ;
|
||||
void parse_config_file(int argc, char **argv) ;
|
||||
void parse_command_line(int argc, char **argv) ;
|
||||
void parse_main_options(int argc, char **argv) ;
|
||||
void parse_calibration_data(int argc, char **argv) ;
|
||||
void check_configuration(void) ;
|
||||
#ifdef DEBUG
|
||||
void print_configuration(void) ;
|
||||
|
@ -157,6 +159,22 @@ void print_version(void) ;
|
|||
(cfg_setint(cfg, "autocalibration_nb_packets", (NBPKT)))
|
||||
#define GET_AUTOCALIBRATION_NBPKT() \
|
||||
(cfg_getint(cfg, "autocalibration_nb_packets"))
|
||||
#define SET_MY_DIRECTION(DIRECTION) \
|
||||
(cfg_setint(cfg, "my_direction", (DIRECTION)))
|
||||
#define GET_MY_DIRECTION() \
|
||||
(cfg_getint(cfg, "my_direction"))
|
||||
#define SET_MY_POSITION_X(POSITION) \
|
||||
(cfg_setfloat(cfg, "my_position_x", (POSITION)))
|
||||
#define GET_MY_POSITION_X() \
|
||||
(cfg_getfloat(cfg, "my_position_x"))
|
||||
#define SET_MY_POSITION_Y(POSITION) \
|
||||
(cfg_setfloat(cfg, "my_position_y", (POSITION)))
|
||||
#define GET_MY_POSITION_Y() \
|
||||
(cfg_getfloat(cfg, "my_position_y"))
|
||||
#define SET_MY_POSITION_Z(POSITION) \
|
||||
(cfg_setfloat(cfg, "my_position_z", (POSITION)))
|
||||
#define GET_MY_POSITION_Z() \
|
||||
(cfg_getfloat(cfg, "my_position_z"))
|
||||
#endif // USE_PTHREAD
|
||||
|
||||
#define SET_VERBOSE() \
|
||||
|
@ -234,6 +252,22 @@ void print_version(void) ;
|
|||
(options.autocalibration_nb_packets = (NBPKT))
|
||||
#define GET_AUTOCALIBRATION_NBPKT() \
|
||||
(options.autocalibration_nb_packets)
|
||||
#define SET_MY_DIRECTION(DIRECTION) \
|
||||
(options.my_direction = (DIRECTION))
|
||||
#define GET_MY_DIRECTION() \
|
||||
(options.my_direction)
|
||||
#define SET_MY_POSITION_X(POSITION) \
|
||||
(options.my_position_x = (POSITION))
|
||||
#define GET_MY_POSITION_X() \
|
||||
(options.my_position_x)
|
||||
#define SET_MY_POSITION_Y(POSITION) \
|
||||
(options.my_position_y = (POSITION))
|
||||
#define GET_MY_POSITION_Y() \
|
||||
(options.my_position_y)
|
||||
#define SET_MY_POSITION_Z(POSITION) \
|
||||
(options.my_position_z = (POSITION))
|
||||
#define GET_MY_POSITION_Z() \
|
||||
(options.my_position_z)
|
||||
#endif // USE_PTHREAD
|
||||
|
||||
#define SET_VERBOSE() \
|
||||
|
|
|
@ -28,6 +28,8 @@
|
|||
#include <netinet/udp.h>
|
||||
#include <netinet/ip.h>
|
||||
|
||||
#include <assert.h>
|
||||
|
||||
|
||||
char *program_name = NULL ;
|
||||
uint8_t my_mac_bytes[ETHER_ADDR_LEN] ; // AP MAC address
|
||||
|
@ -36,8 +38,13 @@ char my_ip[INET_ADDRSTRLEN] ; // AP IP address
|
|||
pcap_t *capture_handler = NULL ; // Packet capture descriptor
|
||||
int aggregation_sockfd ;
|
||||
struct sockaddr_in aggregation_server ;
|
||||
|
||||
#ifdef USE_PTHREAD
|
||||
int autocalibration_send_sockfd ;
|
||||
struct sockaddr_in autocalibration_send_server ;
|
||||
// TRUE if the coordinates of the listener were provided by the user:
|
||||
owl_bool coordinates_provided = FALSE ;
|
||||
#endif // USE_PTHREAD
|
||||
|
||||
#ifdef USE_CONFIG_FILE
|
||||
cfg_t *cfg ; // Configuration structure
|
||||
|
@ -64,6 +71,10 @@ struct {
|
|||
uint_fast32_t autocalibration_hello_delay ;
|
||||
uint_fast32_t autocalibration_delay ;
|
||||
uint_fast16_t autocalibration_nb_packets ;
|
||||
owl_direction my_direction ;
|
||||
float my_position_x ;
|
||||
float my_position_y ;
|
||||
float my_position_z ;
|
||||
#endif // USE_PTHREAD
|
||||
owl_bool verbose ;
|
||||
owl_bool display_captured ;
|
||||
|
@ -85,6 +96,7 @@ struct {
|
|||
DEFAULT_AUTOCALIBRATION_HELLO_DELAY,
|
||||
DEFAULT_AUTOCALIBRATION_DELAY,
|
||||
DEFAULT_AUTOCALIBRATION_NBPKT,
|
||||
0, 0, 0, 0,
|
||||
#endif // USE_PTHREAD
|
||||
FALSE,
|
||||
FALSE
|
||||
|
@ -278,6 +290,14 @@ void parse_config_file(int argc, char **argv)
|
|||
// Number of packets for a calibration request:
|
||||
CFG_INT("autocalibration_nb_packets",
|
||||
DEFAULT_AUTOCALIBRATION_NBPKT, CFGF_NONE),
|
||||
// Direction
|
||||
CFG_INT("my_direction", 0, CFGF_NONE),
|
||||
// Position X
|
||||
CFG_FLOAT("my_position_x", 0, CFGF_NONE),
|
||||
// Position Y
|
||||
CFG_FLOAT("my_position_y", 0, CFGF_NONE),
|
||||
// Position Z
|
||||
CFG_FLOAT("my_position_z", 0, CFGF_NONE),
|
||||
#endif // USE_PTHREAD
|
||||
// Be verbose, or not:
|
||||
CFG_BOOL("verbose", cfg_false, CFGF_NONE),
|
||||
|
@ -347,6 +367,14 @@ void parse_config_file(int argc, char **argv)
|
|||
|
||||
|
||||
void parse_command_line(int argc, char **argv)
|
||||
{
|
||||
parse_main_options(argc, argv) ;
|
||||
parse_calibration_data(argc, argv) ;
|
||||
}
|
||||
|
||||
|
||||
|
||||
void parse_main_options(int argc, char **argv)
|
||||
{
|
||||
int opt ;
|
||||
|
||||
|
@ -450,6 +478,29 @@ void parse_command_line(int argc, char **argv)
|
|||
|
||||
|
||||
|
||||
void parse_calibration_data(int argc, char **argv)
|
||||
{
|
||||
/* Parse remaining arguments (possible calibration data) */
|
||||
if (argc - optind != 0)
|
||||
{
|
||||
if (argc - optind == 4)
|
||||
{
|
||||
coordinates_provided = TRUE ;
|
||||
SET_MY_DIRECTION(strtoul(argv[optind++], NULL, 0)) ;
|
||||
SET_MY_POSITION_X(strtod(argv[optind++], NULL)) ;
|
||||
SET_MY_POSITION_Y(strtod(argv[optind++], NULL)) ;
|
||||
SET_MY_POSITION_Z(strtod(argv[optind], NULL)) ;
|
||||
}
|
||||
else // Bad number of arguments
|
||||
{
|
||||
print_usage() ;
|
||||
exit(ERR_BAD_USAGE) ;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
void check_configuration()
|
||||
{
|
||||
switch (GET_MODE())
|
||||
|
@ -481,24 +532,6 @@ void check_configuration()
|
|||
SET_WIFI_IFACE(GET_RTAP_IFACE()) ;
|
||||
}
|
||||
|
||||
#ifdef USE_PTHREAD
|
||||
if (GET_AUTOCALIBRATION())
|
||||
{
|
||||
if (GET_AUTOCALIBRATION_IP()[0] == '\0')
|
||||
{
|
||||
if (GET_VERBOSE())
|
||||
fprintf(stderr, "No autocalibration IP specified, we will"
|
||||
" use the aggregation IP as the destination of"
|
||||
" autocalibration requests.\n") ;
|
||||
SET_AUTOCALIBRATION_IP(GET_AGGREGATION_IP()) ;
|
||||
}
|
||||
if (GET_AUTOCALIBRATION_NBPKT() < 1)
|
||||
fprintf(stderr, "Warning! autocalibration_nb_packets is null,"
|
||||
" no autocalibration request will be sent!\n") ;
|
||||
}
|
||||
|
||||
#endif // USE_PTHREAD
|
||||
|
||||
// Port numbers //
|
||||
if (GET_AGGREGATION_PORT() < 1 || GET_AGGREGATION_PORT() > 65535)
|
||||
{
|
||||
|
@ -514,22 +547,47 @@ void check_configuration()
|
|||
" failing back to the default value.\n") ;
|
||||
SET_LISTENING_PORT(LOC_REQUEST_DEFAULT_PORT) ;
|
||||
}
|
||||
|
||||
// Autocalibration stuff //
|
||||
#ifdef USE_PTHREAD
|
||||
if (GET_AUTOCALIBRATION_REQUEST_PORT() < 1 ||
|
||||
GET_AUTOCALIBRATION_REQUEST_PORT() > 65535)
|
||||
if (GET_AUTOCALIBRATION())
|
||||
{
|
||||
if (GET_VERBOSE())
|
||||
fprintf(stderr, "Warning! Bad autocalibration_request_port:"
|
||||
" failing back to the default value.\n") ;
|
||||
SET_AUTOCALIBRATION_REQUEST_PORT(DEFAULT_AUTOCALIBRATION_REQUEST_PORT) ;
|
||||
}
|
||||
if (GET_AUTOCALIBRATION_PORT() < 1 ||
|
||||
GET_AUTOCALIBRATION_PORT() > 65535)
|
||||
{
|
||||
if (GET_VERBOSE())
|
||||
fprintf(stderr, "Warning! Bad autocalibration_port:"
|
||||
" failing back to the default value.\n") ;
|
||||
SET_AUTOCALIBRATION_PORT(DEFAULT_AUTOCALIBRATION_PORT) ;
|
||||
if (GET_AUTOCALIBRATION_IP()[0] == '\0')
|
||||
{
|
||||
if (GET_VERBOSE())
|
||||
fprintf(stderr, "No autocalibration IP specified, we will"
|
||||
" use the aggregation IP as the destination of"
|
||||
" autocalibration requests.\n") ;
|
||||
SET_AUTOCALIBRATION_IP(GET_AGGREGATION_IP()) ;
|
||||
}
|
||||
|
||||
if (GET_AUTOCALIBRATION_NBPKT() < 1)
|
||||
fprintf(stderr, "Warning! autocalibration_nb_packets is null,"
|
||||
" no autocalibration request will be sent!\n") ;
|
||||
|
||||
if (coordinates_provided)
|
||||
if (GET_MY_DIRECTION() < OWL_DIRECTION_MIN ||
|
||||
GET_MY_DIRECTION() > OWL_DIRECTION_MAX)
|
||||
fprintf(stderr, "Warning! « %d » is not a valid"
|
||||
" direction.\n", (int) GET_MY_DIRECTION()) ;
|
||||
|
||||
// Autocalibration port numbers
|
||||
if (GET_AUTOCALIBRATION_REQUEST_PORT() < 1 ||
|
||||
GET_AUTOCALIBRATION_REQUEST_PORT() > 65535)
|
||||
{
|
||||
if (GET_VERBOSE())
|
||||
fprintf(stderr, "Warning! Bad autocalibration_request_port:"
|
||||
" failing back to the default value.\n") ;
|
||||
SET_AUTOCALIBRATION_REQUEST_PORT(DEFAULT_AUTOCALIBRATION_REQUEST_PORT) ;
|
||||
}
|
||||
if (GET_AUTOCALIBRATION_PORT() < 1 ||
|
||||
GET_AUTOCALIBRATION_PORT() > 65535)
|
||||
{
|
||||
if (GET_VERBOSE())
|
||||
fprintf(stderr, "Warning! Bad autocalibration_port:"
|
||||
" failing back to the default value.\n") ;
|
||||
SET_AUTOCALIBRATION_PORT(DEFAULT_AUTOCALIBRATION_PORT) ;
|
||||
}
|
||||
}
|
||||
#endif // USE_PTHREAD
|
||||
}
|
||||
|
@ -559,6 +617,10 @@ void print_configuration()
|
|||
"autocalibration_hello_delay = %"PRIuFAST32"\n"
|
||||
"autocalibration_delay = %"PRIuFAST32"\n"
|
||||
"autocalibration_nb_packets = %"PRIuFAST16"\n"
|
||||
"my_direction = %"PRIu8"\n"
|
||||
"my_position_x = %f\n"
|
||||
"my_position_y = %f\n"
|
||||
"my_position_z = %f\n"
|
||||
#endif // USE_PTHREAD
|
||||
"verbose = %s\n"
|
||||
"display_captured = %s\n"
|
||||
|
@ -578,6 +640,10 @@ void print_configuration()
|
|||
GET_AUTOCALIBRATION_HELLO_DELAY(),
|
||||
GET_AUTOCALIBRATION_DELAY(),
|
||||
GET_AUTOCALIBRATION_NBPKT(),
|
||||
GET_MY_DIRECTION(),
|
||||
GET_MY_POSITION_X(),
|
||||
GET_MY_POSITION_Y(),
|
||||
GET_MY_POSITION_Z(),
|
||||
#endif // USE_PTHREAD
|
||||
OWL_BOOL_TO_STRING(GET_VERBOSE()),
|
||||
OWL_BOOL_TO_STRING(GET_DISPLAY_CAPTURED())
|
||||
|
@ -823,6 +889,21 @@ void read_packet(u_char *args, const struct pcap_pkthdr *header,
|
|||
printf(".. on the wrong port!") ;
|
||||
putchar('\n') ;
|
||||
}
|
||||
request.direction =
|
||||
packet[rtap_bytes + ieee80211_header_size + LLC_HEADER_SIZE
|
||||
+ sizeof(struct iphdr) + sizeof(struct udphdr) + 9];
|
||||
memcpy(&request.x_position,
|
||||
&packet[rtap_bytes + ieee80211_header_size
|
||||
+ LLC_HEADER_SIZE + sizeof(struct iphdr)
|
||||
+ sizeof(struct udphdr) + 10], sizeof(float)) ;
|
||||
memcpy(&request.y_position,
|
||||
&packet[rtap_bytes + ieee80211_header_size
|
||||
+ LLC_HEADER_SIZE + sizeof(struct iphdr)
|
||||
+ sizeof(struct udphdr) + 14], sizeof(float)) ;
|
||||
memcpy(&request.z_position,
|
||||
&packet[rtap_bytes + ieee80211_header_size
|
||||
+ LLC_HEADER_SIZE + sizeof(struct iphdr)
|
||||
+ sizeof(struct udphdr) + 18], sizeof(float)) ;
|
||||
break ;
|
||||
|
||||
default :
|
||||
|
@ -1183,7 +1264,12 @@ uint_fast16_t make_packet(uint8_t **packet)
|
|||
{
|
||||
uint8_t *pkt ;
|
||||
uint_fast16_t size ; // Packet size
|
||||
uint_fast16_t offset ; // Index used to create the packet
|
||||
owl_timestamp request_time ;
|
||||
float
|
||||
my_position_x = GET_MY_POSITION_X(),
|
||||
my_position_y = GET_MY_POSITION_Y(),
|
||||
my_position_z = GET_MY_POSITION_Z() ;
|
||||
|
||||
owl_timestamp_now(&request_time) ;
|
||||
|
||||
|
@ -1196,11 +1282,29 @@ uint_fast16_t make_packet(uint8_t **packet)
|
|||
|
||||
request_time = owl_hton_timestamp(request_time) ;
|
||||
|
||||
size = sizeof(char) + sizeof(owl_timestamp) ;
|
||||
offset = 0 ;
|
||||
size =
|
||||
sizeof(uint8_t) * 2 + sizeof(owl_timestamp) + sizeof(float) * 3 ;
|
||||
pkt = malloc(size) ;
|
||||
|
||||
memset(&pkt[0], OWL_REQUEST_AUTOCALIBRATION, 1) ; // Packet type
|
||||
memcpy(&pkt[1], &request_time, sizeof(request_time)) ;
|
||||
// Request type:
|
||||
memset(&pkt[offset], OWL_REQUEST_AUTOCALIBRATION, 1) ;
|
||||
++offset ;
|
||||
// Timestamp:
|
||||
memcpy(&pkt[offset], &request_time, sizeof(request_time)) ;
|
||||
offset += sizeof(request_time) ;
|
||||
// Coordinates:
|
||||
pkt[offset] = GET_MY_DIRECTION() ;
|
||||
++offset ;
|
||||
memcpy(&pkt[offset], &my_position_x, sizeof(float)) ;
|
||||
offset += sizeof(float) ;
|
||||
memcpy(&pkt[offset], &my_position_y, sizeof(float)) ;
|
||||
offset += sizeof(float) ;
|
||||
memcpy(&pkt[offset], &my_position_z, sizeof(float)) ;
|
||||
#ifdef DEBUG
|
||||
offset += sizeof(float) ;
|
||||
assert(offset == size) ;
|
||||
#endif // DEBUG
|
||||
|
||||
*packet = pkt ;
|
||||
return size ;
|
||||
|
@ -1236,7 +1340,7 @@ void print_usage()
|
|||
" [-D autocalibration_ip]"
|
||||
" [-P autocalibration_request_port ] [-a autocalibration_port]"
|
||||
" [-H autocalibration_hello_delay] [-t autocalibration_delay]"
|
||||
" [-n autocalibration_nb_packets]\n"
|
||||
" [-n autocalibration_nb_packets] [direction x y z]\n"
|
||||
"\t%s -h\n"
|
||||
"\t%s -V\n"
|
||||
|
||||
|
@ -1266,16 +1370,19 @@ void print_usage()
|
|||
"\t-A\t\t\tEnable autocalibration (default: disabled).\n"
|
||||
"\t-D autocalib_ip\t\tDestination IP of the autocalibration"
|
||||
"requests (default: aggregation_ip).\n"
|
||||
"\t-P autocalib_req_port\tPort on which autocalibration positioning"
|
||||
" requests are sent (default: %d).\n"
|
||||
"\t-a autocalib_port\tPort on which autocalibration data (hello & orders)"
|
||||
" are exchanged with the aggregation server (default: %d).\n"
|
||||
"\t-P autocalib_req_port\tPort on which autocalibration"
|
||||
" positioning requests are sent (default: %d).\n"
|
||||
"\t-a autocalib_port\tPort on which autocalibration data (hello"
|
||||
" & orders) are exchanged with the aggregation server"
|
||||
" (default: %d).\n"
|
||||
"\t-H hello_delay\t\tTime between each hello"
|
||||
" message sent to the aggregation server (default: %d s).\n"
|
||||
"\t-t delay\t\tTime between each autocalibration"
|
||||
" packet transmission (default: %d µs).\n"
|
||||
"\t-n nb_packets\t\tNumber of packet transmitted"
|
||||
" for one autocalibration request (default: %d).\n"
|
||||
"\tdirection x y z\t\tThe coordinates of the listener"
|
||||
" (direction is an integer; x, y, z are floats).\n"
|
||||
|
||||
"Other options:\n"
|
||||
"\t-k\tKeep the monitor mode up on wifi_iface. Use it with buggy"
|
||||
|
|
Loading…
Reference in New Issue