Comparing version 0.3.3 to 0.4.0
{ | ||
"name" : "pcap", | ||
"version" : "0.3.3", | ||
"version" : "0.4.0", | ||
"description" : "raw packet capture, decoding, and analysis", | ||
@@ -13,3 +13,6 @@ "author": "Matt Ranney <mjr@ranney.com>", | ||
"url": "git://github.com/mranney/node_pcap.git" | ||
}, | ||
"dependencies": { | ||
"socketwatcher": "~0.1.0" | ||
} | ||
} |
151
pcap.js
/*global process require exports console */ | ||
var util, IOWatcher, | ||
dns = require('dns'), | ||
Buffer = require('buffer').Buffer, | ||
events = require('events'), | ||
binding = require('./build/Release/pcap_binding'), | ||
HTTPParser = process.binding('http_parser').HTTPParser, | ||
url = require('url'); | ||
var util = require('util'), | ||
dns = require('dns'), | ||
events = require('events'), | ||
binding = require('./build/Release/pcap_binding'), | ||
HTTPParser = process.binding('http_parser').HTTPParser, | ||
url = require('url'), | ||
SocketWatcher = require("socketwatcher"); | ||
if (process.versions && process.versions.node && process.versions.node.split('.')[1] >= 3) { | ||
util = require("util"); | ||
IOWatcher = process.binding('io_watcher').IOWatcher; | ||
} else { | ||
util = require('util'); | ||
IOWatcher = process.IOWatcher; | ||
} | ||
function Pcap() { | ||
@@ -54,3 +46,3 @@ this.opened = false; | ||
this.opened = true; | ||
this.readWatcher = new IOWatcher(); | ||
this.readWatcher = new SocketWatcher(); | ||
this.empty_reads = 0; | ||
@@ -73,3 +65,3 @@ this.buf = new Buffer(65535); | ||
// from a savefile there will be no more packets left. this check ensures | ||
// we stop reading. Under certain circumstances IOWatcher will get caught | ||
// we stop reading. Under certain circumstances SocketWatcher will get caught | ||
// in a loop and continue to signal us causing the program to be flooded | ||
@@ -142,6 +134,6 @@ // with events. | ||
sll_addr: function (raw_packet, offset, len) { | ||
var res = [] | ||
for (i=0; i<len; i++){ | ||
res.push(lpad(raw_packet[offset+i].toString(16), 2)); | ||
} | ||
var res = [], i; | ||
for (i=0; i<len; i++){ | ||
res.push(lpad(raw_packet[offset+i].toString(16), 2)); | ||
} | ||
@@ -184,35 +176,36 @@ return res.join(":"); | ||
}, | ||
ipv6_addr: function (raw_packet, offset) { | ||
var ret = ''; | ||
var octets = []; | ||
for (var i=offset; i<offset+16; i+=2) { | ||
octets.push(unpack.uint16(raw_packet,i).toString(16)); | ||
} | ||
var curr_start, curr_len = undefined; | ||
var max_start, max_len = undefined; | ||
for(var i = 0; i < 8; i++){ | ||
if(octets[i] == "0"){ | ||
if(curr_start === undefined){ | ||
curr_len = 1; | ||
curr_start = i; | ||
}else{ | ||
curr_len++; | ||
if(!max_start || curr_len > max_len){ | ||
max_start = curr_start; | ||
max_len = curr_len; | ||
} | ||
} | ||
}else{ | ||
curr_start = undefined; | ||
} | ||
} | ||
ipv6_addr: function (raw_packet, offset) { | ||
var i; | ||
var ret = ''; | ||
var octets = []; | ||
for (i=offset; i<offset+16; i+=2) { | ||
octets.push(unpack.uint16(raw_packet,i).toString(16)); | ||
} | ||
var curr_start, curr_len; | ||
var max_start, max_len; | ||
for(i = 0; i < 8; i++){ | ||
if(octets[i] == "0"){ | ||
if(curr_start === undefined){ | ||
curr_len = 1; | ||
curr_start = i; | ||
}else{ | ||
curr_len++; | ||
if(!max_start || curr_len > max_len){ | ||
max_start = curr_start; | ||
max_len = curr_len; | ||
} | ||
} | ||
}else{ | ||
curr_start = undefined; | ||
} | ||
} | ||
if(max_start !== undefined){ | ||
var tosplice = max_start == 0 || (max_start + max_len > 7) ? ":" : ""; | ||
octets.splice(max_start, max_len,tosplice); | ||
if(max_len == 8){octets.push("");} | ||
} | ||
ret = octets.join(":"); | ||
return ret; | ||
} | ||
if(max_start !== undefined){ | ||
var tosplice = max_start === 0 || (max_start + max_len > 7) ? ":" : ""; | ||
octets.splice(max_start, max_len,tosplice); | ||
if(max_len == 8){octets.push("");} | ||
} | ||
ret = octets.join(":"); | ||
return ret; | ||
} | ||
}; | ||
@@ -383,3 +376,3 @@ exports.unpack = unpack; | ||
ret.dhost = ret.ieee802_11Frame.dhost; | ||
delete ret.ieee802_11Frame.dhost | ||
delete ret.ieee802_11Frame.dhost; | ||
} | ||
@@ -434,4 +427,4 @@ | ||
ret.ssap = raw_packet[offset++]; | ||
if(((ret.dsap == 0xaa) && (ret.ssap == 0xaa)) | ||
|| ((ret.dsap == 0x00) && (ret.ssap == 0x00))) { | ||
if(((ret.dsap == 0xaa) && (ret.ssap == 0xaa)) || | ||
((ret.dsap === 0x00) && (ret.ssap === 0x00))) { | ||
ret.controlField = raw_packet[offset++]; | ||
@@ -455,3 +448,3 @@ ret.orgCode = [ | ||
return ret; | ||
} | ||
}; | ||
@@ -563,3 +556,3 @@ decode.vlan = function (raw_packet, offset) { | ||
// TODO: capture the extensions | ||
//decode.ip6_header(raw_packet, raw_packet[offset], offset + raw_packet[offset+1]); | ||
//decode.ip6_header(raw_packet, raw_packet[offset], offset + raw_packet[offset+1]); | ||
} | ||
@@ -573,16 +566,16 @@ }; | ||
ret.version = (raw_packet[offset] & 240) >> 4; // first 4 bits | ||
ret.traffic_class = ((raw_packet[offset] & 15) << 4) + ((raw_packet[offset+1] & 240) >> 4); | ||
ret.flow_label = ((raw_packet[offset + 1] & 15) << 16) + | ||
ret.traffic_class = ((raw_packet[offset] & 15) << 4) + ((raw_packet[offset+1] & 240) >> 4); | ||
ret.flow_label = ((raw_packet[offset + 1] & 15) << 16) + | ||
(raw_packet[offset + 2] << 8) + | ||
raw_packet[offset + 3]; | ||
ret.payload_length = unpack.uint16(raw_packet, offset+4); | ||
ret.total_length = ret.payload_length + 40; | ||
ret.next_header = raw_packet[offset+6]; | ||
ret.hop_limit = raw_packet[offset+7]; | ||
ret.saddr = unpack.ipv6_addr(raw_packet, offset+8); | ||
ret.daddr = unpack.ipv6_addr(raw_packet, offset+24); | ||
ret.header_bytes = 40; | ||
ret.payload_length = unpack.uint16(raw_packet, offset+4); | ||
ret.total_length = ret.payload_length + 40; | ||
ret.next_header = raw_packet[offset+6]; | ||
ret.hop_limit = raw_packet[offset+7]; | ||
ret.saddr = unpack.ipv6_addr(raw_packet, offset+8); | ||
ret.daddr = unpack.ipv6_addr(raw_packet, offset+24); | ||
ret.header_bytes = 40; | ||
decode.ip6_header(raw_packet, ret.next_header, ret, offset+40); | ||
return ret; | ||
decode.ip6_header(raw_packet, ret.next_header, ret, offset+40); | ||
return ret; | ||
}; | ||
@@ -726,19 +719,19 @@ | ||
ret.version = ret.max_response_time > 0 ? 2 : 1; | ||
ret.type_desc = "Membership Query" | ||
ret.type_desc = "Membership Query"; | ||
break; | ||
case 0x12: | ||
ret.version = 1; | ||
ret.type_desc = "Membership Report" | ||
ret.type_desc = "Membership Report"; | ||
break; | ||
case 0x16: | ||
ret.version = 2; | ||
ret.type_desc = "Membership Report" | ||
ret.type_desc = "Membership Report"; | ||
break; | ||
case 0x17: | ||
ret.version = 2; | ||
ret.type_desc = "Leave Group" | ||
ret.type_desc = "Leave Group"; | ||
break; | ||
case 0x22: | ||
ret.version = 3; | ||
ret.type_desc = "Membership Report" | ||
ret.type_desc = "Membership Report"; | ||
// TODO: Decode v3 message | ||
@@ -752,3 +745,3 @@ break; | ||
return ret; | ||
} | ||
}; | ||
@@ -975,3 +968,3 @@ decode.udp = function (raw_packet, offset) { | ||
internal_offset++; | ||
if(lenOrPtr == 0x00) { | ||
if(lenOrPtr === 0x00) { | ||
return result; | ||
@@ -1007,3 +1000,3 @@ } | ||
var ch; | ||
while((ch = raw_packet[internal_offset++]) != 0x00) { | ||
while((ch = raw_packet[internal_offset++]) !== 0x00) { | ||
result.name += String.fromCharCode(ch); | ||
@@ -1032,3 +1025,3 @@ } | ||
decodeRRs: function(raw_packet, offset, internal_offset, count, results) { | ||
for (i = 0; i < count; i++) { | ||
for (var i = 0; i < count; i++) { | ||
results[i] = {}; | ||
@@ -1218,3 +1211,3 @@ internal_offset = dns_util.decodeRR(raw_packet, offset, internal_offset, results[i]); | ||
print.slltype = function (packet) { | ||
var ret = "" | ||
var ret = ""; | ||
@@ -1221,0 +1214,0 @@ switch (packet.link.ethertype) { |
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
301915
1
3532
+ Addedsocketwatcher@~0.1.0
+ Addedsocketwatcher@0.1.2(transitive)