-
Notifications
You must be signed in to change notification settings - Fork 257
Expand file tree
/
Copy pathpcap_packet.js
More file actions
67 lines (57 loc) · 2.31 KB
/
pcap_packet.js
File metadata and controls
67 lines (57 loc) · 2.31 KB
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
var EthernetPacket = require("./ethernet_packet");
var NullPacket = require("./null_packet");
var Ipv4 = require("./ipv4");
var RadioPacket = require("./ieee802.11/radio_packet");
var SLLPacket = require("./sll_packet");
var setLogger = require("../set_logger");
// Setting properties from the C++ side is very slow, so we send in a shared Buffer.
// The C++ side does this:
// memcpy(session->header_data, &(pkthdr->ts.tv_sec), 4);
// memcpy(session->header_data + 4, &(pkthdr->ts.tv_usec), 4);
// memcpy(session->header_data + 8, &(pkthdr->caplen), 4);
// memcpy(session->header_data + 12, &(pkthdr->len), 4);
// And here we unpack those 4 ints from the buffer.
function PcapHeader(raw_header) {
this.tv_sec = raw_header.readUInt32LE(0, true);
this.tv_usec = raw_header.readUInt32LE(4, true);
this.caplen = raw_header.readUInt32LE(8, true);
this.len = raw_header.readUInt32LE(12, true);
}
function PcapPacket(emitter, logger) {
this.link_type = null;
this.pcap_header = null;
this.payload = null;
this.emitter = emitter;
this.logger = console;
this.setLogger(logger);
}
PcapPacket.prototype.setLogger = setLogger;
PcapPacket.prototype.decode = function (packet_with_header) {
this.link_type = packet_with_header.link_type;
this.pcap_header = new PcapHeader(packet_with_header.header);
var buf = packet_with_header.buf.slice(0, this.pcap_header.len);
switch (this.link_type) {
case "LINKTYPE_ETHERNET":
this.payload = new EthernetPacket(this.emitter, this.logger).decode(buf, 0);
break;
case "LINKTYPE_NULL":
this.payload = new NullPacket(this.emitter, this.logger).decode(buf, 0);
break;
case "LINKTYPE_RAW":
this.payload = new Ipv4(this.emitter, this.logger).decode(buf, 0);
break;
case "LINKTYPE_IEEE802_11_RADIO":
this.payload = new RadioPacket(this.emitter, this.logger).decode(buf, 0);
break;
case "LINKTYPE_LINUX_SLL":
this.payload = new SLLPacket(this.emitter, this.logger).decode(buf, 0);
break;
default:
this.logger.log("node_pcap: PcapPacket.decode - Don't yet know how to decode link type " + this.link_type);
}
return this;
};
PcapPacket.prototype.toString = function () {
return this.link_type + " " + this.payload;
};
module.exports = PcapPacket;