[i-c] Mode passif dans aggregator et listener

Implantation (basique) du mode passif dans aggregator et listener.

git-svn-id: https://pif.pu-pm.univ-fcomte.fr/svn/loc@107 785a6c6c-259e-4ff1-8b91-dc31627914f0
This commit is contained in:
Matteo Cypriani 2009-09-03 09:09:48 +00:00
parent 24fef29457
commit 629ed77470
4 changed files with 176 additions and 134 deletions

View File

@ -9,6 +9,7 @@
#include "../../libowlps/owlps.h"
#include <confuse.h>
#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);

View File

@ -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

View File

@ -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 <pcap.h>
@ -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) ;

View File

@ -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 ;
}
}