[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:
parent
24fef29457
commit
629ed77470
|
@ -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);
|
||||
|
|
|
@ -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
|
||||
|
||||
|
||||
|
||||
|
|
|
@ -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) ;
|
||||
|
|
|
@ -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) ;
|
||||
|
@ -512,13 +535,6 @@ void read_packet(u_char *args, const struct pcap_pkthdr *header, const u_char *p
|
|||
}
|
||||
}
|
||||
|
||||
/* Mode passif */
|
||||
else if (GET_MODE() == MODE_PASSIVE || GET_MODE() == MODE_MIXED)
|
||||
{
|
||||
/* TODO */
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
Loading…
Reference in New Issue