-
Notifications
You must be signed in to change notification settings - Fork 1
/
handlepacket.cpp
143 lines (127 loc) · 4.4 KB
/
handlepacket.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
#include <iostream>
#include <pcap.h>
#include <string>
#include <cstdlib>
#include <cstring>
#include "packetheader.h"
#include "handlepacket.h"
using namespace std;
void send_packet_with_data (pcap_t *handle, MathPacketHeader header ,u_int8_t buffer[], int length) {
u_int8_t sendbuffer[1000];
int packetsize = 0;
wrap_datalink(pcap_datalink(handle),sendbuffer,&packetsize);
add_IeeeHeader(sendbuffer,&packetsize);
memcpy(sendbuffer+packetsize,&header,19);
packetsize += 19;
memcpy(sendbuffer+packetsize,buffer,length);
packetsize += length;
pcap_inject(handle,sendbuffer,packetsize);
}
void send_ack_packet (pcap_t *handle, MathPacketHeader header) {
u_int8_t sendbuffer[100];
int packetsize = 0;
wrap_datalink(pcap_datalink(handle),sendbuffer,&packetsize);
add_IeeeHeader(sendbuffer,&packetsize);
memcpy(sendbuffer+packetsize,&header,19);
packetsize += 19;
pcap_inject(handle,sendbuffer,packetsize);
}
bool get_packet (pcap_t *handle, MathPacketHeader *header, u_int8_t pktbuffer[] ) {
u_int8_t buffer[1000];
pcap_pkthdr hdr;
MathPacketHeader temphead;
const u_char* temp = pcap_next(handle,&hdr);
if ( hdr.len >= 51 && hdr.len <= 1000 ) {
memcpy(buffer,temp,hdr.len);
get_MathPacketHeader(handle,buffer,&temphead);
if (temphead.number_of_operands <= 150) {
get_packetinfo(handle,&hdr,buffer,header,pktbuffer);
return ( header->magic_number == 9770010 &&
(is_math_type_request(*header) || is_math_type_send_answer(*header)) );
}
}
return false;
}
bool get_ack_packet (pcap_t *handle, MathPacketHeader *header) {
u_int8_t buffer[1000];
pcap_pkthdr hdr;
const u_char* temp = pcap_next(handle,&hdr);
if ( hdr.len >= 51 && hdr.len <= 1000 ) {
memcpy(buffer,temp,hdr.len);
get_MathPacketHeader(handle,buffer,header);
return ( header->magic_number == 9770010 &&
(is_math_type_ack_request(*header) || is_math_type_ack_answer(*header)) );
} else {
return false;
}
}
void get_MathPacketHeader (pcap_t *handle, u_int8_t packet[], MathPacketHeader *header) {
int length = 0;
length = datalink_length(pcap_datalink(handle),packet);
length += 24;
memcpy(header,packet+length,19);
}
void get_packetinfo (pcap_t *handle, pcap_pkthdr *hdr, u_char packet[], MathPacketHeader *header, u_int8_t buffer[]) {
int length = 0;
length = datalink_length(pcap_datalink(handle),packet);
length += 24;
memcpy(header,packet+length,19);
length+=19;
memcpy(buffer,packet+length,6*header->number_of_operands+5);
}
void wrap_datalink ( int datalink, u_int8_t buffer[], int *length) {
if ( datalink == DLT_PRISM_HEADER ) {
const u_int8_t prismHeader[] = {
0x00, 0x00, 0x00, 0x41,
0x08, 0x00, 0x00, 0x00
};
memcpy(buffer,prismHeader,sizeof(prismHeader));
*length += sizeof(prismHeader);
} else if ( datalink == DLT_IEEE802_11_RADIO ) {
const u_int8_t radiotapHeader[] = {
0x00, 0x00,
0x08, 0x00,
0x04, 0x0c, 0x00, 0x00,
};
memcpy(buffer,radiotapHeader,sizeof(radiotapHeader));
*length += sizeof(radiotapHeader);
}
}
void add_IeeeHeader( u_int8_t buffer[], int *length ) {
static u_int8_t u8aIeeeHeader[] = {
0x08, 0x01, 0x00, 0x00, // Frame control + duration
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, // Address 1 (broadcast)
0x13, 0x22, 0x33, 0x44, 0x55, 0x66, // Address 2
0x13, 0x22, 0x33, 0x44, 0x55, 0x66, // Address 3
0x10, 0x86, // Sequence control
};
cout << sizeof(u8aIeeeHeader);
memcpy(buffer+(*length),u8aIeeeHeader,sizeof(u8aIeeeHeader));
(*length) += sizeof(u8aIeeeHeader);
}
int datalink_length ( int datalink, u_int8_t packet[] ) {
int length = 0;
if ( datalink == DLT_PRISM_HEADER ) {
prism_header* hdr = (prism_header*)(packet);
length = hdr->msglen;
} else if ( datalink == DLT_IEEE802_11_RADIO ) {
ieee80211_radiotap_header* hdr = (ieee80211_radiotap_header*)(packet);
length = hdr->it_len;
}
return length;
}
inline bool is_math_type_request ( MathPacketHeader header ) {
return header.type_of_packet == MATH_TYPE_REQUEST;
}
inline bool is_math_type_ack_request ( MathPacketHeader header ) {
return header.type_of_packet == MATH_TYPE_ACK_REQUEST;
}
inline bool is_math_type_send_answer ( MathPacketHeader header ) {
return header.type_of_packet == MATH_TYPE_SEND_ANSWER;
}
inline bool is_math_type_ack_answer ( MathPacketHeader header ) {
return header.type_of_packet == MATH_TYPE_ACK_ANSWER;
}
bool is_request_id_same ( MathPacketHeader header, u_int32_t request_id ) {
return header.request_id == request_id;
}