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)
{
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 char c ;
int i ;
unsigned short rtap_bytes ; // Taille des données reçues
unsigned int rtap_presentflags, rtap_position ;
couple_message couple ;
couple_message couple ; // Message à envoyer à l'agrégateur
ssize_t nsent ; // Retour de sendto
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)
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)
if (c == 0x08 // Si le paquet est de type data,
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)
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)
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+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.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 :
if (print_values)
printf("Paquet normal reçu.\n") ;
printf("\nPaquet normal reçu.\n") ;
couple.direction = 0 ;
couple.x_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 :
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];
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));
@ -142,7 +146,7 @@ void read_packet(u_char *args, const struct pcap_pkthdr *header, const u_char *p
default :
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) ;
return ;
}
@ -228,14 +232,11 @@ void read_packet(u_char *args, const struct pcap_pkthdr *header, const u_char *p
rtap_presentflags /= 2 ;
}
if (print_values)
printf("\n") ;
if (print_values)
{
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("\n\
printf("\
*** Couple à envoyer ***\n\
\tMAC AP : %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 */
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)
{
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>
#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 */