diff options
Diffstat (limited to 'src/vpn/packet.c')
-rw-r--r-- | src/vpn/packet.c | 40 |
1 files changed, 33 insertions, 7 deletions
diff --git a/src/vpn/packet.c b/src/vpn/packet.c index c4c7dc290..9a895224a 100644 --- a/src/vpn/packet.c +++ b/src/vpn/packet.c | |||
@@ -193,41 +193,67 @@ static void pp_ip6adr(unsigned char* adr, char* dest) {{{ | |||
193 | memcpy(dest+37, tmp, 2); | 193 | memcpy(dest+37, tmp, 2); |
194 | }}} | 194 | }}} |
195 | 195 | ||
196 | void pp_hexdump(unsigned char* data, char* dest, int max) { | 196 | void pp_hexdump(unsigned char* data, char* dest, int max) {{{ |
197 | char tmp[3]; | 197 | char tmp[3]; |
198 | int to = max > 8 ? 8 : max; | 198 | char tmp2[2]; |
199 | int off = 0; | ||
200 | int to = max > 16 ? 16 : max; | ||
199 | for (int i = 0; i < to; i++) { | 201 | for (int i = 0; i < to; i++) { |
202 | if (i == 8) off = 1; | ||
200 | sprintf(tmp, "%02x", data[i]); | 203 | sprintf(tmp, "%02x", data[i]); |
201 | memcpy(dest+(3*i), tmp, 2); | 204 | memcpy(dest+(3*i)+off, tmp, 2); |
205 | if (isprint(data[i])) { | ||
206 | sprintf(tmp2, "%c", data[i]); | ||
207 | memcpy(dest+51+i, tmp2, 1); | ||
208 | } | ||
209 | } | ||
210 | }}} | ||
211 | |||
212 | void pp_write_header(char* dest, struct ip6_pkt* pkt) { | ||
213 | switch (pkt->nxthdr) { | ||
214 | case 0x3a: | ||
215 | memcpy(dest, "ICMPv6)", 7); | ||
216 | break; | ||
217 | default: | ||
218 | memcpy(dest, "unknown)", 8); | ||
219 | break; | ||
202 | } | 220 | } |
203 | } | 221 | } |
204 | 222 | ||
205 | void pkt_printf(struct ip6_pkt* pkt) { | 223 | void pkt_printf(struct ip6_pkt* pkt) { |
206 | char* buf = (char*)malloc(strlen(pretty)+1); | 224 | char* buf = (char*)malloc(strlen(pretty)+1); |
207 | char tmp[4]; | 225 | char tmp[9]; |
208 | 226 | ||
209 | memcpy(buf, pretty, strlen(pretty)+1); | 227 | memcpy(buf, pretty, strlen(pretty)+1); |
210 | 228 | ||
211 | pp_ip6adr(pkt->sadr, buf+16); | 229 | pp_ip6adr(pkt->sadr, buf+16); |
212 | pp_ip6adr(pkt->dadr, buf+76); | 230 | pp_ip6adr(pkt->dadr, buf+76); |
213 | 231 | ||
214 | sprintf(tmp, "%03x", (pkt->flowlbl[0] << 16) + (pkt->flowlbl[1] << 8) + (pkt->flowlbl[2])); | 232 | int flow = (pkt->flowlbl[0] << 16) + (pkt->flowlbl[1] << 8) + (pkt->flowlbl[2]); |
233 | sprintf(tmp, "%03x", flow); | ||
215 | memcpy(buf+138, tmp, 3); | 234 | memcpy(buf+138, tmp, 3); |
235 | sprintf(tmp, "%-8d", flow); | ||
236 | memcpy(buf+143, tmp, 8); | ||
216 | 237 | ||
217 | sprintf(tmp, "%02x", (pkt->paylgth[0] << 8) + (pkt->paylgth[1])); | 238 | int length = (pkt->paylgth[0] << 8) + (pkt->paylgth[1]); |
239 | sprintf(tmp, "%02x", length); | ||
218 | memcpy(buf+198, tmp, 2); | 240 | memcpy(buf+198, tmp, 2); |
241 | sprintf(tmp, "%-3d", length); | ||
242 | memcpy(buf+203, tmp, 3); | ||
219 | 243 | ||
220 | sprintf(tmp, "%02x", pkt->nxthdr); | 244 | sprintf(tmp, "%02x", pkt->nxthdr); |
221 | memcpy(buf+258, tmp, 2); | 245 | memcpy(buf+258, tmp, 2); |
246 | pp_write_header(buf+263, pkt); | ||
222 | 247 | ||
223 | sprintf(tmp, "%02x", pkt->hoplmt); | 248 | sprintf(tmp, "%02x", pkt->hoplmt); |
224 | memcpy(buf+318, tmp, 2); | 249 | memcpy(buf+318, tmp, 2); |
250 | sprintf(tmp, "%-3d", pkt->hoplmt); | ||
251 | memcpy(buf+323, tmp, 3); | ||
225 | 252 | ||
226 | int size = payload(pkt); | 253 | int size = payload(pkt); |
227 | for(int i = 0; i < 8; i++) { | 254 | for(int i = 0; i < 8; i++) { |
228 | if (16*i > size) break; | 255 | if (16*i > size) break; |
229 | pp_hexdump(pkt->data + (16*i), buf + 420 + (i*70), size - 16*i); | 256 | pp_hexdump(pkt->data + (16*i), buf + 420 + (i*70), size - 16*i); |
230 | pp_hexdump(pkt->data + (16*i) + 8, buf + 445 + (i*70), size - (16*i + 8)); | ||
231 | } | 257 | } |
232 | 258 | ||
233 | printf(buf); | 259 | printf(buf); |