diff --git a/loc-bts/code/ap/apd.c b/loc-bts/code/ap/apd.c index e5dd597..76ef87f 100644 --- a/loc-bts/code/ap/apd.c +++ b/loc-bts/code/ap/apd.c @@ -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\ diff --git a/loc-bts/code/client/locclient.c b/loc-bts/code/client/locclient.c index 9701f97..537facc 100644 --- a/loc-bts/code/client/locclient.c +++ b/loc-bts/code/client/locclient.c @@ -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"); diff --git a/loc-bts/code/librtaputil/rtaputil.h b/loc-bts/code/librtaputil/rtaputil.h index 7679233..bf7a178 100644 --- a/loc-bts/code/librtaputil/rtaputil.h +++ b/loc-bts/code/librtaputil/rtaputil.h @@ -25,7 +25,8 @@ #include -#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 */