Packet.cpp 6.59 KB
Newer Older
/jdi/'s avatar
basics  
/jdi/ committed
1
2
3
4
5
6
7
/*
 * Packet.cpp
 *
 *  Created on: 03.09.2015
 *      Author: jdi
 */

/jdi/'s avatar
/jdi/ committed
8
#include <cstring>
/jdi/'s avatar
basics  
/jdi/ committed
9
#include <cstdlib>
/jdi/'s avatar
/jdi/ committed
10
#include <ctime>
/jdi/'s avatar
basics  
/jdi/ committed
11
#include "Packet.h"
/jdi/'s avatar
/jdi/ committed
12
#include "Types/Types.h"
/jdi/'s avatar
basics  
/jdi/ committed
13
14
15
16
17
18
19

Packet::Packet(OpCode c) {
	srand(time(NULL));
	sequenceId = rand() % 1000;
	opCode = c;
}

/jdi/'s avatar
/jdi/ committed
20
void Packet::printHeader() {
/jdi/'s avatar
/jdi/ committed
21
	std::cout << "Header:\n";
/jdi/'s avatar
/jdi/ committed
22
	std::cout << "\tID:\t\t" << sequenceId << "\n";
/jdi/'s avatar
/jdi/ committed
23
	std::cout << "\tVersion:\t" << (int) version << "\n";
/jdi/'s avatar
/jdi/ committed
24
25
26
27
28
29
30
	std::cout << "\tError:\t\t" << errorCode << "\n";
	std::cout << "\tSwitch MAC:\t" << switchMac << "\n";
	std::cout << "\tHost MAC: \t" << hostMac << "\n";
	std::cout << "\tLength:   \t" << std::dec << this->getLength() << "\n";
	std::cout << "\tOffset:   \t" << fragmentOffset << "\n";
	std::cout << "\tFlags:    \t" << std::hex << flag << "\n";
	std::cout << "\tChecksum: \t" << std::dec << checkSum << "\n";
/jdi/'s avatar
/jdi/ committed
31
32
}

/jdi/'s avatar
basics  
/jdi/ committed
33
34
bytes Packet::getBytes() {
	int i = 0;
/jdi/'s avatar
/jdi/ committed
35
36
	for (auto d : payload)
		push(body, i, d.second);
/jdi/'s avatar
basics  
/jdi/ committed
37
38
39
40
41
42
43
	push(body, i, (int) PACKET_END);
	i = 0;
	push(head, i, version);
	push(head, i, opCode);
	push(head, i, switchMac);
	push(head, i, hostMac);
	push(head, i, sequenceId);
/jdi/'s avatar
/jdi/ committed
44
	push(head, i, errorCode);
/jdi/'s avatar
basics  
/jdi/ committed
45
46
47
48
49
50
51
52
53
	push(head, i, this->getLength());
	push(head, i, fragmentOffset);
	push(head, i, flag);
	push(head, i, tokenId);
	push(head, i, checkSum);
	bytes data = head + body;
	return data;
}

/jdi/'s avatar
/jdi/ committed
54
55
56
57
58
59
60
61
void Packet::parse(bytes data) {
	memcpy(&head[0], &data[0], HEADER_LEN);
	body.resize(data.size() - HEADER_LEN);
	memcpy(&body[0], &data[HEADER_LEN], data.size() - HEADER_LEN);
	int i = 0;
	short checkLen = 0x0;
	pull(head, i, version);
	pull(head, i, opCode);
/jdi/'s avatar
/jdi/ committed
62
63
	pull(head, i, switchMac);
	pull(head, i, hostMac);
/jdi/'s avatar
/jdi/ committed
64
65
66
67
68
69
70
	pull(head, i, sequenceId);
	pull(head, i, errorCode);
	pull(head, i, checkLen);
	pull(head, i, fragmentOffset);
	pull(head, i, flag);
	pull(head, i, tokenId);
	pull(head, i, checkSum);
/jdi/'s avatar
/jdi/ committed
71
	if (this->getLength() != checkLen) {
/jdi/'s avatar
/jdi/ committed
72
		printf("Packet Length doesn't match: %lu != %hd\n", data.size(),
/jdi/'s avatar
/jdi/ committed
73
				checkLen);
/jdi/'s avatar
/jdi/ committed
74
	}
/jdi/'s avatar
/jdi/ committed
75
	i = 0;
/jdi/'s avatar
/jdi/ committed
76
77
	dataset d;
	payload = {};
/jdi/'s avatar
/jdi/ committed
78
79
80
81
82
83
	while (i < (int) body.size() - 4) {
		pull(body, i, d.type);
		pull(body, i, d.len);
		pull(body, i, d.value, d.len);
		payload[d.type] = d;
	}
/jdi/'s avatar
/jdi/ committed
84
85
86
87
88
}

