[Aggregator] Access Point -> Capture Point

Use the new terminology "capture point" (CP) instead of "access point"
(AP) everywhere in Aggregator. The only user-visible change is that the
ap_keep_timeout option is now called cp_keep_timeout.
This commit is contained in:
Matteo Cypriani 2013-06-14 13:55:02 -04:00
parent 91cd819730
commit 0c3083bd41
2 changed files with 182 additions and 182 deletions

View File

@ -32,7 +32,7 @@
#define DEFAULT_AGGREGATE_TIMEOUT 600 // milliseconds
#define DEFAULT_KEEP_TIMEOUT 3000 // milliseconds
#define DEFAULT_CHECK_INTERVAL 300 // milliseconds
#define DEFAULT_AP_KEEP_TIMEOUT 35 // seconds
#define DEFAULT_CP_KEEP_TIMEOUT 35 // seconds
#define DEFAULT_AC_ORDER_INTERVAL 1000 // milliseconds
#define POSITIONER_DEFAULT_IP "127.0.0.1"
@ -50,11 +50,11 @@ typedef struct _request_info_list
{
// Number of the current packet:
uint16_t packet_id ;
// MAC address of the transmitter AP (in bytes):
uint8_t ap_mac_addr_bytes[ETHER_ADDR_LEN] ;
// MAC address of the transmitter CP (in bytes):
uint8_t cp_mac_addr_bytes[ETHER_ADDR_LEN] ;
// Timestamp of arrival on the listener:
owl_timestamp capture_time ;
// Signal strength received by the AP from the mobile:
// Signal strength received by the CP from the mobile:
int8_t ss_dbm ;
struct _request_info_list *next ;
} request_info_list ;
@ -88,17 +88,17 @@ typedef struct _request_list
} request_list ;
/* Linked list of the known APs */
typedef struct _ap_list
/* Linked list of the known CPs */
typedef struct _cp_list
{
uint8_t mac_addr_bytes[ETHER_ADDR_LEN] ;
char ip_addr[INET_ADDRSTRLEN] ;
owl_timestamp last_seen ;
struct _ap_list *previous ;
struct _ap_list *next ;
} ap_list ;
struct _cp_list *previous ;
struct _cp_list *next ;
} cp_list ;
/* Function headers */
@ -131,21 +131,21 @@ void print_request_list(void) ;
void print_request_info(request_info_list *info) ;
#endif // NDEBUG
void* listen_for_aps(void *NULL_value) ;
void update_ap(uint8_t mac_addr_bytes[ETHER_ADDR_LEN],
void* listen_for_cps(void *NULL_value) ;
void update_cp(uint8_t mac_addr_bytes[ETHER_ADDR_LEN],
char ip_addr[INET_ADDRSTRLEN]) ;
ap_list* find_ap(uint8_t mac_addr_bytes[ETHER_ADDR_LEN]) ;
ap_list* add_ap_front(uint8_t mac_addr_bytes[ETHER_ADDR_LEN]) ;
void update_ap_ip_addr(ap_list *ap, char ip_addr[INET_ADDRSTRLEN]) ;
void update_ap_seen(ap_list *ap) ;
void push_ap(ap_list *ap) ;
cp_list* find_cp(uint8_t mac_addr_bytes[ETHER_ADDR_LEN]) ;
cp_list* add_cp_front(uint8_t mac_addr_bytes[ETHER_ADDR_LEN]) ;
void update_cp_ip_addr(cp_list *cp, char ip_addr[INET_ADDRSTRLEN]) ;
void update_cp_seen(cp_list *cp) ;
void push_cp(cp_list *cp) ;
void* monitor_aps(void *NULL_value) ;
void delete_old_aps(void) ;
void delete_ap(ap_list *ap) ;
void unlink_ap(ap_list *ap) ;
void order_send(ap_list *ap) ;
void free_ap_list(void) ;
void* monitor_cps(void *NULL_value) ;
void delete_old_cps(void) ;
void delete_cp(cp_list *cp) ;
void unlink_cp(cp_list *cp) ;
void order_send(cp_list *cp) ;
void free_cp_list(void) ;
void print_usage(void) ;
void print_version(void) ;

View File

@ -49,9 +49,9 @@ bool dump_configuration = false ;
request_list *requests = NULL ; // Computed data list
sem_t lock_requests ; // Semaphore to get access to the requests
ap_list *token_aps = NULL ; // Token ring of the APs
uint_fast16_t nb_aps = 0 ; // Number of APs in the APs' ring
sem_t lock_aps ; // Semaphore to get access to the APs' ring
cp_list *token_cps = NULL ; // Token ring of the CPs
uint_fast16_t nb_cps = 0 ; // Number of CPs in the CPs' ring
sem_t lock_cps ; // Semaphore to get access to the CPs' ring
@ -61,7 +61,7 @@ int main(int argc, char **argv)
struct sigaction action ; // Signal handler structure
pthread_t
monitor_thread, // Aggregated data monitoring thread
monitor_aps_thread, // APs monitoring thread
monitor_cps_thread, // CPs monitoring thread
autocalibration_hello_thread ; // Hello messages reception thread
uint_fast16_t listening_port ;
int sockfd = -1 ; // UDP listening socket
@ -91,7 +91,7 @@ int main(int argc, char **argv)
/* Set up semaphores */
sem_init(&lock_requests, 0, 1) ;
sem_init(&lock_aps, 0, 1) ;
sem_init(&lock_cps, 0, 1) ;
/* Create UDP socket */
listening_port = cfg_getint(cfg, "listening_port") ;
@ -115,18 +115,18 @@ int main(int argc, char **argv)
if (cfg_getbool(cfg, "autocalibration"))
{
ret = pthread_create(&autocalibration_hello_thread, NULL,
&listen_for_aps, NULL) ;
&listen_for_cps, NULL) ;
if (ret != 0)
{
perror("Cannot create autocalibration hello thread") ;
ret = OWL_ERR_THREAD_CREATE ;
goto exit ;
}
ret = pthread_create(&monitor_aps_thread, NULL,
&monitor_aps, NULL) ;
ret = pthread_create(&monitor_cps_thread, NULL,
&monitor_cps, NULL) ;
if (ret != 0)
{
perror("Cannot create monitor APs thread") ;
perror("Cannot create monitor CPs thread") ;
ret = OWL_ERR_THREAD_CREATE ;
goto exit ;
}
@ -164,11 +164,11 @@ int main(int argc, char **argv)
fprintf(stderr, "Autocalibration hello thread done.\n") ;
if (VERBOSE_WARNING)
fprintf(stderr, "Waiting for the monitor APs thread...\n") ;
if (pthread_join(monitor_aps_thread, NULL) != 0)
perror("Cannot join monitor APs thread") ;
fprintf(stderr, "Waiting for the monitor CPs thread...\n") ;
if (pthread_join(monitor_cps_thread, NULL) != 0)
perror("Cannot join monitor CPs thread") ;
else if (VERBOSE_WARNING)
fprintf(stderr, "Monitor APs thread done.\n") ;
fprintf(stderr, "Monitor CPs thread done.\n") ;
}
/* Last cleaning tasks */
@ -181,11 +181,11 @@ int main(int argc, char **argv)
if (sockfd >= 0)
close(sockfd) ; // Close socket
assert(requests == NULL) ;
free_ap_list() ;
free_cp_list() ;
cfg_free(cfg) ; // Clean configuration
// Destroy semaphores:
sem_destroy(&lock_requests) ;
sem_destroy(&lock_aps) ;
sem_destroy(&lock_cps) ;
return ret ;
}
@ -274,8 +274,8 @@ int parse_config_file(int argc, char **argv)
// listeners:
CFG_INT("autocalibration_hello_port",
OWL_DEFAULT_AUTOCALIBRATION_HELLO_PORT, CFGF_NONE),
// Time we keep APs in the list (in seconds):
CFG_INT("ap_keep_timeout", DEFAULT_AP_KEEP_TIMEOUT, CFGF_NONE),
// Time we keep CPs in the list (in seconds):
CFG_INT("cp_keep_timeout", DEFAULT_CP_KEEP_TIMEOUT, CFGF_NONE),
// Time between two checks of the CP list (in milliseconds):
CFG_INT("ac_order_interval", DEFAULT_AC_ORDER_INTERVAL, CFGF_NONE),
@ -392,7 +392,7 @@ int parse_command_line(int argc, char **argv)
cfg_setint(cfg, "keep_timeout", strtol(optarg, NULL, 0)) ;
break ;
case 'K' :
cfg_setint(cfg, "ap_keep_timeout", strtol(optarg, NULL, 0)) ;
cfg_setint(cfg, "cp_keep_timeout", strtol(optarg, NULL, 0)) ;
break ;
case 'l' :
cfg_setint(cfg, "listening_port", strtol(optarg, NULL, 0)) ;
@ -499,13 +499,13 @@ int check_configuration()
cfg_setint(cfg, "check_interval", DEFAULT_CHECK_INTERVAL) ;
}
// ap_keep_timeout //
if (cfg_getint(cfg, "ap_keep_timeout") < 0)
// cp_keep_timeout //
if (cfg_getint(cfg, "cp_keep_timeout") < 0)
{
if (VERBOSE_WARNING)
fprintf(stderr, "Warning! ap_keep_timeout cannot be negative:"
fprintf(stderr, "Warning! cp_keep_timeout cannot be negative:"
" failing back to the default value.\n") ;
cfg_setint(cfg, "ap_keep_timeout", DEFAULT_AP_KEEP_TIMEOUT) ;
cfg_setint(cfg, "cp_keep_timeout", DEFAULT_CP_KEEP_TIMEOUT) ;
}
// ac_order_interval //
@ -560,7 +560,7 @@ int read_loop(int sockfd)
if (VERBOSE_REQUESTS)
print_captured_request(&request) ;
else if (VERBOSE_CHATTERBOX)
fprintf(stderr, "Request received from AP \"%s\".\n",
fprintf(stderr, "Request received from CP \"%s\".\n",
owl_mac_bytes_to_string(request.ap_mac_addr_bytes)) ;
got_request(&request) ;
@ -578,7 +578,7 @@ void print_captured_request(const owl_captured_request *const request)
char
request_time_str[OWL_TIMESTAMP_STRLEN],
capture_time_str[OWL_TIMESTAMP_STRLEN],
ap_mac_addr_str[OWL_ETHER_ADDR_STRLEN],
cp_mac_addr_str[OWL_ETHER_ADDR_STRLEN],
mobile_mac_addr_str[OWL_ETHER_ADDR_STRLEN],
mobile_ip_str[INET_ADDRSTRLEN] ;
@ -587,7 +587,7 @@ void print_captured_request(const owl_captured_request *const request)
owl_timestamp_to_string(&request->request_time, request_time_str) ;
owl_timestamp_to_string(&request->capture_time, capture_time_str) ;
owl_mac_bytes_to_string_r(request->ap_mac_addr_bytes,
ap_mac_addr_str) ;
cp_mac_addr_str) ;
owl_mac_bytes_to_string_r(request->mobile_mac_addr_bytes,
mobile_mac_addr_str) ;
inet_ntop(AF_INET, &request->mobile_ip_addr_bytes,
@ -595,13 +595,13 @@ void print_captured_request(const owl_captured_request *const request)
fprintf(stderr,
"\n"
"*** Request received from AP ***\n"
"*** Request received from CP ***\n"
"\tType: %"PRIu8"\n"
"\tAP MAC: %s\n"
"\tCP MAC: %s\n"
"\tMobile MAC: %s\n"
"\tMobile IP: %s\n"
"\tRequest timestamp: %s\n"
"\tRequest arrival time on the AP: %s\n"
"\tRequest arrival time on the CP: %s\n"
"\tSignal: %"PRId8" dBm\n"
"\tPosition X: %f\n"
"\tPosition Y: %f\n"
@ -610,7 +610,7 @@ void print_captured_request(const owl_captured_request *const request)
"\tPacket number: %"PRIu16"/%"PRIu16"\n"
,
request->type,
ap_mac_addr_str,
cp_mac_addr_str,
mobile_mac_addr_str,
mobile_ip_str,
request_time_str,
@ -648,7 +648,7 @@ void got_request(const owl_captured_request *const request)
}
tmp_info->packet_id = request->packet_id ;
memcpy(tmp_info->ap_mac_addr_bytes, request->ap_mac_addr_bytes,
memcpy(tmp_info->cp_mac_addr_bytes, request->ap_mac_addr_bytes,
ETHER_ADDR_LEN) ;
tmp_info->capture_time = request->capture_time ;
tmp_info->ss_dbm = request->ss_dbm ;
@ -687,7 +687,7 @@ void add_captured_request(const owl_timestamp *const reception_time,
if (requests == NULL) // If the request list does not exist,
{
if (VERBOSE_INFO)
fprintf(stderr, "Creating request list with AP \"%s\".\n",
fprintf(stderr, "Creating request list with CP \"%s\".\n",
owl_mac_bytes_to_string(request->ap_mac_addr_bytes)) ;
tmp_request = malloc(sizeof(request_list)) ; // create it.
if (! tmp_request)
@ -708,10 +708,10 @@ void add_captured_request(const owl_timestamp *const reception_time,
tmp_request->request_time = request->request_time ;
// Implicit packet:
else
// Reception time on the AP:
// Reception time on the CP:
tmp_request->request_time = request->capture_time ;
// Save locale time on the aggregator (not the reception time
// on the AP):
// on the CP):
tmp_request->start_time = *reception_time ;
tmp_request->x_position = request->x_position ;
tmp_request->y_position = request->y_position ;
@ -742,7 +742,7 @@ void add_captured_request(const owl_timestamp *const reception_time,
{
while (tmp_request != NULL)
{ // Research criterion: MAC addresses equals and reception
// times on the APs less than 10 ms
// times on the CPs less than 10 ms
// TODO : define an option for the maximal difference time.
if (owl_mac_equals(request->mobile_mac_addr_bytes,
tmp_request->mobile_mac_addr_bytes) &&
@ -756,7 +756,7 @@ void add_captured_request(const owl_timestamp *const reception_time,
if (tmp_request == NULL) // The request does not exist in the list
{
if (VERBOSE_INFO)
fprintf(stderr, "Create new request from AP \"%s\".\n",
fprintf(stderr, "Create new request from CP \"%s\".\n",
owl_mac_bytes_to_string(request->ap_mac_addr_bytes)) ;
tmp_request = malloc(sizeof(request_list)) ; // create it
if (! tmp_request)
@ -777,10 +777,10 @@ void add_captured_request(const owl_timestamp *const reception_time,
tmp_request->request_time = request->request_time ;
// Implicit packet:
else
// Reception time on the AP:
// Reception time on the CP:
tmp_request->request_time = request->capture_time ;
// Save the local time on the aggregator (not the reception
// time on the AP):
// time on the CP):
tmp_request->start_time = *reception_time ;
tmp_request->x_position = request->x_position ;
tmp_request->y_position = request->y_position ;
@ -1058,7 +1058,7 @@ void output_request(request_list *const request_ptr,
// Send CP info to the localisation server
info.packet_id = htons(request_info_ptr->packet_id) ;
memcpy(info.ap_mac_addr_bytes,
request_info_ptr->ap_mac_addr_bytes, ETHER_ADDR_LEN) ;
request_info_ptr->cp_mac_addr_bytes, ETHER_ADDR_LEN) ;
info.capture_time = request_info_ptr->capture_time ;
owl_hton_timestamp(&info.capture_time) ;
info.ss_dbm = request_info_ptr->ss_dbm ;
@ -1066,7 +1066,7 @@ void output_request(request_list *const request_ptr,
0, (const struct sockaddr *const)serv, serv_len) ;
// Print CP info to the output file
owl_mac_bytes_to_string_r(request_info_ptr->ap_mac_addr_bytes,
owl_mac_bytes_to_string_r(request_info_ptr->cp_mac_addr_bytes,
mac_str) ;
fprintf(stream, ";%s;%"PRIu16";%"PRId8,
mac_str,
@ -1151,15 +1151,15 @@ void print_request_list()
*/
void print_request_info(request_info_list *info)
{
char ap_mac_str[OWL_ETHER_ADDR_STRLEN] ;
char cp_mac_str[OWL_ETHER_ADDR_STRLEN] ;
if (info == NULL)
return ;
owl_mac_bytes_to_string_r(info->ap_mac_addr_bytes, ap_mac_str) ;
owl_mac_bytes_to_string_r(info->ap_mac_addr_bytes, cp_mac_str) ;
fprintf(stderr,
"\tAP MAC: %s\n"
"\tCP MAC: %s\n"
"\tSignal strength: %"PRId8" dBm\n",
ap_mac_str,
cp_mac_str,
info->ss_dbm
) ;
}
@ -1168,16 +1168,16 @@ void print_request_info(request_info_list *info)
/*
* Thread function. Listens for hello messages from APs.
* Thread function. Listens for hello messages from CPs.
*/
void* listen_for_aps(void *NULL_value)
void* listen_for_cps(void *NULL_value)
{
int listen_sockfd ;
int nread ; // recvfrom return value
struct sockaddr_in client; // UDP client structure
socklen_t client_len = sizeof(client) ; // Size of clients
owl_autocalibration_hello message ;
char ap_ip_addr[INET_ADDRSTRLEN] ;
char cp_ip_addr[INET_ADDRSTRLEN] ;
if (VERBOSE_WARNING)
fprintf(stderr, "Autocalibration Hello thread launched.\n") ;
@ -1205,15 +1205,15 @@ void* listen_for_aps(void *NULL_value)
continue ;
}
inet_ntop(AF_INET, &client.sin_addr, ap_ip_addr, INET_ADDRSTRLEN) ;
inet_ntop(AF_INET, &client.sin_addr, cp_ip_addr, INET_ADDRSTRLEN) ;
if (VERBOSE_INFO)
fprintf(stderr,
"Got a Hello message from \"%s\"\n", ap_ip_addr) ;
"Got a Hello message from \"%s\"\n", cp_ip_addr) ;
sem_wait(&lock_aps) ;
update_ap(message.ap_mac_addr_bytes, ap_ip_addr) ;
sem_post(&lock_aps) ;
sem_wait(&lock_cps) ;
update_cp(message.ap_mac_addr_bytes, cp_ip_addr) ;
sem_post(&lock_cps) ;
}
/* Close the socket */
@ -1224,150 +1224,150 @@ void* listen_for_aps(void *NULL_value)
/*
* Updates the timestamp of the AP with the given MAC address if it is in
* the AP list, or add a new AP with this MAC address to the AP list.
* Updates the timestamp of the CP with the given MAC address if it is in
* the CP list, or add a new CP with this MAC address to the CP list.
*/
void update_ap(uint8_t mac_addr_bytes[ETHER_ADDR_LEN],
void update_cp(uint8_t mac_addr_bytes[ETHER_ADDR_LEN],
char ip_addr[INET_ADDRSTRLEN])
{
ap_list *found ;
cp_list *found ;
if ((found = find_ap(mac_addr_bytes)) == NULL)
if ((found = find_cp(mac_addr_bytes)) == NULL)
{
ap_list *new_ap = add_ap_front(mac_addr_bytes) ;
if (new_ap)
update_ap_ip_addr(new_ap, ip_addr) ;
cp_list *new_cp = add_cp_front(mac_addr_bytes) ;
if (new_cp)
update_cp_ip_addr(new_cp, ip_addr) ;
}
else
update_ap_seen(found) ;
update_cp_seen(found) ;
}
/*
* Searches the AP list for an AP with the given MAC address and returns
* Searches the CP list for a CP with the given MAC address and returns
* it.
*/
ap_list* find_ap(uint8_t mac_addr_bytes[ETHER_ADDR_LEN])
cp_list* find_cp(uint8_t mac_addr_bytes[ETHER_ADDR_LEN])
{
ap_list *found ;
cp_list *found ;
if (token_aps == NULL)
if (token_cps == NULL)
return NULL ;
found = token_aps ;
found = token_cps ;
do
{
if (owl_mac_equals(found->mac_addr_bytes, mac_addr_bytes))
return found ;
found = found->next ;
}
while (found != token_aps) ;
while (found != token_cps) ;
return NULL ;
}
/*
* Adds a new AP in front of the AP list.
* Adds a new CP in front of the CP list.
* Returns the new list head, or NULL in case of error.
*/
ap_list* add_ap_front(uint8_t mac_addr_bytes[ETHER_ADDR_LEN])
cp_list* add_cp_front(uint8_t mac_addr_bytes[ETHER_ADDR_LEN])
{
if (VERBOSE_INFO)
{
char mac_str[OWL_ETHER_ADDR_STRLEN] ;
owl_mac_bytes_to_string_r(mac_addr_bytes, mac_str) ;
fprintf(stderr,
"Creating AP with MAC address \"%s\"...\n", mac_str) ;
"Creating CP with MAC address \"%s\"...\n", mac_str) ;
}
ap_list *ap = malloc(sizeof(ap_list)) ;
if (! ap)
cp_list *cp = malloc(sizeof(cp_list)) ;
if (! cp)
{
perror("Cannot allocate memory") ;
owl_run = false ;
return NULL ;
}
memcpy(ap->mac_addr_bytes, mac_addr_bytes, ETHER_ADDR_LEN) ;
update_ap_seen(ap) ;
push_ap(ap) ;
return ap ;
memcpy(cp->mac_addr_bytes, mac_addr_bytes, ETHER_ADDR_LEN) ;
update_cp_seen(cp) ;
push_cp(cp) ;
return cp ;
}
/*
* Change the IP address of the AP 'ap' with 'ip_addr'.
* Change the IP address of the CP 'cp' with 'ip_addr'.
*/
void update_ap_ip_addr(ap_list *ap, char ip_addr[INET_ADDRSTRLEN])
void update_cp_ip_addr(cp_list *cp, char ip_addr[INET_ADDRSTRLEN])
{
strncpy(ap->ip_addr, ip_addr, INET_ADDRSTRLEN) ;
strncpy(cp->ip_addr, ip_addr, INET_ADDRSTRLEN) ;
}
/*
* Updates the timestamp of the given AP.
* Updates the timestamp of the given CP.
*/
void update_ap_seen(ap_list *ap)
void update_cp_seen(cp_list *cp)
{
assert(ap) ;
owl_timestamp_now(&ap->last_seen) ;
assert(cp) ;
owl_timestamp_now(&cp->last_seen) ;
}
/*
* Puts an existing AP in front of the AP list. The AP must not be in
* Puts an existing CP in front of the CP list. The CP must not be in
* the list yet.
*/
void push_ap(ap_list *ap)
void push_cp(cp_list *cp)
{
assert(ap) ;
assert(cp) ;
++nb_aps ;
++nb_cps ;
if (token_aps == NULL) // List does not exist yet
if (token_cps == NULL) // List does not exist yet
{
token_aps = ap ;
ap->next = ap ;
ap->previous = ap ;
token_cps = cp ;
cp->next = cp ;
cp->previous = cp ;
return ;
}
ap->previous = token_aps->previous ;
ap->previous->next = ap ;
ap->next = token_aps ;
token_aps->previous = ap ;
token_aps = ap ;
cp->previous = token_cps->previous ;
cp->previous->next = cp ;
cp->next = token_cps ;
token_cps->previous = cp ;
token_cps = cp ;
}
/*
* Monitors the AP list: sends orders to APs following their order in
* the list, and deletes old APs.
* Monitors the CP list: sends orders to CPs following their order in
* the list, and deletes old CPs.
*/
void* monitor_aps(void *NULL_value)
void* monitor_cps(void *NULL_value)
{
if (VERBOSE_WARNING)
fprintf(stderr, "Monitor AP thread launched.\n") ;
fprintf(stderr, "Monitor CP thread launched.\n") ;
while (owl_run)
{
sem_wait(&lock_aps) ;
delete_old_aps() ;
sem_post(&lock_aps) ;
sem_wait(&lock_cps) ;
delete_old_cps() ;
sem_post(&lock_cps) ;
// Here we're not in a hurry, so we released the semaphore to
// allow listen_for_aps() to process a received hello packet,
// allow listen_for_cps() to process a received hello packet,
// if needed.
sem_wait(&lock_aps) ;
if (nb_aps > 1)
sem_wait(&lock_cps) ;
if (nb_cps > 1)
{
order_send(token_aps) ;
token_aps = token_aps->next ;
order_send(token_cps) ;
token_cps = token_cps->next ;
}
sem_post(&lock_aps) ;
sem_post(&lock_cps) ;
owl_msleep(cfg_getint(cfg, "ac_order_interval")) ;
}
@ -1377,77 +1377,77 @@ void* monitor_aps(void *NULL_value)
/*
* Deletes APs that did not send any Hello packet for a while, following
* the list order. Stops on the first not-to-be-deleted AP.
* Deletes CPs that did not send any Hello packet for a while, following
* the list order. Stops on the first not-to-be-deleted CP.
*/
void delete_old_aps()
void delete_old_cps()
{
owl_timestamp now ;
owl_timestamp_now(&now) ;
while (token_aps != NULL)
if (owl_time_elapsed_ms(&token_aps->last_seen, &now) >
(uint_fast32_t) cfg_getint(cfg, "ap_keep_timeout") * 1000)
delete_ap(token_aps) ;
while (token_cps != NULL)
if (owl_time_elapsed_ms(&token_cps->last_seen, &now) >
(uint_fast32_t) cfg_getint(cfg, "cp_keep_timeout") * 1000)
delete_cp(token_cps) ;
else
return ;
}
/*
* Deletes the given AP from the AP list.
* Deletes the given CP from the CP list.
*/
void delete_ap(ap_list *ap)
void delete_cp(cp_list *cp)
{
if (VERBOSE_INFO)
{
char mac_str[OWL_ETHER_ADDR_STRLEN] ;
assert(ap) ;
owl_mac_bytes_to_string_r(ap->mac_addr_bytes, mac_str) ;
fprintf(stderr, "Deleting AP \"%s\"...\n", mac_str) ;
assert(cp) ;
owl_mac_bytes_to_string_r(cp->mac_addr_bytes, mac_str) ;
fprintf(stderr, "Deleting CP \"%s\"...\n", mac_str) ;
}
unlink_ap(ap) ;
free(ap) ;
unlink_cp(cp) ;
free(cp) ;
}
/*
* Extracts the given AP from the AP list (it will not be linked to any
* Extracts the given CP from the CP list (it will not be linked to any
* other element of the list).
*/
void unlink_ap(ap_list *ap)
void unlink_cp(cp_list *cp)
{
ap_list
*ap_previous,
*ap_next ;
cp_list
*cp_previous,
*cp_next ;
assert(ap) ;
ap_previous = ap->previous ;
ap_next = ap->next ;
assert(ap_previous) ;
assert(ap_next) ;
assert(cp) ;
cp_previous = cp->previous ;
cp_next = cp->next ;
assert(cp_previous) ;
assert(cp_next) ;
ap_previous->next = ap_next ;
ap_next->previous = ap_previous ;
cp_previous->next = cp_next ;
cp_next->previous = cp_previous ;
if (ap == token_aps)
if (cp == token_cps)
{
if (ap->next == ap) // It was the last AP in the ring
token_aps = NULL ;
if (cp->next == cp) // It was the last CP in the ring
token_cps = NULL ;
else
token_aps = ap_next ;
token_cps = cp_next ;
}
--nb_aps ;
--nb_cps ;
}
/*
* Sends a 'send' order to the given AP.
* Sends a 'send' order to the given CP.
*/
void order_send(ap_list *ap)
void order_send(cp_list *cp)
{
owl_autocalibration_order message ;
struct sockaddr_in serv;
@ -1457,10 +1457,10 @@ void order_send(ap_list *ap)
ssize_t nsent ;
if (VERBOSE_INFO)
fprintf(stderr, "Sending an order to %s...\n", ap->ip_addr) ;
fprintf(stderr, "Sending an order to %s...\n", cp->ip_addr) ;
sockfd =
owl_create_udp_trx_socket(ap->ip_addr,
owl_create_udp_trx_socket(cp->ip_addr,
cfg_getint(cfg,
"autocalibration_order_port"),
&serv, &client) ;
@ -1479,29 +1479,29 @@ void order_send(ap_list *ap)
/*
* Empties the AP list.
* Note that this function does not use lock_aps, so it should not
* Empties the CP list.
* Note that this function does not use lock_cps, so it should not
* be called in a concurrent context.
*/
void free_ap_list()
void free_cp_list()
{
ap_list *ap_ptr ;
cp_list *cp_ptr ;
if (token_aps == NULL)
if (token_cps == NULL)
return ;
ap_ptr = token_aps->next ;
assert(ap_ptr) ;
cp_ptr = token_cps->next ;
assert(cp_ptr) ;
while (ap_ptr != token_aps)
while (cp_ptr != token_cps)
{
ap_list *ap_tmp = ap_ptr ;
ap_ptr = ap_ptr->next ;
free(ap_tmp) ;
cp_list *cp_tmp = cp_ptr ;
cp_ptr = cp_ptr->next ;
free(cp_tmp) ;
}
free(token_aps) ;
token_aps = NULL ;
free(token_cps) ;
token_cps = NULL ;
}
@ -1528,7 +1528,7 @@ void print_usage()
" [-A]"
" [-a autocalibration_port]"
"\n\t"
" [-K ap_keep_timeout]"
" [-K cp_keep_timeout]"
" [-C ac_order_interval]"
"\n"
"\t%s -h\n"
@ -1579,8 +1579,8 @@ void print_usage()
" sent to\n\t\t\t\tthe listeners (default: %d).\n"
"\t-H port\t\t\tPort on which autocalibration hello are"
" received\n\t\t\t\tfrom the listeners (default: %d).\n"
"\t-K ap_keep_timeout\tInactive APs are kept during"
" 'ap_keep_timeout'\n\t\t\t\tseconds (default: %d s).\n"
"\t-K cp_keep_timeout\tInactive CPs are kept during"
" 'cp_keep_timeout'\n\t\t\t\tseconds (default: %d s).\n"
"\t-C ac_order_interval\tTime (in milliseconds) between two"
" transmissions\n\t\t\t\tof autocalibration orders to the"
" stored CPs\n\t\t\t\t(default: %d ms).\n"
@ -1597,7 +1597,7 @@ void print_usage()
DEFAULT_CHECK_INTERVAL,
OWL_DEFAULT_AUTOCALIBRATION_ORDER_PORT,
OWL_DEFAULT_AUTOCALIBRATION_HELLO_PORT,
DEFAULT_AP_KEEP_TIMEOUT,
DEFAULT_CP_KEEP_TIMEOUT,
DEFAULT_AC_ORDER_INTERVAL
) ;
}