[Listener] Receive the new request format
Read the packet number and number of packets after the request type. A bit of refactoring was done.
This commit is contained in:
parent
96d1c54e54
commit
07f5b16ca0
|
@ -853,10 +853,10 @@ void read_packet(u_char *args, const struct pcap_pkthdr *header,
|
||||||
{
|
{
|
||||||
owl_captured_request request ; // Message to send to the aggregator
|
owl_captured_request request ; // Message to send to the aggregator
|
||||||
uint16_t rtap_bytes ; // Radiotap header size
|
uint16_t rtap_bytes ; // Radiotap header size
|
||||||
|
uint_fast16_t offset ; // Offset to read the packet
|
||||||
owl_bool rtap_fields[15] ; // Present flags
|
owl_bool rtap_fields[15] ; // Present flags
|
||||||
uint8_t raw_packet_fc1 ; // First byte of the received frame's FC
|
uint8_t raw_packet_fc1 ; // First byte of the received frame's FC
|
||||||
uint8_t raw_packet_fc2 ; // Second byte of the received frame's FC
|
uint8_t raw_packet_fc2 ; // Second byte of the received frame's FC
|
||||||
uint8_t raw_packet_flags ; // IEEE 802.11 header flags
|
|
||||||
// Size of the IEEE 802.11 header:
|
// Size of the IEEE 802.11 header:
|
||||||
uint_fast8_t ieee80211_header_size = IEEE80211_HEADER_SIZE_DATA ;
|
uint_fast8_t ieee80211_header_size = IEEE80211_HEADER_SIZE_DATA ;
|
||||||
uint16_t llc_packet_type = 0 ;
|
uint16_t llc_packet_type = 0 ;
|
||||||
|
@ -878,7 +878,8 @@ void read_packet(u_char *args, const struct pcap_pkthdr *header,
|
||||||
|
|
||||||
// Copy 2 bytes from the 3rd packet byte, that is the size of the rtap
|
// Copy 2 bytes from the 3rd packet byte, that is the size of the rtap
|
||||||
// header (changes with the flags):
|
// header (changes with the flags):
|
||||||
memcpy(&rtap_bytes, &packet[2], sizeof(rtap_bytes)) ;
|
offset = 2 ;
|
||||||
|
memcpy(&rtap_bytes, &packet[offset], sizeof(rtap_bytes)) ;
|
||||||
// Radiotap header is little-endian
|
// Radiotap header is little-endian
|
||||||
rtap_bytes = le16toh(rtap_bytes) ;
|
rtap_bytes = le16toh(rtap_bytes) ;
|
||||||
// Check rtap_bytes for buggy values
|
// Check rtap_bytes for buggy values
|
||||||
|
@ -889,7 +890,16 @@ void read_packet(u_char *args, const struct pcap_pkthdr *header,
|
||||||
// is the first byte of the Frame Control (FC) field, which contains
|
// is the first byte of the Frame Control (FC) field, which contains
|
||||||
// the type of the packet (Management, Control or Data) and its subtype
|
// the type of the packet (Management, Control or Data) and its subtype
|
||||||
// (QoS, etc.):
|
// (QoS, etc.):
|
||||||
raw_packet_fc1 = packet[rtap_bytes] ;
|
offset = rtap_bytes ;
|
||||||
|
raw_packet_fc1 = packet[offset] ;
|
||||||
|
|
||||||
|
// The second byte of the FC field contains the frame flags. The two
|
||||||
|
// first bits indicate the frame source and destination types: the
|
||||||
|
// first bit is "To DS" and the second is "From DS", so if the second
|
||||||
|
// bit is 0 the frame comes from a STA. That's what we want for an
|
||||||
|
// explicit packet:
|
||||||
|
offset = rtap_bytes + 1 ;
|
||||||
|
raw_packet_fc2 = packet[offset] ;
|
||||||
|
|
||||||
if (! IS_DATA_FRAME(raw_packet_fc1)) // Data frame?
|
if (! IS_DATA_FRAME(raw_packet_fc1)) // Data frame?
|
||||||
goto not_explicit_packet ;
|
goto not_explicit_packet ;
|
||||||
|
@ -897,26 +907,19 @@ void read_packet(u_char *args, const struct pcap_pkthdr *header,
|
||||||
if (DATA_FRAME_IS_QOS(raw_packet_fc1)) // QoS Data frame?
|
if (DATA_FRAME_IS_QOS(raw_packet_fc1)) // QoS Data frame?
|
||||||
ieee80211_header_size += 2 ; // 2 bytes of QoS information
|
ieee80211_header_size += 2 ; // 2 bytes of QoS information
|
||||||
|
|
||||||
// The second byte of the FC field contains the frame flags. The two
|
|
||||||
// first bits indicate the frame source and destination types: the
|
|
||||||
// first bit is "To DS" and the second is "From DS", so if the second
|
|
||||||
// bit is 0 the frame comes from a STA. That's what we want for an
|
|
||||||
// explicit packet:
|
|
||||||
raw_packet_fc2 = packet[rtap_bytes+1] ;
|
|
||||||
|
|
||||||
if (! IS_FRAME_FROM_STA(raw_packet_fc2))
|
if (! IS_FRAME_FROM_STA(raw_packet_fc2))
|
||||||
goto not_explicit_packet ;
|
goto not_explicit_packet ;
|
||||||
|
|
||||||
// Get the packet type (protocol, 2 bytes) from the LLC header:
|
// Get the packet type (protocol, 2 bytes) from the LLC header:
|
||||||
memcpy(&llc_packet_type,
|
offset = rtap_bytes + ieee80211_header_size + 6 ;
|
||||||
&packet[rtap_bytes + ieee80211_header_size + 6], 2) ;
|
memcpy(&llc_packet_type, &packet[offset], 2) ;
|
||||||
llc_packet_type = ntohs(llc_packet_type) ;
|
llc_packet_type = ntohs(llc_packet_type) ;
|
||||||
|
|
||||||
if (llc_packet_type != ETHERTYPE_IP) // IP packet?
|
if (llc_packet_type != ETHERTYPE_IP) // IP packet?
|
||||||
goto not_explicit_packet ;
|
goto not_explicit_packet ;
|
||||||
|
|
||||||
packet_ip_header = (struct iphdr *)
|
offset = rtap_bytes + ieee80211_header_size + LLC_HEADER_SIZE ;
|
||||||
&packet[rtap_bytes + ieee80211_header_size + LLC_HEADER_SIZE] ;
|
packet_ip_header = (struct iphdr *) &packet[offset] ;
|
||||||
// Get the source IP:
|
// Get the source IP:
|
||||||
memcpy(request.mobile_ip_addr_bytes, &packet_ip_header->saddr, 4) ;
|
memcpy(request.mobile_ip_addr_bytes, &packet_ip_header->saddr, 4) ;
|
||||||
|
|
||||||
|
@ -929,9 +932,10 @@ void read_packet(u_char *args, const struct pcap_pkthdr *header,
|
||||||
goto not_explicit_packet ;
|
goto not_explicit_packet ;
|
||||||
|
|
||||||
// Check destination port:
|
// Check destination port:
|
||||||
packet_udp_header = (struct udphdr *)
|
offset =
|
||||||
&packet[rtap_bytes + ieee80211_header_size +
|
rtap_bytes + ieee80211_header_size +
|
||||||
LLC_HEADER_SIZE + sizeof(struct iphdr)] ;
|
LLC_HEADER_SIZE + sizeof(struct iphdr) ;
|
||||||
|
packet_udp_header = (struct udphdr *) &packet[offset] ;
|
||||||
dest_port = ntohs(packet_udp_header->dest) ;
|
dest_port = ntohs(packet_udp_header->dest) ;
|
||||||
|
|
||||||
#ifdef USE_PTHREAD
|
#ifdef USE_PTHREAD
|
||||||
|
@ -953,15 +957,12 @@ void read_packet(u_char *args, const struct pcap_pkthdr *header,
|
||||||
|
|
||||||
process_packet :
|
process_packet :
|
||||||
|
|
||||||
// Get 802.11 flags from the 802.11 header:
|
if (IS_RETRY(raw_packet_fc2) && VERBOSE_CHATTERBOX)
|
||||||
raw_packet_flags = packet[rtap_bytes+1] ;
|
|
||||||
|
|
||||||
if (IS_RETRY(raw_packet_flags) && VERBOSE_CHATTERBOX)
|
|
||||||
printf("This packet is a Retry.\n") ;
|
printf("This packet is a Retry.\n") ;
|
||||||
|
|
||||||
// Source MAC address is 10 bytes after the 802.11 packet type:
|
// Source MAC address is 10 bytes after the 802.11 packet type:
|
||||||
memcpy(request.mobile_mac_addr_bytes, &packet[rtap_bytes+10],
|
offset = rtap_bytes + 10 ;
|
||||||
ETHER_ADDR_LEN) ;
|
memcpy(request.mobile_mac_addr_bytes, &packet[offset], ETHER_ADDR_LEN) ;
|
||||||
|
|
||||||
// Drop the packet if it comes from the AP itself:
|
// Drop the packet if it comes from the AP itself:
|
||||||
if (owl_mac_equals(my_mac_bytes, request.mobile_mac_addr_bytes))
|
if (owl_mac_equals(my_mac_bytes, request.mobile_mac_addr_bytes))
|
||||||
|
@ -977,40 +978,31 @@ void read_packet(u_char *args, const struct pcap_pkthdr *header,
|
||||||
if (is_explicit_packet
|
if (is_explicit_packet
|
||||||
&& (GET_MODE() == MODE_ACTIVE || GET_MODE() == MODE_MIXED)
|
&& (GET_MODE() == MODE_ACTIVE || GET_MODE() == MODE_MIXED)
|
||||||
// FIXME: should we really ignore Retries?
|
// FIXME: should we really ignore Retries?
|
||||||
&& ! IS_RETRY(raw_packet_flags))
|
&& ! IS_RETRY(raw_packet_fc2))
|
||||||
{
|
{
|
||||||
request.type =
|
offset =
|
||||||
packet[rtap_bytes + ieee80211_header_size + LLC_HEADER_SIZE
|
rtap_bytes + ieee80211_header_size + LLC_HEADER_SIZE +
|
||||||
+ sizeof(struct iphdr) + sizeof(struct udphdr)] ;
|
sizeof(struct iphdr) + sizeof(struct udphdr) ;
|
||||||
|
request.type = packet[offset] ;
|
||||||
|
extract_packet_numbers(&packet[++offset], &request) ;
|
||||||
|
offset += 2 * sizeof(uint16_t) ;
|
||||||
|
// Copy the timestamp "as is" (i.e. without changing endianess)
|
||||||
|
// because it will return to the network soon:
|
||||||
|
memcpy(&request.request_time, &packet[offset],
|
||||||
|
sizeof(owl_timestamp)) ;
|
||||||
|
offset += sizeof(owl_timestamp) ;
|
||||||
|
|
||||||
switch(request.type)
|
switch(request.type)
|
||||||
{
|
{
|
||||||
case OWL_REQUEST_NORMAL :
|
case OWL_REQUEST_NORMAL :
|
||||||
if (VERBOSE_INFO)
|
if (VERBOSE_INFO)
|
||||||
printf("\nExplicit packet received.\n") ;
|
printf("\nExplicit packet received.\n") ;
|
||||||
extract_packet_numbers(&packet[rtap_bytes +
|
|
||||||
ieee80211_header_size +
|
|
||||||
LLC_HEADER_SIZE +
|
|
||||||
sizeof(struct iphdr) +
|
|
||||||
sizeof(struct udphdr) + 9],
|
|
||||||
&request) ;
|
|
||||||
break ;
|
break ;
|
||||||
|
|
||||||
case OWL_REQUEST_CALIBRATION :
|
case OWL_REQUEST_CALIBRATION :
|
||||||
if (VERBOSE_INFO)
|
if (VERBOSE_INFO)
|
||||||
printf("\nExplicit calibration packet received.\n") ;
|
printf("\nExplicit calibration packet received.\n") ;
|
||||||
extract_calibration_data(&packet[rtap_bytes +
|
extract_calibration_data(&packet[offset], &request) ;
|
||||||
ieee80211_header_size +
|
|
||||||
LLC_HEADER_SIZE +
|
|
||||||
sizeof(struct iphdr) +
|
|
||||||
sizeof(struct udphdr) + 9],
|
|
||||||
&request) ;
|
|
||||||
extract_packet_numbers(&packet[rtap_bytes +
|
|
||||||
ieee80211_header_size +
|
|
||||||
LLC_HEADER_SIZE +
|
|
||||||
sizeof(struct iphdr) +
|
|
||||||
sizeof(struct udphdr) + 10 +
|
|
||||||
3 * sizeof(float)],
|
|
||||||
&request) ;
|
|
||||||
break ;
|
break ;
|
||||||
|
|
||||||
case OWL_REQUEST_AUTOCALIBRATION :
|
case OWL_REQUEST_AUTOCALIBRATION :
|
||||||
|
@ -1021,19 +1013,7 @@ void read_packet(u_char *args, const struct pcap_pkthdr *header,
|
||||||
printf(".. on the wrong port!") ;
|
printf(".. on the wrong port!") ;
|
||||||
putchar('\n') ;
|
putchar('\n') ;
|
||||||
}
|
}
|
||||||
extract_calibration_data(&packet[rtap_bytes +
|
extract_calibration_data(&packet[offset], &request) ;
|
||||||
ieee80211_header_size +
|
|
||||||
LLC_HEADER_SIZE +
|
|
||||||
sizeof(struct iphdr) +
|
|
||||||
sizeof(struct udphdr) + 9],
|
|
||||||
&request) ;
|
|
||||||
extract_packet_numbers(&packet[rtap_bytes +
|
|
||||||
ieee80211_header_size +
|
|
||||||
LLC_HEADER_SIZE +
|
|
||||||
sizeof(struct iphdr) +
|
|
||||||
sizeof(struct udphdr) + 10 +
|
|
||||||
3 * sizeof(float)],
|
|
||||||
&request) ;
|
|
||||||
break ;
|
break ;
|
||||||
|
|
||||||
default :
|
default :
|
||||||
|
@ -1041,11 +1021,6 @@ void read_packet(u_char *args, const struct pcap_pkthdr *header,
|
||||||
printf("\nStrange explicit packet received\n") ;
|
printf("\nStrange explicit packet received\n") ;
|
||||||
fprintf(stderr,
|
fprintf(stderr,
|
||||||
"Error! Unknown request type (%d).\n", request.type) ;
|
"Error! Unknown request type (%d).\n", request.type) ;
|
||||||
is_explicit_packet = owl_false ;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (! is_explicit_packet)
|
|
||||||
{
|
|
||||||
if (GET_MODE() == MODE_ACTIVE)
|
if (GET_MODE() == MODE_ACTIVE)
|
||||||
return ;
|
return ;
|
||||||
else
|
else
|
||||||
|
@ -1056,14 +1031,6 @@ void read_packet(u_char *args, const struct pcap_pkthdr *header,
|
||||||
request.type = OWL_REQUEST_IMPLICIT ;
|
request.type = OWL_REQUEST_IMPLICIT ;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
|
||||||
// Copy the timestamp "as is" (i.e. without changing endianess)
|
|
||||||
// because it will return to the network soon:
|
|
||||||
memcpy(&request.request_time,
|
|
||||||
&packet[rtap_bytes + ieee80211_header_size +
|
|
||||||
LLC_HEADER_SIZE + sizeof(struct iphdr) +
|
|
||||||
sizeof(struct udphdr) + 1],
|
|
||||||
sizeof(owl_timestamp)) ;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
else if (GET_MODE() == MODE_PASSIVE || GET_MODE() == MODE_MIXED)
|
else if (GET_MODE() == MODE_PASSIVE || GET_MODE() == MODE_MIXED)
|
||||||
|
@ -1174,13 +1141,14 @@ void extract_calibration_data(const u_char *packet,
|
||||||
void extract_packet_numbers(const u_char *packet,
|
void extract_packet_numbers(const u_char *packet,
|
||||||
owl_captured_request *request)
|
owl_captured_request *request)
|
||||||
{
|
{
|
||||||
// Number of packets:
|
|
||||||
memcpy(&request->nb_packets, packet, sizeof(uint16_t)) ;
|
|
||||||
request->nb_packets = request->nb_packets ;
|
|
||||||
// Current packet's ID:
|
// Current packet's ID:
|
||||||
memcpy(&request->packet_id, &packet[sizeof(uint16_t)],
|
memcpy(&request->packet_id, packet,
|
||||||
sizeof(uint16_t)) ;
|
sizeof(uint16_t)) ;
|
||||||
request->packet_id = request->packet_id ;
|
request->packet_id = request->packet_id ;
|
||||||
|
// Number of packets:
|
||||||
|
memcpy(&request->nb_packets, &packet[sizeof(uint16_t)],
|
||||||
|
sizeof(uint16_t)) ;
|
||||||
|
request->nb_packets = request->nb_packets ;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue