[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
{ // 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) // Sinon on cherche si le couple existe déjà dans la liste
{
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
&& message.request_time.tv_usec == tmp_couple->request_time.tv_usec) // Si le couple existe déjà,
break ; // on s'arrête dessus.
&& 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,12 +387,32 @@ 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));
}
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) ;
@ -510,13 +533,6 @@ void read_packet(u_char *args, const struct pcap_pkthdr *header, const u_char *p
perror("Erreur lors de l'envoi du couple au serveur ") ;
return ;
}
}
/* Mode passif */
else if (GET_MODE() == MODE_PASSIVE || GET_MODE() == MODE_MIXED)
{
/* TODO */
}
}