const bytes& Packet::getBody() const {
	return body;
}
/jdi/'s avatar
/jdi/ committed
89

/jdi/'s avatar
/jdi/ committed
90
91
const bytes& Packet::getHead() const {
	return head;
/jdi/'s avatar
/jdi/ committed
92
93
}

/jdi/'s avatar
basics  
/jdi/ committed
94
95
96
97
void Packet::setBody(bytes data) {
	this->body = data;
}

/jdi/'s avatar
/jdi/ committed
98
void Packet::setHostMac(macAddr mac) {
/jdi/'s avatar
basics  
/jdi/ committed
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
	this->hostMac = mac;
}

short Packet::getLength() const {
	return HEADER_LEN + body.size();
}

int Packet::getCheckSum() const {
	return checkSum;
}

void Packet::setCheckSum(int checkSum) {
	this->checkSum = checkSum;
}

short Packet::getSequenceId() const {
	return sequenceId;
}

void Packet::setSequenceId(short sequenceId) {
	this->sequenceId = sequenceId;
}

/jdi/'s avatar
/jdi/ committed
122
macAddr Packet::getSwitchMac() const {
/jdi/'s avatar
basics  
/jdi/ committed
123
124
125
	return switchMac;
}

/jdi/'s avatar
/jdi/ committed
126
void Packet::setSwitchMac(macAddr switchMac) {
/jdi/'s avatar
basics  
/jdi/ committed
127
128
129
130
131
132
133
	this->switchMac = switchMac;
}

const datasets& Packet::getPayload() const {
	return payload;
}

/jdi/'s avatar
/jdi/ committed
134
void Packet::setPayload(datasets payload) {
/jdi/'s avatar
basics  
/jdi/ committed
135
136
137
	this->payload = payload;
}

/jdi/'s avatar
/jdi/ committed
138
139
140
141
142
143
144
145
std::string Packet::opCodeToString() {
	switch (opCode) {
	case DISCOVERY:
		return "DISCOVERY";
	case GET:
		return "GET";
	case SET:
		return "SET";
/jdi/'s avatar
/jdi/ committed
146
147
148
149
	case RECEIVE:
		return "RECEIVE";
	case READ5:
		return "READ5";
/jdi/'s avatar
/jdi/ committed
150
151
152
153
154
155
	default:
		return "NONE";
	}
	return "NONE";
}

/jdi/'s avatar
basics  
/jdi/ committed
156
157
void Packet::encode(bytes &data) {
	int len = data.size();
/jdi/'s avatar
/jdi/ committed
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
	bytes key = { 191, 155, 227, 202, 99, 162, 79, 104, 49, 18, 190, 164, 30,
			76, 189, 131, 23, 52, 86, 106, 207, 125, 126, 169, 196, 28, 172, 58,
			188, 132, 160, 3, 36, 120, 144, 168, 12, 231, 116, 44, 41, 97, 108,
			213, 42, 198, 32, 148, 218, 107, 247, 112, 204, 14, 66, 68, 91, 224,
			206, 235, 33, 130, 203, 178, 1, 134, 199, 78, 249, 123, 7, 145, 73,
			208, 209, 100, 74, 115, 72, 118, 8, 22, 243, 147, 64, 96, 5, 87, 60,
			113, 233, 152, 31, 219, 143, 174, 232, 153, 245, 158, 254, 70, 170,
			75, 77, 215, 211, 59, 71, 133, 214, 157, 151, 6, 46, 81, 94, 136,
			166, 210, 4, 43, 241, 29, 223, 176, 67, 63, 186, 137, 129, 40, 248,
			255, 55, 15, 62, 183, 222, 105, 236, 197, 127, 54, 179, 194, 229,
			185, 37, 90, 237, 184, 25, 156, 173, 26, 187, 220, 2, 225, 0, 240,
			50, 251, 212, 253, 167, 17, 193, 205, 177, 21, 181, 246, 82, 226,
			38, 101, 163, 182, 242, 92, 20, 11, 95, 13, 230, 16, 121, 124, 109,
			195, 117, 39, 98, 239, 84, 56, 139, 161, 47, 201, 51, 135, 250, 10,
			19, 150, 45, 111, 27, 24, 142, 80, 85, 83, 234, 138, 216, 57, 93,
			65, 154, 141, 122, 34, 140, 128, 238, 88, 89, 9, 146, 171, 149, 53,
			102, 61, 114, 69, 217, 175, 103, 228, 35, 180, 252, 200, 192, 165,
			159, 221, 244, 110, 119, 48 };
/jdi/'s avatar
basics  
/jdi/ committed
176
	bytes s = key;
/jdi/'s avatar
/jdi/ committed
177
	int i, j = 0;
/jdi/'s avatar
basics  
/jdi/ committed
178
179
180
	for (int k = 0; k < len; k++) {
		i = (k + 1) % 256;
		j = (j + s[i]) % 256;
/jdi/'s avatar
/jdi/ committed
181
		std::swap(s[i], s[j]);
/jdi/'s avatar
/jdi/ committed
182
		data[k] = data[k] ^ s[(s[i] + s[j]) % 256];
/jdi/'s avatar
basics  
/jdi/ committed
183
184
185
186
	}
}

