Distinction ports destination

Différentiation du port destination de la demande de localisation
(envoyée par le mobile) et des paquets capturés par l'AP (envoyés au
serveur d'agrégation) :
M    loc-bts/code/ap/apd.c
M    loc-bts/code/librtaputil/rtaputil.h
M    loc-bts/code/client/locclient.c

git-svn-id: https://pif.pu-pm.univ-fcomte.fr/svn/loc@15 785a6c6c-259e-4ff1-8b91-dc31627914f0
This commit is contained in:
Matteo Cypriani 2008-02-20 15:36:44 +00:00
parent 9fd568c817
commit 2751fd7905
3 changed files with 20 additions and 18 deletions

View File

@ -96,20 +96,24 @@ int capture(char *capture_iface, char *aggregated_ip, BOOL print_values)
void read_packet(u_char *args, const struct pcap_pkthdr *header, const u_char *packet, int sockfd, struct sockaddr_in *server, BOOL print_values) void read_packet(u_char *args, const struct pcap_pkthdr *header, const u_char *packet, int sockfd, struct sockaddr_in *server, BOOL print_values)
{ {
unsigned char *data = (unsigned char *) packet ; // Recopie dans data l'adresse du paquet capturé unsigned char *data = (unsigned char *) packet ; // Recopie dans data l'adresse du paquet capturé
unsigned short int rtap_bytes ; // Taille des données reçues unsigned short rtap_bytes ; // Taille des données reçues
unsigned char c ;
int i ;
unsigned int rtap_presentflags, rtap_position ; unsigned int rtap_presentflags, rtap_position ;
couple_message couple ; couple_message couple ; // Message à envoyer à l'agrégateur
ssize_t nsent ; // Retour de sendto ssize_t nsent ; // Retour de sendto
BOOL check[15] ; // Champs présents BOOL check[15] ; // Champs présents
char packet_type ; unsigned char raw_packet_type ; // Type du packet reçu (beacon, data...)
char packet_type ; // Type de demande de localisation (demande, calibration)
unsigned short dst_port ; // Port destination du paquet capturé
int i ; // Compteur
memcpy(&rtap_bytes, &data[2], sizeof(unsigned short int)) ; // 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) 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)
c = data[rtap_bytes] ; // Au bout de l'en-tête rtap il y a celle du 802.11 dont le premier determine le type (beacon ou pas) raw_packet_type = data[rtap_bytes] ; // Au bout de l'en-tête rtap il y a celle du 802.11 dont le premier determine le type (beacon ou pas)
if (c == 0x08 // Si le paquet est de type data, memcpy((unsigned char*) &dst_port, &data[rtap_bytes+24+8+20+3], 1) ; // On récupère le port de destination (mais il faut retourner les deux octets)
memcpy(&((unsigned char*) &dst_port)[1], &data[rtap_bytes+24+8+20+2], 1) ; // (20 : longueur de l'en-tête IP, le port de destination étant les troisièmes et quatrièmes octet suivant).
if (raw_packet_type == 0x08 // Si le paquet est de type data,
&& data[rtap_bytes+24+8+9] == 0x11 // et de protocole UDP (24 : en-tête 802.11, 8 : en-tête LLC, 9 : position du champ "Protocol" de l'en-tête IP), && data[rtap_bytes+24+8+9] == 0x11 // et de protocole UDP (24 : en-tête 802.11, 8 : en-tête LLC, 9 : position du champ "Protocol" de l'en-tête IP),
&& data[rtap_bytes+24+8+20+2] == 0x26 && data[rtap_bytes+24+8+20+3] == 0xac) // et le port de destination est 9900 (20 : longueur de l'en-tête IP, le port de destination étant les troisièmes et quatrièmes octet suivant). && dst_port == LOC_REQUEST_DEFAULT_PORT) // et le port de destination est le bon.
{ {
memcpy(couple.ap_mac_addr_bytes, mac, 6); // On copie la MAC de l'AP 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); // Dans le cas du beacon, l'adresse MAC est 10 octets plus loin memcpy(couple.mobile_mac_addr_bytes, &data[rtap_bytes+10], 6); // Dans le cas du beacon, l'adresse MAC est 10 octets plus loin
@ -124,7 +128,7 @@ void read_packet(u_char *args, const struct pcap_pkthdr *header, const u_char *p
{ {
case PACKET_TYPE_NORMAL : case PACKET_TYPE_NORMAL :
if (print_values) if (print_values)
printf("Paquet normal reçu.\n") ; printf("\nPaquet normal reçu.\n") ;
couple.direction = 0 ; couple.direction = 0 ;
couple.x_position = 0 ; couple.x_position = 0 ;
couple.y_position = 0 ; couple.y_position = 0 ;
@ -133,7 +137,7 @@ void read_packet(u_char *args, const struct pcap_pkthdr *header, const u_char *p
case PACKET_TYPE_CALIBRATION : case PACKET_TYPE_CALIBRATION :
if (print_values) if (print_values)
printf("Paquet de calibration reçu.\n") ; printf("\nPaquet de calibration reçu.\n") ;
couple.direction = data[rtap_bytes+24+8+20+8 + 9]; couple.direction = data[rtap_bytes+24+8+20+8 + 9];
memcpy(&couple.x_position, &data[rtap_bytes+24+8+20+8+10], sizeof(float)); memcpy(&couple.x_position, &data[rtap_bytes+24+8+20+8+10], sizeof(float));
memcpy(&couple.y_position, &data[rtap_bytes+24+8+20+8+14], sizeof(float)); memcpy(&couple.y_position, &data[rtap_bytes+24+8+20+8+14], sizeof(float));
@ -142,7 +146,7 @@ void read_packet(u_char *args, const struct pcap_pkthdr *header, const u_char *p
default : default :
if (print_values) if (print_values)
printf("Paquet bizarre reçu.\n") ; printf("\nPaquet bizarre reçu.\n") ;
fprintf(stderr, "Erreur ! Type de paquet inconnu (%d).\n", packet_type) ; fprintf(stderr, "Erreur ! Type de paquet inconnu (%d).\n", packet_type) ;
return ; return ;
} }
@ -228,14 +232,11 @@ void read_packet(u_char *args, const struct pcap_pkthdr *header, const u_char *p
rtap_presentflags /= 2 ; rtap_presentflags /= 2 ;
} }
if (print_values)
printf("\n") ;
if (print_values) if (print_values)
{ {
char *ap_mac_string = mac_bytes_to_string(couple.ap_mac_addr_bytes) ; 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) ; char *mobile_mac_string = mac_bytes_to_string(couple.mobile_mac_addr_bytes) ;
printf("\n\ printf("\
*** Couple à envoyer ***\n\ *** Couple à envoyer ***\n\
\tMAC AP : %s\n\ \tMAC AP : %s\n\
\tMAC mobile : %s\n\ \tMAC mobile : %s\n\

View File

@ -63,7 +63,7 @@ int main(int argc, char *argv[])
/* Ouverture de la socket UDP vers le serveur d'aggrégation */ /* Ouverture de la socket UDP vers le serveur d'aggrégation */
sockfd = create_udp_sending_socket(argv[1], AGGREGATE_DEFAULT_PORT, &server, &client) ; sockfd = create_udp_sending_socket(argv[1], LOC_REQUEST_DEFAULT_PORT, &server, &client) ;
if (sockfd < 0) if (sockfd < 0)
{ {
perror("Erreur ! Impossible de créer la socket vers le serveur d'aggrégation \n"); perror("Erreur ! Impossible de créer la socket vers le serveur d'aggrégation \n");

View File

@ -25,7 +25,8 @@
#include <net/if.h> #include <net/if.h>
#define AGGREGATE_DEFAULT_PORT 9900 // Port d'échange des données #define LOC_REQUEST_DEFAULT_PORT 9900 // Port sur lequel est envoyée la requête de localisation depuis le mobile
#define AGGREGATE_DEFAULT_PORT 9901 // Port d'échange des données entre AP et serveur d'aggrégation
/* Type booléen */ /* Type booléen */