sipfix
Version:
Oracle SIPFIX Decoder for Node.JS
485 lines (427 loc) • 11.6 kB
JavaScript
/*
IPFIX Parser for ACME types
(c) 2017 QXIP BV
Author: L. Mangani
*/
// SIPFIX Functions
var r = require('restructure');
// Structs
var Header = new r.Struct({
Version: r.uint16,
Length: r.uint16,
ExportTime: r.uint32,
SeqNum: r.uint32,
ObservationID: r.uint32,
SetID: r.uint16,
SetLen: r.uint16
});
var HandShake = new r.Struct({
Version: r.uint16,
Length: r.uint16,
ExportTime: r.uint32,
SeqNum: r.uint32,
ObservationID: r.uint32,
SetID: r.uint16,
SetLen: r.uint16,
MaVer: r.uint16,
MiVer: r.uint16,
CFlags1: r.uint16,
CFlags1: r.uint16,
SFlags: r.uint16,
Timeout: r.uint16,
SystemID: r.uint32,
Product: r.uint16,
Major: r.uint8,
Minor: r.uint8,
Revision: r.uint8,
HostnameLen: r.uint8,
Hostname: new r.String('HostnameLen', 'utf8')
});
var SipOut = new r.Struct({
Version: r.uint16,
Length: r.uint16,
ExportTime: r.uint32,
SeqNum: r.uint32,
ObservationID: r.uint32,
SetID: r.uint16,
SetLen: r.uint16,
TimeSec: r.uint32,
TimeMic: r.uint32,
IntSlot: r.uint8,
IntPort: r.uint8,
IntVlan: r.uint16,
CallIDLen: r.uint8,
CallID: new r.String('CallIDLen', 'utf8'),
CallIDEnd: r.uint8,
IPlen: r.uint16,
VLan: r.uint8,
Tos: r.uint8,
Tlen: r.uint16,
TID: r.uint16,
TFlags: r.uint16,
TTL: r.uint8,
TProto: r.uint8,
TPos: r.uint16,
SrcIP: new r.Array(r.uint8, 4),
DstIP: new r.Array(r.uint8, 4),
DstPort: r.uint16,
SrcPort: r.uint16,
UDPLen: r.uint16,
SipMsgLen: r.uint16,
SipMsg: new r.String('SipMsgLen', 'utf8')
});
var SipIn = new r.Struct({
Version: r.uint16,
Length: r.uint16,
ExportTime: r.uint32,
SeqNum: r.uint32,
ObservationID: r.uint32,
SetID: r.uint16,
SetLen: r.uint16,
TimeSec: r.uint32,
TimeMic: r.uint32,
IntSlot: r.uint8,
IntPort: r.uint8,
IntVlan: r.uint16,
CallIDEnd: r.uint8,
IPlen: r.uint16,
VLan: r.uint8,
Tos: r.uint8,
Tlen: r.uint16,
TID: r.uint16,
TFlags: r.uint16,
TTL: r.uint8,
TProto: r.uint8,
TPos: r.uint16,
SrcIP: new r.Array(r.uint8, 4),
DstIP: new r.Array(r.uint8, 4),
DstPort: r.uint16,
SrcPort: r.uint16,
UDPLen: r.uint16,
SipMsgLen: r.uint16,
SipMsg: new r.String('SipMsgLen', 'utf8')
});
var SipOutTCP = new r.Struct({
Version: r.uint16,
Length: r.uint16,
ExportTime: r.uint32,
SeqNum: r.uint32,
ObservationID: r.uint32,
SetID: r.uint16,
SetLen: r.uint16,
TimeSec: r.uint32,
TimeMic: r.uint32,
IntSlot: r.uint8,
IntPort: r.uint8,
IntVlan: r.uint16,
DstIP: new r.Array(r.uint8, 4),
SrcIP: new r.Array(r.uint8, 4),
DstPort: r.uint16,
SrcPort: r.uint16,
Context: r.uint32,
CallIDLen: r.uint8,
CallID: new r.String('CallIDLen', 'utf8'),
CallIDEnd: r.uint8,
SipMsgLen: r.uint16,
SipMsg: new r.String('SipMsgLen', 'utf8')
});
var SipInTCP = new r.Struct({
Version: r.uint16,
Length: r.uint16,
ExportTime: r.uint32,
SeqNum: r.uint32,
ObservationID: r.uint32,
SetID: r.uint16,
SetLen: r.uint16,
TimeSec: r.uint32,
TimeMic: r.uint32,
IntSlot: r.uint8,
IntPort: r.uint8,
IntVlan: r.uint16,
DstIP: new r.Array(r.uint8, 4),
SrcIP: new r.Array(r.uint8, 4),
DstPort: r.uint16,
SrcPort: r.uint16,
Context: r.uint32,
CallIDEnd: r.uint8,
SipMsgLen: r.uint16,
SipMsg: new r.String('SipMsgLen', 'utf8')
});
var StatsQos = new r.Struct({
Version: r.uint16,
Length: r.uint16,
ExportTime: r.uint32,
SeqNum: r.uint32,
ObservationID: r.uint32,
SetID: r.uint16,
SetLen: r.uint16,
IncRtpBytes: r.uint32,
IncRtpPackets: r.uint32,
IncRtpLostPackets: r.uint32,
IncRtpAvgJitter: r.uint32,
IncRtpMaxJitter: r.uint32,
IncRtcpBytes: r.uint32,
IncRtcpPackets: r.uint32,
IncRtcpLostPackets: r.uint32,
IncRtcpAvgJitter: r.uint32,
IncRtcpMaxJitter: r.uint32,
IncRtcpAvgLat: r.uint32,
IncRtcpMaxLat: r.uint32,
IncrVal: r.uint32,
IncMos: r.uint32,
OutRtpBytes: r.uint32,
OutRtpPackets: r.uint32,
OutRtpLostPackets: r.uint32,
OutRtpAvgJitter: r.uint32,
OutRtpMaxJitter: r.uint32,
OutRtcpBytes: r.uint32,
OutRtcpPackets: r.uint32,
OutRtcpLostPackets: r.uint32,
OutRtcpAvgJitter: r.uint32,
OutRtcpMaxJitter: r.uint32,
OutRtcpAvgLat: r.uint32,
OutRtcpMaxLat: r.uint32,
OutrVal: r.uint32,
OutMos: r.uint32,
Type: r.uint8,
CallerIncSrcIP: new r.Array(r.uint8, 4),
CallerIncDstIP: new r.Array(r.uint8, 4),
CallerIncSrcPort: r.uint16,
CallerIncDstPort: r.uint16,
CalleeIncSrcIP: new r.Array(r.uint8, 4),
CalleeIncDstIP: new r.Array(r.uint8, 4),
CalleeIncSrcPort: r.uint16,
CalleeIncDstPort: r.uint16,
CallerOutSrcIP: new r.Array(r.uint8, 4),
CallerOutDstIP: new r.Array(r.uint8, 4),
CallerOutSrcPort: r.uint16,
CallerOutDstPort: r.uint16,
CalleeOutSrcIP: new r.Array(r.uint8, 4),
CalleeOutDstIP: new r.Array(r.uint8, 4),
CalleeOutSrcPort: r.uint16,
CalleeOutDstPort: r.uint16,
CallerIntSlot: r.uint8,
CallerIntPort: r.uint8,
CallerIntVlan: r.uint16,
CalleeIntSlot: r.uint8,
CalleeIntPort: r.uint8,
CalleeIntVlan: r.uint16,
BeginTimeSec: r.uint32,
BeginTimeMic: r.uint32,
EndTimeSec: r.uint32,
EndinTimeMic: r.uint32,
Seperator: r.uint8,
IncRealmLen: r.uint16,
IncRealm: new r.String('IncRealmLen', 'utf8'),
IncRealmEnd: r.uint8,
OutRealmLen: r.uint16,
OutRealm: new r.String('OutRealmLen', 'utf8'),
OutRealmEnd: r.uint8,
IncCallIDLen: r.uint16,
IncCallID: new r.String('IncCallIDLen', 'utf8'),
IncCallIDEnd: r.uint8,
OutCallIDLen: r.uint16,
OutCallID: new r.String('OutCallIDLen', 'utf8')
});
// Exports
exports.version = "1.0.1";
exports.readHeader = function(buffer){
var stream = new r.DecodeStream(buffer);
try { return Header.decode(stream); } catch (e) { console.log(e); return null; }
};
exports.writeHeader = function(result){
var stream = new r.EncodeStream();
Header.encode(stream, result);
try { return stream.buffer; } catch (e) { console.log(e); return null; }
};
exports.readHandshake = function(buffer){
var stream = new r.DecodeStream(buffer);
try { return HandShake.decode(stream); } catch (e) { console.log(e); return null; }
};
exports.writeHandshake = function(result){
var stream = new r.EncodeStream();
HandShake.encode(stream, result);
try { return stream.buffer; } catch (e) { console.log(e); return null; }
};
exports.SipIn = function(buffer){
var stream = new r.DecodeStream(buffer);
try { return SipIn.decode(stream); } catch(e) { console.log(e); return null; }
};
exports.SipOut = function(buffer){
var stream = new r.DecodeStream(buffer);
try { return SipOut.decode(stream); } catch(e) { console.log(e); return null; }
};
exports.SipInTCP = function(buffer){
var stream = new r.DecodeStream(buffer);
try { return SipInTCP.decode(stream); } catch(e) { console.log(e); return null; }
};
exports.SipOutTCP = function(buffer){
var stream = new r.DecodeStream(buffer);
try { return SipOutTCP.decode(stream); } catch(e) { console.log(e); return null; }
};
exports.StatsQos = function(buffer){
try { return StatsQos.decode( new r.DecodeStream(buffer) ); } catch(e) { console.log(e); return null; }
};
// QoS Handling for HEPFIX.JS
/* RTP PAYLOAD INC/OUT */
exports.getPayloadIncRTP = function(qos){
return {
"CORRELATION_ID": qos.IncCallID ,
"RTP_SIP_CALL_ID": qos.IncCallID ,
"REPORT_TS": qos.BeginTimeSec,
"TL_BYTE": qos.IncRtpBytes,
"SKEW":0.000,
"TOTAL_PK": qos.IncRtpPackets,
"EXPECTED_PK": (qos.IncRtpPackets+qos.IncRtpLostPackets) ,
"PACKET_LOSS": qos.IncRtpLostPackets,
"SEQ":0,
"JITTER": qos.IncRtpAvgJitter,
"MAX_JITTER": qos.IncRtpMaxJitter,
"MEAN_JITTER": qos.IncRtpAvgJitter,
"DELTA":0.000,
"MAX_DELTA": 0.000,
"MAX_SKEW":0.000,
"MIN_MOS": qos.IncMos,
"MEAN_MOS": qos.IncMos,
"MOS": qos.IncMos,
"RFACTOR": qos.IncrVal,
"MIN_RFACTOR": qos.IncrVal,
"MEAN_RFACTOR": qos.IncrVal,
"SRC_IP": qos.CallerIncSrcIP ,
"SRC_PORT": qos.CallerIncSrcPort,
"DST_IP": qos.CallerIncDstIP ,
"DST_PORT": qos.CallerIncSrcPort,
"SRC_MAC":"00-00-00-00-00-00",
"DST_MAC":"00-00-00-00-00-00",
"OUT_ORDER":0,
"SSRC_CHG":0,
"CODEC_PT": qos.Type,
"CLOCK":8000,
"CODEC_NAME": qos.Type ,
"DIR":0,
"REPORT_NAME": "RTP:"+qos.IncRealm+':'+ qos.OutRealm ,
"PARTY":0,
"TYPE":"PERIODIC"
};
};
exports.getPayloadOutRTP = function(qos){
return {
"CORRELATION_ID": qos.OutCallID ,
"RTP_SIP_CALL_ID": qos.OutCallID ,
"REPORT_TS": qos.BeginTimeSec,
"TL_BYTE": qos.OutRtpBytes,
"SKEW":0.000,
"TOTAL_PK": qos.OutRtpPackets,
"EXPECTED_PK": (qos.OutRtpPackets+qos.OutRtpLostPackets),
"PACKET_LOSS": qos.OutRtpLostPackets,
"SEQ":0,
"JITTER": qos.OutRtpAvgJitter,
"MAX_JITTER": qos.OutRtpMaxJitter,
"MEAN_JITTER": qos.OutRtpAvgJitter,
"DELTA":0.000,
"MAX_DELTA": 0.000,
"MAX_SKEW":0.000,
"MIN_MOS": qos.OutMos,
"MEAN_MOS": qos.OutMos,
"MOS": qos.OutMos,
"RFACTOR": qos.OutrVal,
"MIN_RFACTOR": qos.OutrVal,
"MEAN_RFACTOR": qos.OutrVal,
"SRC_IP": qos.CalleeOutSrcIP ,
"SRC_PORT": qos.CalleeOutSrcPort,
"DST_IP": qos.CalleeOutDstIP ,
"DST_PORT": qos.CalleeOutDstPort,
"SRC_MAC":"00-00-00-00-00-00",
"DST_MAC":"00-00-00-00-00-00",
"OUT_ORDER":0,
"SSRC_CHG":0,
"CODEC_PT": qos.Type,
"CLOCK":8000,
"CODEC_NAME": qos.Type ,
"DIR":1,
"REPORT_NAME": "RTP:"+qos.OutRealm+':'+ qos.IncRealm ,
"PARTY":1,
"TYPE":"PERIODIC"
};
};
/* RTCP PAYLOAD INC/OUT: */
exports.getPayloadIncRTCP = function(qos){
return {
"CORRELATION_ID": qos.IncCallID ,
"RTP_SIP_CALL_ID": qos.IncCallID ,
"REPORT_TS": qos.BeginTimeSec,
"TL_BYTE": qos.IncRtcpBytes,
"SKEW":0.000,
"TOTAL_PK": qos.IncRtcpPackets,
"EXPECTED_PK": (qos.IncRtcpPackets+qos.IncRtcpLostPackets),
"PACKET_LOSS": qos.IncRtcpLostPackets,
"SEQ":0,
"JITTER": qos.IncRtcpAvgJitter,
"MAX_JITTER": qos.IncRtcpMaxJitter,
"MEAN_JITTER": qos.IncRtcpAvgJitter,
"DELTA": qos.IncRtcpAvgLat,
"MAX_DELTA": qos.IncRtcpMaxLat,
"MAX_SKEW":0.000,
"MIN_MOS": qos.IncMos,
"MEAN_MOS": qos.IncMos,
"MOS": qos.IncMos,
"RFACTOR": qos.IncrVal,
"MIN_RFACTOR": qos.IncrVal,
"MEAN_RFACTOR": qos.IncrVal,
"SRC_IP": qos.CallerIncSrcIP ,
"SRC_PORT": qos.CallerIncSrcPort,
"DST_IP": qos.CallerIncDstIP ,
"DST_PORT": qos.CallerIncSrcPort,
"SRC_MAC":"00-00-00-00-00-00",
"DST_MAC":"00-00-00-00-00-00",
"OUT_ORDER":0,
"SSRC_CHG":0,
"CODEC_PT": qos.Type,
"CLOCK":8000,
"CODEC_NAME": qos.Type ,
"DIR":0,
"REPORT_NAME": "RTCP:"+qos.IncRealm+':'+ qos.OutRealm ,
"PARTY":0,
"TYPE":"PERIODIC"
};
};
exports.getPayloadOutRTCP = function(qos){
return {
"CORRELATION_ID": qos.OutCallID ,
"RTP_SIP_CALL_ID": qos.OutCallID ,
"REPORT_TS": qos.BeginTimeSec,
"TL_BYTE": qos.OutRtcpBytes,
"SKEW":0.000,
"TOTAL_PK": qos.OutRtcpPackets,
"EXPECTED_PK": (qos.OutRtcpPackets+qos.OutRtcpLostPackets),
"PACKET_LOSS": qos.OutRtcpLostPackets,
"SEQ":0,
"JITTER": qos.OutRtcpAvgJitter,
"MAX_JITTER": qos.OutRtcpMaxJitter,
"MEAN_JITTER": qos.OutRtcpAvgJitter,
"DELTA": qos.OutRtcpAvgLat,
"MAX_DELTA": qos.OutRtcpMaxLat,
"MAX_SKEW":0.000,
"MIN_MOS": qos.OutMos,
"MEAN_MOS": qos.OutMos,
"MOS": qos.OutMos,
"RFACTOR": qos.OutrVal,
"MIN_RFACTOR": qos.OutrVal,
"MEAN_RFACTOR": qos.OutrVal,
"SRC_IP": qos.CalleeOutSrcIP ,
"SRC_PORT": qos.CalleeOutSrcPort,
"DST_IP": qos.CalleeOutDstIP ,
"DST_PORT": qos.CalleeOutDstPort,
"SRC_MAC":"00-00-00-00-00-00",
"DST_MAC":"00-00-00-00-00-00",
"OUT_ORDER":0,
"SSRC_CHG":0,
"CODEC_PT": qos.Type,
"CLOCK":8000,
"CODEC_NAME": qos.Type ,
"DIR":1,
"REPORT_NAME": "RTCP:"+qos.OutRealm+':'+ qos.IncRealm ,
"PARTY":1,
"TYPE":"PERIODIC"
};
};