void Packet::push(bytes &arr, int &index, byte data) {
/jdi/'s avatar
/jdi/ committed
187
	if (arr.size() > (unsigned) index) {
/jdi/'s avatar
/jdi/ committed
188
189
190
191
192
		arr[index++] = data;
	} else {
		arr.push_back(data);
		index++;
	}
/jdi/'s avatar
basics  
/jdi/ committed
193
194
195
196
197
198
199
}

void Packet::push(bytes &arr, int &index, bytes data) {
	for (unsigned j = 0; j < data.size(); j++)
		push(arr, index, data[j]);
}

/jdi/'s avatar
/jdi/ committed
200
void Packet::push(bytes &arr, int &index, ipAddr data) {
/jdi/'s avatar
/jdi/ committed
201
	for (unsigned j = 0; j < 4; j++)
/jdi/'s avatar
/jdi/ committed
202
		push(arr, index, (byte) data[j]);
/jdi/'s avatar
/jdi/ committed
203
204
}

/jdi/'s avatar
/jdi/ committed
205
void Packet::push(bytes &arr, int &index, macAddr data) {
/jdi/'s avatar
/jdi/ committed
206
	for (unsigned j = 0; j < 6; j++)
/jdi/'s avatar
/jdi/ committed
207
		push(arr, index, (byte) data[j]);
/jdi/'s avatar
/jdi/ committed
208
209
}

/jdi/'s avatar
basics  
/jdi/ committed
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
void Packet::push(bytes &arr, int &index, short data) {
	byte a = (data >> 8) & 0xFF;
	push(arr, index, a);
	a = data & 0xFF;
	push(arr, index, a);
}

void Packet::push(bytes &arr, int &index, int data) {
	byte a = (data >> 24) & 0xFF;
	push(arr, index, a);
	a = (data >> 16) & 0xFF;
	push(arr, index, a);
	a = (data >> 8) & 0xFF;
	push(arr, index, a);
	a = data & 0xFF;
	push(arr, index, a);
}

void Packet::push(bytes &arr, int &index, dataset data) {
	push(arr, index, data.type);
	push(arr, index, data.len);
	push(arr, index, data.value);
}

/jdi/'s avatar
/jdi/ committed
234
235
236
237
238
239
240
void Packet::pull(bytes &arr, int &index, byte &ret) {
	ret = arr[index++];
}

void Packet::pull(bytes &arr, int &index, bytes &ret, unsigned len) {
	ret.resize(len);
	memcpy(&ret[0], &arr[index], len);
/jdi/'s avatar
/jdi/ committed
241
	index += len;
/jdi/'s avatar
/jdi/ committed
242
243
}

/jdi/'s avatar
/jdi/ committed
244
245
246
247
248
void Packet::pull(bytes &arr, int &index, macAddr &ret) {
	memcpy(&ret[0], &arr[index], 6);
	index += 6;
}

/jdi/'s avatar
/jdi/ committed
249
void Packet::pull(bytes &arr, int &index, ipAddr &ret) {
/jdi/'s avatar
/jdi/ committed
250
251
	memcpy(&ret[0], &arr[index], 4);
	index += 4;
/jdi/'s avatar
/jdi/ committed
252
253
}

/jdi/'s avatar
/jdi/ committed
254
255
256
void Packet::pull(bytes &arr, int &index, short &ret) {
	ret = (arr[index++] << 8);
	ret |= arr[index++] & 0xFF;
/jdi/'s avatar
/jdi/ committed
257
	ret &= 0xFFFF;
/jdi/'s avatar
/jdi/ committed
258
259
260
261
262
263
264
265
266
267
268
269
270
}

void Packet::pull(bytes &arr, int &index, int &ret) {
	ret = arr[index++] << 24;
	ret |= (arr[index++] & 0xFF) << 16;
	ret |= (arr[index++] & 0xFF) << 8;
	ret |= arr[index++] & 0xFF;
}

void Packet::pull(bytes &arr, int &index, dataset &ret) {
	pull(arr, index, ret.type);
	pull(arr, index, ret.len);
	pull(arr, index, ret.value, (unsigned) ret.len);
/jdi/'s avatar
basics  
/jdi/ committed
271
}