diff --git a/infrastructure-centred/owlps-aggregator/owlps-aggregator.h b/infrastructure-centred/owlps-aggregator/owlps-aggregator.h index 80637aa..c6f4ff5 100644 --- a/infrastructure-centred/owlps-aggregator/owlps-aggregator.h +++ b/infrastructure-centred/owlps-aggregator/owlps-aggregator.h @@ -9,6 +9,7 @@ #include "../../libowlps/owlps.h" #include +#define DEBUG //#define TIMESTAMP // Décommenter pour afficher le timestamp à chaque ligne du fichier de sortie. @@ -64,8 +65,10 @@ typedef struct _couple_list /* En-têtes de fonctions */ void got_couple_info(couple_list **couples, couple_message message) ; void free_couple_list(couple_list **couples) ; +#ifdef DEBUG void print_couple_list(couple_list *couples) ; void print_couple_info(couple_info_list *info) ; +#endif // DEBUG void* monitor_couple_list(couple_list **couples) ; int Db_write_request(couple_message message, BOOL ref) ; int DbAccessPoint(couple_message message, PGconn *conn); diff --git a/infrastructure-centred/owlps-aggregator/owlps-aggregatord.c b/infrastructure-centred/owlps-aggregator/owlps-aggregatord.c index d627c12..227be2c 100644 --- a/infrastructure-centred/owlps-aggregator/owlps-aggregatord.c +++ b/infrastructure-centred/owlps-aggregator/owlps-aggregatord.c @@ -5,7 +5,6 @@ #include "owlps-aggregator.h" -#define DEBUG cfg_t *cfg ; // Structure contenant la configuration @@ -415,7 +414,10 @@ void got_couple_info(couple_list **couples, couple_message message) printf("Création de la liste des couples.\n") ; tmp_couple = malloc(sizeof(couple_list)) ; // on la crée. memcpy(tmp_couple->mobile_mac_addr_bytes, message.mobile_mac_addr_bytes, 6) ; - tmp_couple->request_time = message.request_time ; + if (timeval_to_ms(message.request_time) != 0) // Paquet explicite + tmp_couple->request_time = message.request_time ; // Heure d'émission par le mobile + else // Paquet implicite + tmp_couple->request_time = message.start_time ; // Heure de réception par l'AP tmp_couple->start_time = start_time ; // Enregistrement de la date locale de l'agrégateur et non de la date de réception de la demande sur l'AP tmp_couple->x_position = message.x_position ; tmp_couple->y_position = message.y_position ; @@ -426,21 +428,37 @@ void got_couple_info(couple_list **couples, couple_message message) *couples = tmp_couple ; } else - { - while (tmp_couple != NULL) // Sinon on cherche si le couple existe déjà dans la liste - { - if(mac_cmp(message.mobile_mac_addr_bytes, tmp_couple->mobile_mac_addr_bytes) == 1 - && message.request_time.tv_usec == tmp_couple->request_time.tv_usec) // Si le couple existe déjà, - break ; // on s'arrête dessus. - tmp_couple = tmp_couple->next ; - } + { // Sinon on cherche si le couple existe déjà dans la liste + if (timeval_to_ms(message.request_time) != 0) // Paquet explicite + { + while (tmp_couple != NULL) + { // Critère : MAC et heure d'émission identiques. + if(mac_cmp(message.mobile_mac_addr_bytes, tmp_couple->mobile_mac_addr_bytes) == 1 + && sub_date(message.request_time, tmp_couple->request_time) == 0) + break ; // Si le couple existe déjà, on s'arrête dessus. + tmp_couple = tmp_couple->next ; + } + } + else // Paquet implicite + { + while (tmp_couple != NULL) + { // Critère : MAC identiques et décalage des heures de réception par les AP d'au maximum 10 ms. + if(mac_cmp(message.mobile_mac_addr_bytes, tmp_couple->mobile_mac_addr_bytes) == 1 + && sub_date(message.start_time, tmp_couple->request_time) <= 10) // TODO : définir un paramètre pour le décalage maximal + break ; // Si le couple existe déjà, on s'arrête dessus. + tmp_couple = tmp_couple->next ; + } + } if (tmp_couple == NULL) // Si couple inexistant dans la liste { printf("Création du couple.\n") ; tmp_couple = malloc(sizeof(couple_list)) ; // on crée un nouveau couple. memcpy(tmp_couple->mobile_mac_addr_bytes, message.mobile_mac_addr_bytes, 6) ; - tmp_couple->request_time = message.request_time ; + if (timeval_to_ms(message.request_time) != 0) // Paquet explicite + tmp_couple->request_time = message.request_time ; // Heure d'émission par le mobile + else // Paquet implicite + tmp_couple->request_time = message.start_time ; // Heure de réception par l'AP tmp_couple->start_time = start_time ; // Enregistrement de la date locale de l'agrégateur et non de la date de réception de la demande sur l'AP tmp_couple->x_position = message.x_position ; tmp_couple->y_position = message.y_position ; @@ -495,6 +513,7 @@ void free_couple_list(couple_list **couples) +#ifdef DEBUG /* Affiche la liste des couples */ void print_couple_list(couple_list *couples) { @@ -553,6 +572,7 @@ void print_couple_info(couple_info_list *info) ) ; free(ap_mac_string) ; } +#endif // DEBUG diff --git a/infrastructure-centred/owlps-listener/owlps-listener.h b/infrastructure-centred/owlps-listener/owlps-listener.h index 8b38a2d..f859be6 100644 --- a/infrastructure-centred/owlps-listener/owlps-listener.h +++ b/infrastructure-centred/owlps-listener/owlps-listener.h @@ -10,6 +10,8 @@ #define USE_PTHREAD // POSIX threads available? //#define PLATFORM_ATHEROS // Will we compile to an Atheros platform? +#define DEBUG + #include "../../libowlps/owlps.h" #include @@ -36,10 +38,11 @@ /* Arguments & configuration du programme */ -#define OPTIONS "m:d:f:kl:p:r:w:v" // Chaîne pour getopt +#define OPTIONS "d:f:kl:m:p:qr:vw:" // Chaîne pour getopt #define DEFAULT_CONFIG_FILE "/usr/local/etc/owlps/owlps-listener.conf" enum {MODE_ACTIVE = 'a', MODE_PASSIVE = 'p', MODE_MIXED = 'm'} ; + /* En-têtes des fonctions */ #ifdef USE_PTHREAD void* keep_mode_monitor(char *iface) ; diff --git a/infrastructure-centred/owlps-listener/owlps-listenerd.c b/infrastructure-centred/owlps-listener/owlps-listenerd.c index 892922b..900a1f5 100644 --- a/infrastructure-centred/owlps-listener/owlps-listenerd.c +++ b/infrastructure-centred/owlps-listener/owlps-listenerd.c @@ -5,7 +5,7 @@ #include "owlps-listener.h" -#define DEBUG + unsigned char mac[6] ; // Adresse MAC de l'AP @@ -318,6 +318,7 @@ void read_packet(u_char *args, const struct pcap_pkthdr *header, const u_char *p unsigned short dst_port ; // Port destination du paquet capturé int i ; // Compteur + /* Traitements communs */ memcpy(&rtap_bytes, &data[2], sizeof(unsigned short)) ; // Recopie les deux octets à partir du troisième octet de donnée qui est la taille de l'en-tête rtap (change avec des flags) #ifdef PLATFORM_ATHEROS rtap_bytes = ((rtap_bytes & 0xff00) >> 8) + ((rtap_bytes & 0xff) << 8) ; @@ -345,28 +346,30 @@ void read_packet(u_char *args, const struct pcap_pkthdr *header, const u_char *p } #endif // DEBUG + memcpy(couple.ap_mac_addr_bytes, mac, 6); // On copie la MAC de l'AP + memcpy(couple.mobile_mac_addr_bytes, &data[rtap_bytes+10], 6); // L'adresse MAC source est 10 octets plus loin que le type de paquet 802.11 + couple.start_time = header->ts ; // L'heure de capture du paquet est contenue dans l'en-tête pcap + couple.request_time.tv_sec = 0 ; // L'heure d'envoi par le mobile est inconnue (à moins qu'il ne s'agisse d'un paquet explicite) + couple.request_time.tv_usec = 0 ; + // TODO : if (est un paquet IP) + memcpy(couple.mobile_ip_addr_bytes, &data[rtap_bytes + IEEE80211_HEADER_SIZE + LLC_HEADER_SIZE + 12], 4); // L'adresse IP source est à la position 12 de l'en-tête IP + // TODO : else mettre l'IP à zéro + /* Mode actif */ if ((GET_MODE() == MODE_ACTIVE || GET_MODE() == MODE_MIXED) && raw_packet_type == RAW_PACKET_TYPE_DATA // Si le paquet est de type data, && data[rtap_bytes + IEEE80211_HEADER_SIZE + LLC_HEADER_SIZE + 9] == RAW_PACKET_PROTO_UDP // et de protocole UDP (9 : position du champ "Protocol" de l'en-tête IP), - && dst_port == LOC_REQUEST_DEFAULT_PORT // et le port de destination est le bon, + && dst_port == GET_LISTENING_PORT() // et le port de destination est le bon, && ! IS_RETRY(raw_packet_flags)) // et ce n'est pas un Retry. { - memcpy(couple.ap_mac_addr_bytes, mac, 6); // On copie la MAC de l'AP - memcpy(couple.mobile_mac_addr_bytes, &data[rtap_bytes+10], 6); // L'adresse MAC source est 10 octets plus loin que le type de paquet - memcpy(couple.mobile_ip_addr_bytes, &data[rtap_bytes + IEEE80211_HEADER_SIZE + LLC_HEADER_SIZE + 12], 4); // L'adresse IP source est à la position 12 de l'en-tête IP - gettimeofday(&couple.start_time, NULL) ; + BOOL err = FALSE ; packet_type = data[rtap_bytes + IEEE80211_HEADER_SIZE + LLC_HEADER_SIZE + IP_HEADER_SIZE + UDP_HEADER_SIZE] ; - - memcpy(&couple.request_time, &data[rtap_bytes + IEEE80211_HEADER_SIZE + LLC_HEADER_SIZE + IP_HEADER_SIZE + UDP_HEADER_SIZE + 1], sizeof(struct timeval)); - - switch(packet_type) { case PACKET_TYPE_NORMAL : if (GET_VERBOSE()) - printf("\nPaquet normal reçu.\n") ; + printf("\nPaquet explicite normal reçu.\n") ; couple.direction = 0 ; couple.x_position = 0 ; couple.y_position = 0 ; @@ -375,7 +378,7 @@ void read_packet(u_char *args, const struct pcap_pkthdr *header, const u_char *p case PACKET_TYPE_CALIBRATION : if (GET_VERBOSE()) - printf("\nPaquet de calibration reçu.\n") ; + printf("\nPaquet explicite de calibration reçu.\n") ; couple.direction = data[rtap_bytes + IEEE80211_HEADER_SIZE + LLC_HEADER_SIZE + IP_HEADER_SIZE + UDP_HEADER_SIZE + 9]; memcpy(&couple.x_position, &data[rtap_bytes + IEEE80211_HEADER_SIZE + LLC_HEADER_SIZE + IP_HEADER_SIZE + UDP_HEADER_SIZE + 10], sizeof(float)); memcpy(&couple.y_position, &data[rtap_bytes + IEEE80211_HEADER_SIZE + LLC_HEADER_SIZE + IP_HEADER_SIZE + UDP_HEADER_SIZE + 14], sizeof(float)); @@ -384,100 +387,120 @@ void read_packet(u_char *args, const struct pcap_pkthdr *header, const u_char *p default : if (GET_VERBOSE()) - printf("\nPaquet bizarre reçu.\n") ; - fprintf(stderr, "Erreur ! Type de paquet inconnu (%d).\n", packet_type) ; - return ; + printf("\nPaquet explicite bizarre reçu.\n") ; + fprintf(stderr, "Erreur ! Type de paquet explicite inconnu (%d).\n", packet_type) ; + err = TRUE ; } + if (err) + { + if (GET_MODE() == MODE_ACTIVE) + return ; + else if (GET_VERBOSE()) + printf("\nCe paquet explicite bizarre sera traité comme implicite.\n") ; + } + else + memcpy(&couple.request_time, &data[rtap_bytes + IEEE80211_HEADER_SIZE + LLC_HEADER_SIZE + IP_HEADER_SIZE + UDP_HEADER_SIZE + 1], sizeof(struct timeval)); + } - memcpy(&rtap_presentflags, &data[RTAP_P_PRESENTFLAGS], RTAP_L_PRESENTFLAGS); // Récupère les flags de l'en-tête rtap + else if (GET_MODE() == MODE_PASSIVE || GET_MODE() == MODE_MIXED) + { + if (GET_VERBOSE()) + printf("\nPaquet implicite reçu.\n") ; + } + + else // Mode actif uniquement, le paquet n'étant pas une demande explicite + return ; + + /* Traitement de l'en-tête Radiotap */ + memcpy(&rtap_presentflags, &data[RTAP_P_PRESENTFLAGS], RTAP_L_PRESENTFLAGS); // Récupère les flags de l'en-tête rtap #ifdef PLATFORM_ATHEROS - rtap_presentflags = ((rtap_presentflags & 0xff000000) >> 24) + ((rtap_presentflags & 0xff0000) >> 8) + ((rtap_presentflags & 0xff00) << 8) + ((rtap_presentflags & 0xff) << 24) ; + rtap_presentflags = ((rtap_presentflags & 0xff000000) >> 24) + ((rtap_presentflags & 0xff0000) >> 8) + ((rtap_presentflags & 0xff00) << 8) + ((rtap_presentflags & 0xff) << 24) ; #endif // PLATFORM_ATHEROS - for (i = 0 ; i < 15 ; i++) // Initialisation de la structure des champs présents - check[i] = FALSE ; - rtap_position = 8 ; // Début des champs déterminés par le present flag + for (i = 0 ; i < 15 ; i++) // Initialisation de la structure des champs présents + check[i] = FALSE ; + rtap_position = 8 ; // Début des champs déterminés par le present flag - for(i=0 ; i < 15 ; i++) // on teste les 15 premiers bits du champ flag afin de valider la présence et de les copier - { - if ((rtap_presentflags % 2) == 1) - { - switch(i) - { - case RTAP_MACTS: - check[RTAP_MACTS] = TRUE ; - rtap_position += RTAP_L_MACTS ; - break ; - case RTAP_FLAGS: - check[RTAP_FLAGS] = TRUE; - rtap_position += RTAP_L_FLAGS ; - break ; - case RTAP_RATE: - check[RTAP_RATE] = TRUE; - rtap_position += RTAP_L_RATE ; - break ; - case RTAP_CHANNEL: - rtap_position += RTAP_L_CHANNEL ; - rtap_position += RTAP_L_CHANNELTYPE ; - break ; - case RTAP_FHSS: - check[RTAP_FHSS] = TRUE; - rtap_position += RTAP_L_FHSS ; - break ; - case RTAP_ANTENNASIGNALDBM: - memcpy(&(couple.antenna_signal_dbm), &data[rtap_position], RTAP_L_ANTENNASIGNALDBM) ; - check[RTAP_ANTENNASIGNALDBM] = TRUE; - if (GET_VERBOSE()) - printf("Antenna Signal : %d dBm\n", couple.antenna_signal_dbm - 0x100); - rtap_position += RTAP_L_ANTENNASIGNALDBM ; - break ; - case RTAP_ANTENNANOISEDBM: - check[RTAP_ANTENNANOISEDBM] = TRUE; - rtap_position += RTAP_L_ANTENNANOISEDBM ; - break ; - case RTAP_LOCKQUALITY: - check[RTAP_LOCKQUALITY] = TRUE; - rtap_position += RTAP_L_LOCKQUALITY ; - break ; - case RTAP_TXATTENUATION: - check[RTAP_TXATTENUATION] = TRUE; - rtap_position += RTAP_L_TXATTENUATION ; - break ; - case RTAP_TXATTENUATIONDB: - check[RTAP_TXATTENUATIONDB] = TRUE; - rtap_position += RTAP_L_TXATTENUATIONDB ; - break ; - case RTAP_TXATTENUATIONDBM: - check[RTAP_TXATTENUATIONDBM] = TRUE; - rtap_position += RTAP_L_TXATTENUATIONDBM ; - break ; - case RTAP_ANTENNA: - check[RTAP_ANTENNA] = TRUE; - rtap_position += RTAP_L_ANTENNA ; - break ; - case RTAP_ANTENNASIGNALDB: - check[RTAP_ANTENNASIGNALDB] = TRUE; - rtap_position += RTAP_L_ANTENNASIGNALDB ; - break ; - case RTAP_ANTENNANOISEDB: - check[RTAP_ANTENNANOISEDB] = TRUE; - rtap_position += RTAP_L_ANTENNANOISEDB ; - break ; - case RTAP_FCS: - check[RTAP_FCS] = TRUE; - rtap_position += RTAP_L_FCS ; - break ; - } - } - rtap_presentflags /= 2 ; - } + for(i=0 ; i < 15 ; i++) // on teste les 15 premiers bits du champ flag afin de valider la présence et de les copier + { + if ((rtap_presentflags % 2) == 1) + { + switch(i) + { + case RTAP_MACTS: + check[RTAP_MACTS] = TRUE ; + rtap_position += RTAP_L_MACTS ; + break ; + case RTAP_FLAGS: + check[RTAP_FLAGS] = TRUE; + rtap_position += RTAP_L_FLAGS ; + break ; + case RTAP_RATE: + check[RTAP_RATE] = TRUE; + rtap_position += RTAP_L_RATE ; + break ; + case RTAP_CHANNEL: + rtap_position += RTAP_L_CHANNEL ; + rtap_position += RTAP_L_CHANNELTYPE ; + break ; + case RTAP_FHSS: + check[RTAP_FHSS] = TRUE; + rtap_position += RTAP_L_FHSS ; + break ; + case RTAP_ANTENNASIGNALDBM: + memcpy(&(couple.antenna_signal_dbm), &data[rtap_position], RTAP_L_ANTENNASIGNALDBM) ; + check[RTAP_ANTENNASIGNALDBM] = TRUE; + if (GET_VERBOSE()) + printf("Antenna Signal : %d dBm\n", couple.antenna_signal_dbm - 0x100); + rtap_position += RTAP_L_ANTENNASIGNALDBM ; + break ; + case RTAP_ANTENNANOISEDBM: + check[RTAP_ANTENNANOISEDBM] = TRUE; + rtap_position += RTAP_L_ANTENNANOISEDBM ; + break ; + case RTAP_LOCKQUALITY: + check[RTAP_LOCKQUALITY] = TRUE; + rtap_position += RTAP_L_LOCKQUALITY ; + break ; + case RTAP_TXATTENUATION: + check[RTAP_TXATTENUATION] = TRUE; + rtap_position += RTAP_L_TXATTENUATION ; + break ; + case RTAP_TXATTENUATIONDB: + check[RTAP_TXATTENUATIONDB] = TRUE; + rtap_position += RTAP_L_TXATTENUATIONDB ; + break ; + case RTAP_TXATTENUATIONDBM: + check[RTAP_TXATTENUATIONDBM] = TRUE; + rtap_position += RTAP_L_TXATTENUATIONDBM ; + break ; + case RTAP_ANTENNA: + check[RTAP_ANTENNA] = TRUE; + rtap_position += RTAP_L_ANTENNA ; + break ; + case RTAP_ANTENNASIGNALDB: + check[RTAP_ANTENNASIGNALDB] = TRUE; + rtap_position += RTAP_L_ANTENNASIGNALDB ; + break ; + case RTAP_ANTENNANOISEDB: + check[RTAP_ANTENNANOISEDB] = TRUE; + rtap_position += RTAP_L_ANTENNANOISEDB ; + break ; + case RTAP_FCS: + check[RTAP_FCS] = TRUE; + rtap_position += RTAP_L_FCS ; + break ; + } + } + rtap_presentflags /= 2 ; + } - if (GET_VERBOSE()) - { - char *ap_mac_string = mac_bytes_to_string(couple.ap_mac_addr_bytes) ; - char *mobile_mac_string = mac_bytes_to_string(couple.mobile_mac_addr_bytes) ; - printf("\ + if (GET_VERBOSE()) + { + char *ap_mac_string = mac_bytes_to_string(couple.ap_mac_addr_bytes) ; + char *mobile_mac_string = mac_bytes_to_string(couple.mobile_mac_addr_bytes) ; + printf("\ *** Couple à envoyer ***\n\ \tMAC AP : %s\n\ \tMAC mobile : %s\n\ @@ -489,33 +512,26 @@ void read_packet(u_char *args, const struct pcap_pkthdr *header, const u_char *p \tPosition Z : %f\n\ \tDirection : %hhd\n\ ", - ap_mac_string, - mobile_mac_string, - timeval_to_ms(couple.request_time), - timeval_to_ms(couple.start_time), - couple.antenna_signal_dbm - 0x100, - couple.x_position, - couple.y_position, - couple.z_position, - couple.direction - ) ; - free(ap_mac_string) ; - free(mobile_mac_string) ; - } - - /* Envoi du couple au serveur d'aggrégation */ - nsent = sendto(sockfd, (void *) &couple, sizeof(couple), 0, (struct sockaddr *) server, (socklen_t) sizeof(*server)) ; - if (nsent != (ssize_t) sizeof(couple)) - { - perror("Erreur lors de l'envoi du couple au serveur ") ; - return ; - } + ap_mac_string, + mobile_mac_string, + timeval_to_ms(couple.request_time), + timeval_to_ms(couple.start_time), + couple.antenna_signal_dbm - 0x100, + couple.x_position, + couple.y_position, + couple.z_position, + couple.direction + ) ; + free(ap_mac_string) ; + free(mobile_mac_string) ; } - /* Mode passif */ - else if (GET_MODE() == MODE_PASSIVE || GET_MODE() == MODE_MIXED) + /* Envoi du couple au serveur d'aggrégation */ + nsent = sendto(sockfd, (void *) &couple, sizeof(couple), 0, (struct sockaddr *) server, (socklen_t) sizeof(*server)) ; + if (nsent != (ssize_t) sizeof(couple)) { - /* TODO */ + perror("Erreur lors de l'envoi du couple au serveur ") ; + return ; } }