ntopng/scripts/lua/modules/flow_utils.lua
2016-04-19 11:06:39 +02:00

1179 lines
53 KiB
Lua

--
-- (C) 2013-16 - ntop.org
--
dirs = ntop.getDirs()
package.path = dirs.installdir .. "/scripts/lua/modules/?.lua;" .. package.path
require "template"
-- http://www.itu.int/itudoc/itu-t/ob-lists/icc/e212_685.pdf
local mobile_country_code = {
["202"] = "Greece",
["204"] = "Netherlands (Kingdom of the)",
["206"] = "Belgium",
["208"] = "France",
["212"] = "Monaco (Principality of)",
["213"] = "Andorra (Principality of)",
["214"] = "Spain",
["216"] = "Hungary (Republic of)",
["218"] = "Bosnia and Herzegovina",
["219"] = "Croatia (Republic of)",
["220"] = "Serbia and Montenegro",
["222"] = "Italy",
["225"] = "Vatican City State",
["226"] = "Romania",
["228"] = "Switzerland (Confederation of)",
["230"] = "Czech Republic",
["231"] = "Slovak Republic",
["232"] = "Austria",
["234"] = "United Kingdom",
["235"] = "United Kingdom",
["238"] = "Denmark",
["240"] = "Sweden",
["242"] = "Norway",
["244"] = "Finland",
["246"] = "Lithuania (Republic of)",
["247"] = "Latvia (Republic of)",
["248"] = "Estonia (Republic of)",
["250"] = "Russian Federation",
["255"] = "Ukraine",
["257"] = "Belarus (Republic of)",
["259"] = "Moldova (Republic of)",
["260"] = "Poland (Republic of)",
["262"] = "Germany (Federal Republic of)",
["266"] = "Gibraltar",
["268"] = "Portugal",
["270"] = "Luxembourg",
["272"] = "Ireland",
["274"] = "Iceland",
["276"] = "Albania (Republic of)",
["278"] = "Malta",
["280"] = "Cyprus (Republic of)",
["282"] = "Georgia",
["283"] = "Armenia (Republic of)",
["284"] = "Bulgaria (Republic of)",
["286"] = "Turkey",
["288"] = "Faroe Islands",
["290"] = "Greenland (Denmark)",
["292"] = "San Marino (Republic of)",
["293"] = "Slovenia (Republic of)",
["294"] = "The Former Yugoslav Republic of Macedonia",
["295"] = "Liechtenstein (Principality of)",
["302"] = "Canada",
["308"] = "Saint Pierre and Miquelon",
["310"] = "United States of America",
["311"] = "United States of America",
["312"] = "United States of America",
["313"] = "United States of America",
["314"] = "United States of America",
["315"] = "United States of America",
["316"] = "United States of America",
["330"] = "Puerto Rico",
["332"] = "United States Virgin Islands",
["334"] = "Mexico",
["338"] = "Jamaica",
["340"] = "Martinique / Guadeloupe",
["342"] = "Barbados",
["344"] = "Antigua and Barbuda",
["346"] = "Cayman Islands",
["348"] = "British Virgin Islands",
["350"] = "Bermuda",
["352"] = "Grenada",
["354"] = "Montserrat",
["356"] = "Saint Kitts and Nevis",
["358"] = "SaintLucia",
["360"] = "Saint Vincent and the Grenadines",
["362"] = "Netherlands Antilles",
["363"] = "Aruba",
["364"] = "Bahamas (Commonwealth of the)",
["365"] = "Anguilla",
["366"] = "Dominica (Commonwealth of)",
["368"] = "Cuba",
["370"] = "Dominican Republic",
["372"] = "Haiti (Republic of)",
["374"] = "Trinidad and Tobago",
["376"] = "Turks and Caicos Islands",
["400"] = "Azerbaijani Republic",
["401"] = "Kazakhstan (Republic of)",
["402"] = "Bhutan (Kingdom of)",
["404"] = "India (Republic of)",
["410"] = "Pakistan (Islamic Republic of)",
["412"] = "Afghanistan",
["413"] = "Sri Lanka (Democratic Socialist Republic of)",
["414"] = "Myanmar (Union of)",
["415"] = "Lebanon",
["416"] = "Jordan (Hashemite Kingdom of)",
["417"] = "Syrian Arab Republic",
["418"] = "Iraq (Republic of)",
["419"] = "Kuwait (State of)",
["420"] = "Saudi Arabia (Kingdom of)",
["421"] = "Yemen (Republic of)",
["422"] = "Oman (Sultanate of)",
["424"] = "United Arab Emirates",
["425"] = "Israel (State of)",
["426"] = "Bahrain (Kingdom of)",
["427"] = "Qatar (State of)",
["428"] = "Mongolia",
["429"] = "Nepal",
["430"] = "United Arab Emirates b",
["431"] = "United Arab Emirates b",
["432"] = "Iran (Islamic Republic of)",
["434"] = "Uzbekistan (Republic of)",
["436"] = "Tajikistan (Republic of)",
["437"] = "Kyrgyz Republic",
["438"] = "Turkmenistan",
["440"] = "Japan",
["441"] = "Japan",
["450"] = "Korea (Republic of)",
["452"] = "Viet Nam (Socialist Republic of)",
["454"] = "Hongkong China",
["455"] = "Macao China",
["456"] = "Cambodia (Kingdom of)",
["457"] = "Lao People's Democratic Republic",
["460"] = "China (People's Republic of)",
["461"] = "China (People's Republic of)",
["466"] = "Taiwan",
["467"] = "Democratic People's Republic of Korea",
["470"] = "Bangladesh (People's Republic of)",
["472"] = "Maldives (Republic of)",
["502"] = "Malaysia",
["505"] = "Australia",
["510"] = "Indonesia (Republic of)",
["514"] = "Democratique Republic of Timor-Leste",
["515"] = "Philippines (Republic of the)",
["520"] = "Thailand",
["525"] = "Singapore (Republic of)",
["528"] = "Brunei Darussalam",
["530"] = "New Zealand",
["534"] = "Northern Mariana Islands (Commonwealth of the)",
["535"] = "Guam",
["536"] = "Nauru (Republic of)",
["537"] = "Papua New Guinea",
["539"] = "Tonga (Kingdom of)",
["540"] = "Solomon Islands",
["541"] = "Vanuatu (Republic of)",
["542"] = "Fiji (Republic of)",
["543"] = "Wallis and Futuna",
["544"] = "American Samoa",
["545"] = "Kiribati (Republic of)",
["546"] = "New Caledonia",
["547"] = "French Polynesia",
["548"] = "Cook Islands",
["549"] = "Samoa (Independent State of)",
["550"] = "Micronesia (Federated States of)",
["551"] = "Marshall Islands (Republic of the)",
["552"] = "Palau (Republic of)",
["602"] = "Egypt (Arab Republic of)",
["603"] = "Algeria (People's Democratic Republic of)",
["604"] = "Morocco (Kingdom of)",
["605"] = "Tunisia",
["606"] = "Libya",
["607"] = "Gambia (Republic of the)",
["608"] = "Senegal (Republic of)",
["609"] = "Mauritania (Islamic Republic of)",
["610"] = "Mali (Republic of)",
["611"] = "Guinea (Republic of)",
["612"] = "Cote d'Ivoire (Republic of)",
["613"] = "Burkina Faso",
["614"] = "Niger (Republic of the)",
["615"] = "Togolese Republic",
["616"] = "Benin (Republic of)",
["617"] = "Mauritius (Republic of)",
["618"] = "Liberia (Republic of)",
["619"] = "Sierra Leone",
["620"] = "Ghana",
["621"] = "Nigeria (Federal Republic of)",
["622"] = "Chad (Republic of)",
["623"] = "Central African Republic",
["624"] = "Cameroon (Republic of)",
["625"] = "Cape Verde (Republic of)",
["626"] = "Sao Tome and Principe (Democratic Republic of)",
["627"] = "Equatorial Guinea (Republic of)",
["628"] = "Gabonese Republic",
["629"] = "Congo (Republic of the)",
["630"] = "Democratic Republic of the Congo",
["631"] = "Angola (Republic of)",
["632"] = "Guinea-Bissau (Republic of)",
["633"] = "Seychelles (Republic of)",
["634"] = "Sudan (Republic of the)",
["635"] = "Rwandese Republic",
["636"] = "Ethiopia (Federal Democratic Republic of)",
["637"] = "Somali Democratic Republic",
["638"] = "Djibouti (Republic of)",
["639"] = "Kenya (Republic of)",
["640"] = "Tanzania (United Republic of)",
["641"] = "Uganda (Republic of)",
["642"] = "Burundi (Republic of)",
["643"] = "Mozambique (Republic of)",
["645"] = "Zambia (Republic of)",
["646"] = "Madagascar (Republic of)",
["647"] = "Reunion (French Department of)",
["648"] = "Zimbabwe (Republic of)",
["649"] = "Namibia (Republic of)",
["650"] = "Malawi",
["651"] = "Lesotho (Kingdom of)",
["652"] = "Botswana (Republic of)",
["653"] = "Swaziland (Kingdom of)",
["654"] = "Comoros (Union of the)",
["655"] = "South Africa (Republic of)",
["657"] = "Eritrea",
["702"] = "Belize",
["704"] = "Guatemala (Republic of)",
["706"] = "El Salvador (Republic of)",
["708"] = "Honduras (Republic of)",
["710"] = "Nicaragua",
["712"] = "Costa Rica",
["714"] = "Panama (Republic of)",
["716"] = "Peru",
["722"] = "Argentine Republic",
["724"] = "Brazil (Federative Republic of)",
["730"] = "Chile",
["732"] = "Colombia (Republic of)",
["734"] = "Venezuela (Bolivarian Republic of)",
["736"] = "Bolivia (Republic of)",
["738"] = "Guyana",
["740"] = "Ecuador",
["742"] = "French Guiana (French Department of)",
["744"] = "Paraguay (Republic of)",
["746"] = "Suriname (Republic of)",
["748"] = "Uruguay (Eastern Republic of)",
["412"] = "Afghanistan",
["276"] = "Albania (Republic of)",
["603"] = "Algeria (People's Democratic Republic of)",
["544"] = "American Samoa",
["213"] = "Andorra (Principality of)",
["631"] = "Angola (Republic of)",
["365"] = "Anguilla",
["344"] = "Antigua and Barbuda",
["722"] = "Argentine Republic",
["283"] = "Armenia (Republic of)",
["363"] = "Aruba",
["505"] = "Australia",
["232"] = "Austria",
["400"] = "Azerbaijani Republic",
["364"] = "Bahamas (Commonwealth of the)",
["426"] = "Bahrain (Kingdom of)",
["470"] = "Bangladesh (People's Republic of)",
["342"] = "Barbados",
["257"] = "Belarus (Republic of)",
["206"] = "Belgium",
["702"] = "Belize",
["616"] = "Benin (Republic of)",
["350"] = "Bermuda",
["402"] = "Bhutan (Kingdom of)",
["736"] = "Bolivia (Republic of)",
["218"] = "Bosnia and Herzegovina",
["652"] = "Botswana (Republic of)",
["724"] = "Brazil (Federative Republic of)",
["348"] = "British Virgin Islands",
["528"] = "Brunei Darussalam",
["284"] = "Bulgaria (Republic of)",
["613"] = "Burkina Faso",
["642"] = "Burundi (Republic of)",
["456"] = "Cambodia (Kingdom of)",
["624"] = "Cameroon (Republic of)",
["302"] = "Canada",
["625"] = "Cape Verde (Republic of)",
["346"] = "Cayman Islands",
["623"] = "Central African Republic",
["622"] = "Chad (Republic of)",
["730"] = "Chile",
["461"] = "China (People's Republic of)",
["460"] = "China (People's Republic of)",
["732"] = "Colombia (Republic of)",
["654"] = "Comoros (Union of the)",
["629"] = "Congo (Republic of the)",
["548"] = "Cook Islands",
["712"] = "Costa Rica",
["612"] = "Cote d'Ivoire (Republic of)",
["219"] = "Croatia (Republic of)",
["368"] = "Cuba",
["280"] = "Cyprus (Republic of)",
["230"] = "Czech Republic",
["467"] = "Democratic People's Republic of Korea",
["630"] = "Democratic Republic of the Congo",
["514"] = "Democratique Republic of Timor-Leste",
["238"] = "Denmark",
["638"] = "Djibouti (Republic of)",
["366"] = "Dominica (Commonwealth of)",
["370"] = "Dominican Republic",
["740"] = "Ecuador",
["602"] = "Egypt (Arab Republic of)",
["706"] = "El Salvador (Republic of)",
["627"] = "Equatorial Guinea (Republic of)",
["657"] = "Eritrea",
["248"] = "Estonia (Republic of)",
["636"] = "Ethiopia (Federal Democratic Republic of)",
["288"] = "Faroe Islands",
["542"] = "Fiji (Republic of)",
["244"] = "Finland",
["208"] = "France",
["742"] = "French Guiana (French Department of)",
["547"] = "French Polynesia",
["628"] = "Gabonese Republic",
["607"] = "Gambia (Republic of the)",
["282"] = "Georgia",
["262"] = "Germany (Federal Republic of)",
["620"] = "Ghana",
["266"] = "Gibraltar",
["202"] = "Greece",
["290"] = "Greenland (Denmark)",
["352"] = "Grenada",
["340"] = "Guadeloupe (French Department of)",
["535"] = "Guam",
["704"] = "Guatemala (Republic of)",
["611"] = "Guinea (Republic of)",
["632"] = "Guinea-Bissau (Republic of)",
["738"] = "Guyana",
["372"] = "Haiti (Republic of)",
["708"] = "Honduras (Republic of)",
["454"] = "Hongkong China",
["216"] = "Hungary (Republic of)",
["274"] = "Iceland",
["404"] = "India (Republic of)",
["510"] = "Indonesia (Republic of)",
["901"] = "International Mobile shared code c",
["432"] = "Iran (Islamic Republic of)",
["418"] = "Iraq (Republic of)",
["272"] = "Ireland",
["425"] = "Israel (State of)",
["222"] = "Italy",
["338"] = "Jamaica",
["441"] = "Japan",
["440"] = "Japan",
["416"] = "Jordan (Hashemite Kingdom of)",
["401"] = "Kazakhstan (Republic of)",
["639"] = "Kenya (Republic of)",
["545"] = "Kiribati (Republic of)",
["450"] = "Korea (Republic of)",
["419"] = "Kuwait (State of)",
["437"] = "Kyrgyz Republic",
["457"] = "Lao People's Democratic Republic",
["247"] = "Latvia (Republic of)",
["415"] = "Lebanon",
["651"] = "Lesotho (Kingdom of)",
["618"] = "Liberia (Republic of)",
["606"] = "Libya",
["295"] = "Liechtenstein (Principality of)",
["246"] = "Lithuania (Republic of)",
["270"] = "Luxembourg",
["455"] = "Macao China",
["646"] = "Madagascar (Republic of)",
["650"] = "Malawi",
["502"] = "Malaysia",
["472"] = "Maldives (Republic of)",
["610"] = "Mali (Republic of)",
["278"] = "Malta",
["551"] = "Marshall Islands (Republic of the)",
["340"] = "Martinique (French Department of)",
["609"] = "Mauritania (Islamic Republic of)",
["617"] = "Mauritius (Republic of)",
["334"] = "Mexico",
["550"] = "Micronesia (Federated States of)",
["259"] = "Moldova (Republic of)",
["212"] = "Monaco (Principality of)",
["428"] = "Mongolia",
["354"] = "Montserrat",
["604"] = "Morocco (Kingdom of)",
["643"] = "Mozambique (Republic of)",
["414"] = "Myanmar (Union of)",
["649"] = "Namibia (Republic of)",
["536"] = "Nauru (Republic of)",
["429"] = "Nepal",
["204"] = "Netherlands (Kingdom of the)",
["362"] = "Netherlands Antilles",
["546"] = "New Caledonia",
["530"] = "New Zealand",
["710"] = "Nicaragua",
["614"] = "Niger (Republic of the)",
["621"] = "Nigeria (Federal Republic of)",
["534"] = "Northern Mariana Islands (Commonwealth of the)",
["242"] = "Norway",
["422"] = "Oman (Sultanate of)",
["410"] = "Pakistan (Islamic Republic of)",
["552"] = "Palau (Republic of)",
["714"] = "Panama (Republic of)",
["537"] = "Papua New Guinea",
["744"] = "Paraguay (Republic of)",
["716"] = "Peru",
["515"] = "Philippines (Republic of the)",
["260"] = "Poland (Republic of)",
["268"] = "Portugal",
["330"] = "Puerto Rico",
["427"] = "Qatar (State of)",
["8XX"] = "Reserved a 0XX Reserved a 1XX Reserved a",
["647"] = "Reunion (French Department of) 226 Romania",
["250"] = "Russian Federation",
["635"] = "Rwandese Republic",
["356"] = "Saint Kitts and Nevis",
["358"] = "SaintLucia",
["308"] = "Saint Pierre and Miquelon",
["360"] = "Saint Vincent and the Grenadines",
["549"] = "Samoa (Independent State of)",
["292"] = "San Marino (Republic of)",
["626"] = "Sao Tome and Principe (Democratic Republic of)",
["420"] = "Saudi Arabia (Kingdom of)",
["608"] = "Senegal (Republic of)",
["220"] = "Serbia and Montenegro",
["633"] = "Seychelles (Republic of)",
["619"] = "Sierra Leone",
["525"] = "Singapore (Republic of)",
["231"] = "Slovak Republic",
["293"] = "Slovenia (Republic of)",
["540"] = "Solomon Islands",
["637"] = "Somali Democratic Republic",
["655"] = "South Africa (Republic of)",
["214"] = "Spain",
["413"] = "Sri Lanka (Democratic Socialist Republic of)",
["634"] = "Sudan (Republic of the)",
["746"] = "Suriname (Republic of)",
["653"] = "Swaziland (Kingdom of)",
["240"] = "Sweden",
["228"] = "Switzerland (Confederation of)",
["417"] = "Syrian Arab Republic",
["466"] = "Taiwan",
["436"] = "Tajikistan (Republic of)",
["640"] = "Tanzania (United Republic of)",
["520"] = "Thailand",
["294"] = "The Former Yugoslav Republic of Macedonia",
["615"] = "Togolese Republic",
["539"] = "Tonga (Kingdom of)",
["374"] = "Trinidad and Tobago",
["605"] = "Tunisia",
["286"] = "Turkey",
["438"] = "Turkmenistan",
["376"] = "Turks and Caicos Islands",
["641"] = "Uganda (Republic of)",
["255"] = "Ukraine",
["424"] = "United Arab Emirates",
["430"] = "United Arab Emirates b",
["431"] = "United Arab Emirates b",
["235"] = "United Kingdom",
["234"] = "United Kingdom",
["310"] = "United States of America",
["316"] = "United States of America",
["311"] = "United States of America",
["312"] = "United States of America",
["313"] = "United States of America",
["314"] = "United States of America",
["315"] = "United States of America",
["332"] = "United States Virgin Islands",
["748"] = "Uruguay (Eastern Republic of)",
["434"] = "Uzbekistan (Republic of)",
["541"] = "Vanuatu (Republic of)",
["225"] = "Vatican City State",
["734"] = "Venezuela (Bolivarian Republic of)",
["452"] = "Viet Nam (Socialist Republic of)",
["543"] = "Wallis and Futuna",
["421"] = "Yemen (Republic of)",
["645"] = "Zambia (Republic of)",
["648"] = "Zimbabwe (Republic of)",
}
-- #######################
function handleCustomFlowField(key, value)
if(key == 'TCP_FLAGS') then
return(formatTcpFlags(value))
elseif((key == 'INPUT_SNMP') or (key == 'OUTPUT_SNMP')) then
return(formatInterfaceId(value))
elseif((key == 'FLOW_USER_NAME') or (key == '57593')) then
elems = string.split(value, ';')
if((elems ~= nil) and (table.getn(elems) == 6)) then
r = '<table class="table table-bordered table-striped">'
imsi = elems[1]
mcc = string.sub(imsi, 1, 3)
if(mobile_country_code[mcc] ~= nil) then
mcc_name = " ["..mobile_country_code[mcc].."]"
else
mcc_name = ""
end
r = r .. "<th>IMSI (International mobile Subscriber Identity)</th><td>"..elems[1]..mcc_name
r = r .. " <A HREF=http://www.numberingplans.com/?page=analysis&sub=imsinr><i class='fa fa-info'></i></A></td></tr>"
r = r .. "<th>NSAPI</th><td>".. elems[2].."</td></tr>"
r = r .. "<th>GSM Cell LAC (Location Area Code)</th><td>".. elems[3].."</td></tr>"
r = r .. "<th>GSM Cell Identifier</th><td>".. elems[4].."</td></tr>"
r = r .. "<th>SAC (Service Area Code)</th><td>".. elems[5].."</td></tr>"
r = r .. "<th>IP Address</th><td>".. ntop.inet_ntoa(elems[6]).."</td></tr>"
r = r .. "</table>"
return(r)
else
return(value)
end
elseif((rtemplate[tonumber(key)] == 'SIP_TRYING_TIME') or (rtemplate[tonumber(key)] == 'SIP_RINGING_TIME') or (rtemplate[tonumber(key)] == 'SIP_INVITE_TIME') or (rtemplate[tonumber(key)] == 'SIP_INVITE_OK_TIME') or (rtemplate[tonumber(key)] == 'SIP_INVITE_FAILURE_TIME') or (rtemplate[tonumber(key)] == 'SIP_BYE_TIME') or (rtemplate[tonumber(key)] == 'SIP_BYE_OK_TIME') or (rtemplate[tonumber(key)] == 'SIP_CANCEL_TIME') or (rtemplate[tonumber(key)] == 'SIP_CANCEL_OK_TIME')) then
if(value ~= '0') then
return(formatEpoch(value))
else
return ""
end
elseif((rtemplate[tonumber(key)] == 'RTP_IN_JITTER') or (rtemplate[tonumber(key)] == 'RTP_OUT_JITTER')) then
if(value ~= nil and value ~= '0') then
return(value/1000)
else
return 0
end
elseif((rtemplate[tonumber(key)] == 'RTP_IN_MAX_DELTA') or (rtemplate[tonumber(key)] == 'RTP_OUT_MAX_DELTA') or (rtemplate[tonumber(key)] == 'RTP_MOS') or (rtemplate[tonumber(key)] == 'RTP_R_FACTOR') or (rtemplate[tonumber(key)] == 'RTP_IN_MOS') or (rtemplate[tonumber(key)] == 'RTP_OUT_MOS') or (rtemplate[tonumber(key)] == 'RTP_IN_R_FACTOR') or (rtemplate[tonumber(key)] == 'RTP_OUT_R_FACTOR') or (rtemplate[tonumber(key)] == 'RTP_IN_TRANSIT') or (rtemplate[tonumber(key)] == 'RTP_OUT_TRANSIT')) then
if(value ~= nil and value ~= '0') then
return(value/100)
else
return 0
end
end
-- Unformatted value
return value
end
-- #######################
function formatTcpFlags(flags)
if(flags == 0) then
return("")
end
rsp = "<A HREF=http://en.wikipedia.org/wiki/Transmission_Control_Protocol>"
if(bit.band(flags, 1) == 2) then rsp = rsp .. " SYN " end
if(bit.band(flags, 16) == 16) then rsp = rsp .. " ACK " end
if(bit.band(flags, 1) == 1) then rsp = rsp .. " FIN " end
if(bit.band(flags, 4) == 4) then rsp = rsp .. " RST " end
if(bit.band(flags, 8) == 8 ) then rsp = rsp .. " PUSH " end
return(rsp .. "</A>")
end
-- #######################
function formatInterfaceId(id)
if(id == 65535) then
return("Unknown")
else
return(id)
end
end
-- #######################
-- IMPORTANT: keep it in sync with ParserInterface::ParserInterface()
local flow_fields_description = {
["IN_BYTES"] = "Incoming flow bytes (src->dst)",
["IN_PKTS"] = "Incoming flow packets (src->dst)",
["FLOWS"] = "Number of flows",
["PROTOCOL"] = "IP protocol byte",
["PROTOCOL_MAP"] = "IP protocol name",
["SRC_TOS"] = "Type of service (TOS)",
["TCP_FLAGS"] = "Cumulative of all flow TCP flags",
["L4_SRC_PORT"] = "IPv4 source port",
["L4_SRC_PORT_MAP"] = "Layer 4 source port symbolic name",
["IPV4_SRC_ADDR"] = "IPv4 source address",
["IPV4_SRC_MASK"] = "IPv4 source subnet mask (/<bits>)",
["INPUT_SNMP"] = "Input interface SNMP idx",
["L4_DST_PORT"] = "IPv4 destination port",
["L4_DST_PORT_MAP"] = "Layer 4 destination port symbolic name",
["L4_SRV_PORT"] = "Layer 4 server port",
["L4_SRV_PORT_MAP"] = "Layer 4 server port symbolic name",
["IPV4_DST_ADDR"] = "IPv4 destination address",
["IPV4_DST_MASK"] = "IPv4 dest subnet mask (/<bits>)",
["OUTPUT_SNMP"] = "Output interface SNMP idx",
["IPV4_NEXT_HOP"] = "IPv4 Next Hop",
["SRC_AS"] = "Source BGP AS",
["DST_AS"] = "Destination BGP AS",
["LAST_SWITCHED"] = "SysUptime (msec) of the last flow pkt",
["FIRST_SWITCHED"] = "SysUptime (msec) of the first flow pkt",
["OUT_BYTES"] = "Outgoing flow bytes (dst->src)",
["OUT_PKTS"] = "Outgoing flow packets (dst->src)",
["IPV6_SRC_ADDR"] = "IPv6 source address",
["IPV6_DST_ADDR"] = "IPv6 destination address",
["IPV6_SRC_MASK"] = "IPv6 source mask",
["IPV6_DST_MASK"] = "IPv6 destination mask",
["ICMP_TYPE"] = "ICMP Type * 256 + ICMP code",
["SAMPLING_INTERVAL"] = "Sampling rate",
["SAMPLING_ALGORITHM"] = "Sampling type (deterministic/random)",
["FLOW_ACTIVE_TIMEOUT"] = "Activity timeout of flow cache entries",
["FLOW_INACTIVE_TIMEOUT"] = "Inactivity timeout of flow cache entries",
["ENGINE_TYPE"] = "Flow switching engine",
["ENGINE_ID"] = "Id of the flow switching engine",
["TOTAL_BYTES_EXP"] = "Total bytes exported",
["TOTAL_PKTS_EXP"] = "Total flow packets exported",
["TOTAL_FLOWS_EXP"] = "Total number of exported flows",
["MIN_TTL"] = "Min flow TTL",
["MAX_TTL"] = "Max flow TTL",
["DST_TOS"] = "TOS/DSCP (dst->src)",
["IN_SRC_MAC"] = "Source MAC Address",
["SRC_VLAN"] = "Source VLAN",
["DST_VLAN"] = "Destination VLAN",
["IP_PROTOCOL_VERSION"] = "4=IPv4]6=IPv6]",
["DIRECTION"] = "It indicates where a sample has been taken (always 0)",
["IPV6_NEXT_HOP"] = "IPv6 next hop address",
["MPLS_LABEL_1"] = "MPLS label at position 1",
["MPLS_LABEL_2"] = "MPLS label at position 2",
["MPLS_LABEL_3"] = "MPLS label at position 3",
["MPLS_LABEL_4"] = "MPLS label at position 4",
["MPLS_LABEL_5"] = "MPLS label at position 5",
["MPLS_LABEL_6"] = "MPLS label at position 6",
["MPLS_LABEL_7"] = "MPLS label at position 7",
["MPLS_LABEL_8"] = "MPLS label at position 8",
["MPLS_LABEL_9"] = "MPLS label at position 9",
["MPLS_LABEL_10"] = "MPLS label at position 10",
["OUT_DST_MAC"] = "Destination MAC Address",
["APPLICATION_ID"] = "Cisco NBAR Application Id",
["PACKET_SECTION_OFFSET"] = "Packet section offset",
["SAMPLED_PACKET_SIZE"] = "Sampled packet size",
["SAMPLED_PACKET_ID"] = "Sampled packet id",
["EXPORTER_IPV4_ADDRESS"] = "Exporter IPv4 Address",
["EXPORTER_IPV6_ADDRESS"] = "Exporter IPv6 Address",
["FLOW_ID"] = "Serial Flow Identifier",
["FLOW_START_SEC"] = "Seconds (epoch) of the first flow packet",
["FLOW_END_SEC"] = "Seconds (epoch) of the last flow packet",
["FLOW_START_MILLISECONDS"] = "Msec (epoch) of the first flow packet",
["FLOW_END_MILLISECONDS"] = "Msec (epoch) of the last flow packet",
["BIFLOW_DIRECTION"] = "1=initiator, 2=reverseInitiator",
["OBSERVATION_POINT_TYPE"] = "Observation point type",
["OBSERVATION_POINT_ID"] = "Observation point id",
["SELECTOR_ID"] = "Selector id",
["IPFIX_SAMPLING_ALGORITHM"] = "Sampling algorithm",
["SAMPLING_SIZE"] = "Number of packets to sample",
["SAMPLING_POPULATION"] = "Sampling population",
["FRAME_LENGTH"] = "Original L2 frame length",
["PACKETS_OBSERVED"] = "Tot number of packets seen",
["PACKETS_SELECTED"] = "Number of pkts selected for sampling",
["SELECTOR_NAME"] = "Sampler name",
["APPLICATION_NAME"] = "Palo Alto App-Id",
["USER_NAME"] = "Palo Alto User-Id",
["FRAGMENTS"] = "Number of fragmented flow packets",
["CLIENT_NW_DELAY_SEC"] = "Network latency client <-> nprobe (sec)",
["CLIENT_NW_DELAY_USEC"] = "Network latency client <-> nprobe (residual usec)",
["CLIENT_NW_DELAY_MS"] = "Network latency client <-> nprobe (msec)",
["SERVER_NW_DELAY_SEC"] = "Network latency nprobe <-> server (sec)",
["SERVER_NW_DELAY_USEC"] = "Network latency nprobe <-> server (residual usec)",
["SERVER_NW_DELAY_MS"] = "Network latency nprobe <-> server (residual msec)",
["APPL_LATENCY_SEC"] = "Application latency (sec)",
["APPL_LATENCY_USEC"] = "Application latency (residual usec)",
["APPL_LATENCY_MS"] = "Application latency (msec)",
["NUM_PKTS_UP_TO_128_BYTES"] = "# packets whose size <= 128",
["NUM_PKTS_128_TO_256_BYTES"] = "# packets whose size > 128 and <= 256",
["NUM_PKTS_256_TO_512_BYTES"] = "# packets whose size > 256 and < 512",
["NUM_PKTS_512_TO_1024_BYTES"] = "# packets whose size > 512 and < 1024",
["NUM_PKTS_1024_TO_1514_BYTES"] = "# packets whose size > 1024 and <= 1514",
["NUM_PKTS_OVER_1514_BYTES"] = "# packets whose size > 1514",
["CUMULATIVE_ICMP_TYPE"] = "Cumulative OR of ICMP type packets",
["SRC_IP_COUNTRY"] = "Country where the src IP is located",
["SRC_IP_CITY"] = "City where the src IP is located",
["DST_IP_COUNTRY"] = "Country where the dst IP is located",
["DST_IP_CITY"] = "City where the dst IP is located",
["FLOW_PROTO_PORT"] = "L7 port that identifies the flow protocol or 0 if unknown",
["UPSTREAM_TUNNEL_ID"] = "Upstream tunnel identifier (e.g. GTP TEID) or 0 if unknown",
["LONGEST_FLOW_PKT"] = "Longest packet (bytes) of the flow",
["SHORTEST_FLOW_PKT"] = "Shortest packet (bytes) of the flow",
["RETRANSMITTED_IN_PKTS"] = "Number of retransmitted TCP flow packets (src->dst)",
["RETRANSMITTED_IN_BYTES"] = "Number of retransmitted TCP flow bytes (src->dst)",
["RETRANSMITTED_OUT_PKTS"] = "Number of retransmitted TCP flow packets (dst->src)",
["RETRANSMITTED_OUT_BYTES"] = "Number of retransmitted TCP flow bytes (dst->src)",
["OOORDER_IN_PKTS"] = "Number of out of order TCP flow packets (dst->src)",
["OOORDER_OUT_PKTS"] = "Number of out of order TCP flow packets (dst->src)",
["UNTUNNELED_PROTOCOL"] = "Untunneled IP protocol byte",
["UNTUNNELED_IPV4_SRC_ADDR"] = "Untunneled IPv4 source address",
["UNTUNNELED_L4_SRC_PORT"] = "Untunneled IPv4 source port",
["UNTUNNELED_IPV4_DST_ADDR"] = "Untunneled IPv4 destination address",
["UNTUNNELED_L4_DST_PORT"] = "Untunneled IPv4 destination port",
["L7_PROTO"] = "Layer 7 protocol (numeric)",
["L7_PROTO_NAME"] = "Layer 7 protocol name",
["DOWNSTREAM_TUNNEL_ID"] = "Downstream tunnel identifier (e.g. GTP TEID) or 0 if unknown",
["FLOW_USER_NAME"] = "Flow Username",
["FLOW_SERVER_NAME"] = "Flow server name",
["PLUGIN_NAME"] = "Plugin name used by this flow (if any)",
["UNTUNNELED_IPV6_SRC_ADDR"] = "Untunneled IPv6 source address",
["UNTUNNELED_IPV6_DST_ADDR"] = "Untunneled IPv6 destination address",
["SRC_IP_LONG"] = "Longitude where the src IP is located",
["SRC_IP_LAT"] = "Latitude where the src IP is located",
["DST_IP_LONG"] = "Longitude where the dst IP is located",
["DST_IP_LAT"] = "Latitude where the dst IP is located",
["NUM_PKTS_TTL_EQ_1"] = "# packets with TTL = 1",
["NUM_PKTS_TTL_2_5"] = "# packets with TTL > 1 and TTL <= 5",
["NUM_PKTS_TTL_5_32"] = "# packets with TTL > 5 and TTL <= 32",
["NUM_PKTS_TTL_32_64"] = "# packets with TTL > 32 and <= 64 ",
["NUM_PKTS_TTL_64_96"] = "# packets with TTL > 64 and <= 96",
["NUM_PKTS_TTL_96_128"] = "# packets with TTL > 96 and <= 128",
["NUM_PKTS_TTL_128_160"] = "# packets with TTL > 128 and <= 160",
["NUM_PKTS_TTL_160_192"] = "# packets with TTL > 160 and <= 192",
["NUM_PKTS_TTL_192_224"] = "# packets with TTL > 192 and <= 224",
["NUM_PKTS_TTL_224_255"] = "# packets with TTL > 224 and <= 255",
["IN_SRC_OSI_SAP"] = "OSI Source SAP (OSI Traffic Only)",
["OUT_DST_OSI_SAP"] = "OSI Destination SAP (OSI Traffic Only)",
["DURATION_IN"] = "Client to Server stream duration (msec)",
["DURATION_OUT"] = "Client to Server stream duration (msec)",
["TCP_WIN_MIN_IN"] = "Min TCP Window (src->dst)",
["TCP_WIN_MAX_IN"] = "Max TCP Window (src->dst)",
["TCP_WIN_MSS_IN"] = "TCP Max Segment Size (src->dst)",
["TCP_WIN_SCALE_IN"] = "TCP Window Scale (src->dst)",
["TCP_WIN_MIN_OUT"] = "Min TCP Window (dst->src)",
["TCP_WIN_MAX_OUT"] = "Max TCP Window (dst->src)",
["TCP_WIN_MSS_OUT"] = "TCP Max Segment Size (dst->src)",
["TCP_WIN_SCALE_OUT"] = "TCP Window Scale (dst->src)",
-- MYSQL
["MYSQL_SERVER_VERSION"] = "MySQL server version",
["MYSQL_USERNAME"] = "MySQL username",
["MYSQL_DB"] = "MySQL database in use",
["MYSQL_QUERY"] = "MySQL Query",
["MYSQL_RESPONSE"] = "MySQL server response",
["MYSQL_APPL_LATENCY_USEC"] = "MySQL request->response latecy (usec)",
["SRC_AS_PATH_1"] = "Src AS path position 1",
["SRC_AS_PATH_2"] = "Src AS path position 2",
["SRC_AS_PATH_3"] = "Src AS path position 3",
["SRC_AS_PATH_4"] = "Src AS path position 4",
["SRC_AS_PATH_5"] = "Src AS path position 5",
["SRC_AS_PATH_6"] = "Src AS path position 6",
["SRC_AS_PATH_7"] = "Src AS path position 7",
["SRC_AS_PATH_8"] = "Src AS path position 8",
["SRC_AS_PATH_9"] = "Src AS path position 9",
["SRC_AS_PATH_10"] = "Src AS path position 10",
["DST_AS_PATH_1"] = "Dest AS path position 1",
["DST_AS_PATH_2"] = "Dest AS path position 2",
["DST_AS_PATH_3"] = "Dest AS path position 3",
["DST_AS_PATH_4"] = "Dest AS path position 4",
["DST_AS_PATH_5"] = "Dest AS path position 5",
["DST_AS_PATH_6"] = "Dest AS path position 6",
["DST_AS_PATH_7"] = "Dest AS path position 7",
["DST_AS_PATH_8"] = "Dest AS path position 8",
["DST_AS_PATH_9"] = "Dest AS path position 9",
["DST_AS_PATH_10"] = "Dest AS path position 10",
-- DHCP
["DHCP_CLIENT_MAC"] = "MAC of the DHCP client",
["DHCP_CLIENT_IP"] = "DHCP assigned client IPv4 address",
["DHCP_CLIENT_NAME"] = "DHCP client name",
["DHCP_REMOTE_ID"] = "DHCP agent remote Id",
["DHCP_SUBSCRIBER_ID"] = "DHCP subscribed Id",
["DHCP_MESSAGE_TYPE"] = "DHCP message type",
-- DIAMETER
["DIAMETER_REQ_MSG_TYPE"] = "DIAMETER Request Msg Type",
["DIAMETER_RSP_MSG_TYPE"] = "DIAMETER Response Msg Type",
["DIAMETER_REQ_ORIGIN_HOST"] = "DIAMETER Origin Host Request",
["DIAMETER_RSP_ORIGIN_HOST"] = "DIAMETER Origin Host Response",
["DIAMETER_REQ_USER_NAME"] = "DIAMETER Request User Name",
["DIAMETER_RSP_RESULT_CODE"] = "DIAMETER Response Result Code",
["DIAMETER_EXP_RES_VENDOR_ID"] = "DIAMETER Response Experimental Result Vendor Id",
["DIAMETER_EXP_RES_RESULT_CODE"] = "DIAMETER Response Experimental Result Code",
-- DNS
["DNS_QUERY"] = "DNS query",
["DNS_QUERY_ID"] = "DNS query transaction Id",
["DNS_QUERY_TYPE"] = "DNS query type (e.g. 1=A, 2=NS..)",
["DNS_RET_CODE"] = "DNS return code (e.g. 0=no error)",
["DNS_NUM_ANSWERS"] = "DNS # of returned answers",
["DNS_TTL_ANSWER"] = "TTL of the first A record (if any)",
["DNS_RESPONSE"] = "DNS response(s)",
-- FTP
["FTP_LOGIN"] = "FTP client login",
["FTP_PASSWORD"] = "FTP client password",
["FTP_COMMAND"] = "FTP client command",
["FTP_COMMAND_RET_CODE"] = "FTP client command return code",
-- GTP
["GTPV0_REQ_MSG_TYPE"] = "GTPv0 Request Msg Type",
["GTPV0_RSP_MSG_TYPE"] = "GTPv0 Response Msg Type",
["GTPV0_TID"] = "GTPv0 Tunnel Identifier",
["GTPV0_APN_NAME"] = "GTPv0 APN Name",
["GTPV0_END_USER_IP"] = "GTPv0 End User IP Address",
["GTPV0_END_USER_MSISDN"] = "GTPv0 End User MSISDN",
["GTPV0_RAI_MCC"] = "GTPv0 Mobile Country Code",
["GTPV0_RAI_MNC"] = "GTPv0 Mobile Network Code",
["GTPV0_RAI_CELL_LAC"] = "GTPv0 Cell Location Area Code",
["GTPV0_RAI_CELL_RAC"] = "GTPv0 Cell Routing Area Code",
["GTPV0_RESPONSE_CAUSE"] = "GTPv0 Cause of Operation",
["GTPV1_REQ_MSG_TYPE"] = "GTPv1 Request Msg Type",
["GTPV1_RSP_MSG_TYPE"] = "GTPv1 Response Msg Type",
["GTPV1_C2S_TEID_DATA"] = "GTPv1 Client->Server TunnelId Data",
["GTPV1_C2S_TEID_CTRL"] = "GTPv1 Client->Server TunnelId Control",
["GTPV1_S2C_TEID_DATA"] = "GTPv1 Server->Client TunnelId Data",
["GTPV1_S2C_TEID_CTRL"] = "GTPv1 Server->Client TunnelId Control",
["GTPV1_END_USER_IP"] = "GTPv1 End User IP Address",
["GTPV1_END_USER_IMSI"] = "GTPv1 End User IMSI",
["GTPV1_END_USER_MSISDN"] = "GTPv1 End User MSISDN",
["GTPV1_END_USER_IMEI"] = "GTPv1 End User IMEI",
["GTPV1_APN_NAME"] = "GTPv1 APN Name",
["GTPV1_RAI_MCC"] = "GTPv1 RAI Mobile Country Code",
["GTPV1_RAI_MNC"] = "GTPv1 RAI Mobile Network Code",
["GTPV1_RAI_LAC"] = "GTPv1 RAI Location Area Code",
["GTPV1_RAI_RAC"] = "GTPv1 RAI Routing Area Code",
["GTPV1_ULI_MCC"] = "GTPv1 ULI Mobile Country Code",
["GTPV1_ULI_MNC"] = "GTPv1 ULI Mobile Network Code",
["GTPV1_ULI_CELL_LAC"] = "GTPv1 ULI Cell Location Area Code",
["GTPV1_ULI_CELL_CI"] = "GTPv1 ULI Cell CI",
["GTPV1_ULI_SAC"] = "GTPv1 ULI SAC",
["GTPV1_RESPONSE_CAUSE"] = "GTPv1 Cause of Operation",
["GTPV2_REQ_MSG_TYPE"] = "GTPv2 Request Msg Type",
["GTPV2_RSP_MSG_TYPE"] = "GTPv2 Response Msg Type",
["GTPV2_C2S_S1U_GTPU_TEID"] = "GTPv2 Client->Svr S1U GTPU TEID",
["GTPV2_C2S_S1U_GTPU_IP"] = "GTPv2 Client->Svr S1U GTPU IP",
["GTPV2_S2C_S1U_GTPU_TEID"] = "GTPv2 Srv->Client S1U GTPU TEID",
["GTPV2_S2C_S1U_GTPU_IP"] = "GTPv2 Srv->Client S1U GTPU IP",
["GTPV2_END_USER_IMSI"] = "GTPv2 End User IMSI",
["GTPV2_END_USER_MSISDN"] = "GTPv2 End User MSISDN",
["GTPV2_APN_NAME"] = "GTPv2 APN Name",
["GTPV2_ULI_MCC"] = "GTPv2 Mobile Country Code",
["GTPV2_ULI_MNC"] = "GTPv2 Mobile Network Code",
["GTPV2_ULI_CELL_TAC"] = "GTPv2 Tracking Area Code",
["GTPV2_ULI_CELL_ID"] = "GTPv2 Cell Identifier",
["GTPV2_RESPONSE_CAUSE"] = "GTPv2 Cause of Operation",
-- HTTP
["HTTP_URL"] = "HTTP URL",
["HTTP_METHOD"] = "HTTP METHOD",
["HTTP_RET_CODE"] = "HTTP return code (e.g. 200, 304...)",
["HTTP_REFERER"] = "HTTP Referer",
["HTTP_UA"] = "HTTP User Agent",
["HTTP_MIME"] = "HTTP Mime Type",
["HTTP_HOST"] = "HTTP Host Name",
["HTTP_FBOOK_CHAT"] = "HTTP Facebook Chat",
["HTTP_SITE"] = "HTTP server without host name",
-- Oracle
["ORACLE_USERNAME"] = "Oracle Username",
["ORACLE_QUERY"] = "Oracle Query",
["ORACLE_RSP_CODE"] = "Oracle Response Code",
["ORACLE_RSP_STRING"] = "Oracle Response String",
["ORACLE_QUERY_DURATION"] = "Oracle Query Duration (msec)",
-- Process
['SRC_PROC_PID'] = "Client Process PID",
['SRC_PROC_NAME'] = "Client Process Name",
['SRC_PROC_UID'] = "Client process UID",
['SRC_PROC_USER_NAME'] = "Client process User Name",
['SRC_FATHER_PROC_PID'] = "Client Father Process PID",
['SRC_FATHER_PROC_NAME'] = "Client Father Process Name",
['SRC_PROC_ACTUAL_MEMORY'] = "Client Process Used Memory (KB)",
['SRC_PROC_PEAK_MEMORY'] = "Client Process Peak Memory (KB)",
['SRC_PROC_AVERAGE_CPU_LOAD'] = "Client Process Average Process CPU Load (%)",
['SRC_PROC_NUM_PAGE_FAULTS'] = "Client Process Number of page faults",
['SRC_PROC_PCTG_IOWAIT'] = "Client process iowait time % (% * 100)",
['DST_PROC_PID'] = "Server Process PID",
['DST_PROC_UID'] = "Server process UID",
['DST_PROC_NAME'] = "Server Process Name",
['DST_PROC_USER_NAME'] = "Server process User Name",
['DST_FATHER_PROC_PID'] = "Server Father Process PID",
['DST_FATHER_PROC_NAME'] = "Server Father Process Name",
['DST_PROC_ACTUAL_MEMORY'] = "Server Process Used Memory (KB)",
['DST_PROC_PEAK_MEMORY'] = "Server Process Peak Memory (KB)",
['DST_PROC_AVERAGE_CPU_LOAD'] = "Server Process Average Process CPU Load (%)",
['DST_PROC_NUM_PAGE_FAULTS'] = "Server Process Number of page faults",
['DST_PROC_PCTG_IOWAIT'] = "Server process iowait time % (% * 100)",
-- Radius
["RADIUS_REQ_MSG_TYPE"] = "RADIUS Request Msg Type",
["RADIUS_RSP_MSG_TYPE"] = "RADIUS Response Msg Type",
["RADIUS_USER_NAME"] = "RADIUS User Name (Access Only)",
["RADIUS_CALLING_STATION_ID"] = "RADIUS Calling Station Id",
["RADIUS_CALLED_STATION_ID"] = "RADIUS Called Station Id",
["RADIUS_NAS_IP_ADDR"] = "RADIUS NAS IP Address",
["RADIUS_NAS_IDENTIFIER"] = "RADIUS NAS Identifier",
["RADIUS_USER_IMSI"] = "RADIUS User IMSI (Extension)",
["RADIUS_USER_IMEI"] = "RADIUS User MSISDN (Extension)",
["RADIUS_FRAMED_IP_ADDR"] = "RADIUS Framed IP",
["RADIUS_ACCT_SESSION_ID"] = "RADIUS Accounting Session Name",
["RADIUS_ACCT_STATUS_TYPE"] = "RADIUS Accounting Status Type",
["RADIUS_ACCT_IN_OCTETS"] = "RADIUS Accounting Input Octets",
["RADIUS_ACCT_OUT_OCTETS"] = "RADIUS Accounting Output Octets",
["RADIUS_ACCT_IN_PKTS"] = "RADIUS Accounting Input Packets",
["RADIUS_ACCT_OUT_PKTS"] = "RADIUS Accounting Output Packets",
-- VoIP
['RTP_SSRC'] = "RTP Sync Source ID",
['RTP_MOS'] = "Rtp Voice Quality",
['RTP_R_FACTOR'] = "Rtp Voice Quality Metric (%)", --http://tools.ietf.org/html/rfc3611#section-4.7.5
['RTP_RTT'] = "Rtp Round Trip Time",
['RTP_IN_TRANSIT'] = "RTP Transit (value * 100) (src->dst)",
['RTP_OUT_TRANSIT'] = "RTP Transit (value * 100) (dst->src)",
['RTP_FIRST_SEQ'] = "First flow RTP Seq Number",
['RTP_FIRST_TS'] = "First flow RTP timestamp",
['RTP_LAST_SEQ'] = "Last flow RTP Seq Number",
['RTP_LAST_TS'] = "Last flow RTP timestamp",
['RTP_IN_JITTER'] = "Rtp Incoming Packet Delay Variation",
['RTP_OUT_JITTER'] = "Rtp Out Coming Packet Delay Variation",
['RTP_IN_PKT_LOST'] = "Rtp Incoming Packets Lost",
['RTP_OUT_PKT_LOST'] = "Rtp Out Coming Packets Lost",
['RTP_OUT_PAYLOAD_TYPE'] = "Rtp Out Coming Payload Type",
['RTP_IN_MAX_DELTA'] = "Max delta (ms*100) between consecutive pkts (src->dst)",
['RTP_OUT_MAX_DELTA'] = "Max delta (ms*100) between consecutive pkts (dst->src)",
['RTP_IN_PAYLOAD_TYPE'] = "Rtp Incoming Payload Type",
['RTP_SIP_CALL_ID'] = "SIP call-id corresponding to this RTP stream",
['RTP_IN_PKT_DROP'] = "Packet discarded by Jitter Buffer (src->dst)",
['RTP_OUT_PKT_DROP'] = "Packet discarded by Jitter Buffer (dst->src)",
['RTP_IN_MOS'] = "RTP pseudo-MOS (value * 100) (src->dst)",
['RTP_OUT_MOS'] = "RTP pseudo-MOS (value * 100) (dst->src)",
['RTP_IN_R_FACTOR'] = "RTP pseudo-R_FACTOR (value * 100) (src->dst)",
['RTP_OUT_R_FACTOR'] = "RTP pseudo-R_FACTOR (value * 100) (dst->src)",
['RTP_DTMF_TONES'] = "DTMF tones sent (if any) during the call",
['SIP_CALL_ID'] = "SIP call-id",
['SIP_CALLING_PARTY'] = "SIP Call initiator",
['SIP_CALLED_PARTY'] = "SIP Called party",
['SIP_RTP_CODECS'] = "SIP RTP codecs",
['SIP_INVITE_TIME'] = "SIP time (epoch) of INVITE",
['SIP_TRYING_TIME'] = "SIP time (epoch) of Trying",
['SIP_RINGING_TIME'] = "SIP time (epoch) of RINGING",
['SIP_INVITE_OK_TIME'] = "SIP time (epoch) of INVITE OK",
['SIP_INVITE_FAILURE_TIME'] = "SIP time (epoch) of INVITE FAILURE",
['SIP_BYE_TIME'] = "SIP time (epoch) of BYE",
['SIP_BYE_OK_TIME'] = "SIP time (epoch) of BYE OK",
['SIP_CANCEL_TIME'] = "SIP time (epoch) of CANCEL",
['SIP_CANCEL_OK_TIME'] = "SIP time (epoch) of CANCEL OK",
['SIP_RTP_IPV4_SRC_ADDR'] = "SIP RTP stream source IP",
['SIP_RTP_L4_SRC_PORT'] = "SIP RTP stream source port",
['SIP_RTP_IPV4_DST_ADDR'] = "SIP RTP stream dest IP",
['SIP_RTP_L4_DST_PORT'] = "SIP RTP stream dest port",
['SIP_FAILURE_CODE'] = "SIP failure response code",
['SIP_RESPONSE_CODE'] = "SIP failure response code",
['SIP_REASON_CAUSE'] = "SIP Cancel/Bye/Failure reason cause",
['SIP_C_IP'] = "SIP C IP adresses",
['SIP_CALL_STATE'] = "Sip Call State",
-- S1AP
["S1AP_ENB_UE_S1AP_ID"] = "S1AP ENB Identifier",
["S1AP_MME_UE_S1AP_ID"] = "S1AP MME Identifier",
["S1AP_MSG_EMM_TYPE_MME_TO_ENB"] = "S1AP EMM Message Type from MME to ENB",
["S1AP_MSG_ESM_TYPE_MME_TO_ENB"] = "S1AP ESM Message Type from MME to ENB",
["S1AP_MSG_EMM_TYPE_ENB_TO_MME"] = "S1AP EMM Message Type from ENB to MME",
["S1AP_MSG_ESM_TYPE_ENB_TO_MME"] = "S1AP ESM Message Type from ENB to MME",
["S1AP_CAUSE_ENB_TO_MME"] = "S1AP Cause from ENB to MME",
["S1AP_DETAILED_CAUSE_ENB_TO_MME"] = "S1AP Detailed Cause from ENB to MME",
-- Mail
["SMTP_MAIL_FROM"] = "Mail sender",
["SMTP_RCPT_TO"] = "Mail recipient",
["POP_USER"] = "POP3 user login",
["IMAP_LOGIN"] = "Mail sender",
-- WHOIS
["WHOIS_DAS_DOMAIN"] = "Whois/DAS Domain name",
}
-- #######################
function getFlowKey(name)
v = rtemplate[tonumber(name)]
if(v == nil) then return(name) end
s = flow_fields_description[v]
if(s ~= nil) then
s = string.gsub(s, "<", "&lt;")
s = string.gsub(s, ">", "&gt;")
return(s)
else
return(name)
end
end
-- #######################
function isFieldProtocol(protocol, field)
if(field == nil or protocol == nil) then
return 0
end
v = rtemplate[tonumber(field)]
if(v == nil) then return 0 end
return string.starts(v, protocol.."_")
end
-- #######################
function removeProtocolFields(protocol, array)
elements_to_remove = {}
n = 0
for key,value in pairs(array) do
if(isFieldProtocol(protocol,key)) then
elements_to_remove[n] = key
n=n+1
end
end
for key,value in pairs(elements_to_remove) do
if(value ~= nil) then
array[value] = nil
end
end
return array
end
-- #######################
function getFlowValue(info, field)
local return_value = ""
local value_original = "0"
for key,value in pairs(info) do
if(rtemplate[tonumber(key)] == field)then
return_value = handleCustomFlowField(key, value)
value_original = value
end
end
return_value = string.gsub(return_value, "<", "&lt;")
return_value = string.gsub(return_value, ">", "&gt;")
return return_value , value_original
end
-- #######################
function isThereProtocol(protocol, info)
found = 0
for key,value in pairs(info) do
if(isFieldProtocol(protocol, key)) then
found = 1
end
end
return found
end
-- #######################
function getSIPTableRows(info)
local string_table = ""
local called_party = ""
local calling_party = ""
local sip_rtp_src_addr = 0
local sip_rtp_dst_addr = 0
-- check if there is a SIP field
sip_found = isThereProtocol("SIP", info)
if(sip_found == 1) then
string_table = string_table.."<tr><th colspan=3 class=\"info\" >SIP Protocol Information</th></tr>\n"
string_table = string_table.."<tr><th width=30%> Call-ID </th><td colspan=2><div id=call_id>" .. getFlowValue(info, "SIP_CALL_ID") .. "</div></td></tr>\n"
called_party = getFlowValue(info, "SIP_CALLED_PARTY")
calling_party = getFlowValue(info, "SIP_CALLING_PARTY")
if(((called_party == nil) or (called_party == "")) and ((calling_party == nil) or (calling_party == ""))) then
string_table = string_table.."<tr><th>Call Initiator <i class=\"fa fa-exchange fa-lg\"></i> Called Party</th><td colspan=2><div id=calling_called_party></div></td></tr>\n"
else
string_table = string_table.."<tr><th>Call Initiator <i class=\"fa fa-exchange fa-lg\"></i> Called Party</th><td colspan=2><div id=calling_called_party>" .. calling_party .. " <i class=\"fa fa-exchange fa-lg\"></i> " .. called_party .. "</div></td></tr>\n"
end
string_table = string_table.."<tr><th width=30%>RTP Codecs</th><td colspan=2> <div id=rtp_codecs>" .. getFlowValue(info, "SIP_RTP_CODECS") .. "</></td></tr>\n"
time, time_epoch = getFlowValue(info, "SIP_INVITE_TIME")
if(time_epoch ~= "0") then
string_table = string_table.."<tr><th width=30%>Time of Invite</th><td colspan=2> <div id=time_invite>" .. time .." [" .. secondsToTime(os.time()-tonumber(time_epoch)) .. " ago]</div></td></tr>\n"
else
string_table = string_table.."<tr><th width=30%>Time of Invite</th><td colspan=2></td><div id=time_invite></div></tr>\n"
end
time, time_epoch = getFlowValue(info, "SIP_TRYING_TIME")
if(time_epoch ~= "0") then
string_table = string_table.."<tr><th width=30%>Time of Trying</th><td colspan=2><div id=time_trying>" .. time .." [" .. secondsToTime(os.time()-tonumber(time_epoch)) .. " ago]</div></td></tr>\n"
else
string_table = string_table.."<tr><th width=30%>Time of Trying</th><td colspan=2><div id=time_trying></div></td></tr>\n"
end
time, time_epoch = getFlowValue(info, "SIP_RINGING_TIME")
if(time_epoch ~= "0") then
string_table = string_table.."<tr><th width=30%>Time of Ringing</th><td colspan=2><div id=time_ringing>" .. time .." [" .. secondsToTime(os.time()-tonumber(time_epoch)) .. " ago]</div></td></tr>\n"
else
string_table = string_table.."<tr><th width=30%>Time of Ringing</th><td colspan=2><div id=time_ringing></div></td></tr>\n"
end
time, time_epoch = getFlowValue(info, "SIP_INVITE_OK_TIME")
time_1, time_epoch_1 = getFlowValue(info, "SIP_INVITE_FAILURE_TIME")
string_table = string_table .. "<tr><th width=30%>Time of Invite Ok / Invite Failure</th><td><div id=time_invite_ok>"
if(time_epoch ~= "0") then
string_table = string_table .. time .." [" .. secondsToTime(os.time()-tonumber(time_epoch)) .. " ago]"
end
string_table = string_table .. "</div></td><td><div id=time_invite_failure>\n"
if(time_epoch_1 ~= "0") then
string_table = string_table .. time_1 .." [" .. secondsToTime(os.time()-tonumber(time_epoch_1)) .. " ago]"
end
string_table = string_table .. "</div></td></tr>\n"
time, time_epoch = getFlowValue(info, "SIP_BYE_TIME")
time_1, time_epoch_1 = getFlowValue(info, "SIP_BYE_OK_TIME")
string_table = string_table .. "<tr><th width=30%>Time of Bye / Bye Ok</th><td><div id=time_bye>"
if(time_epoch ~= "0") then
string_table = string_table .. time .." [" .. secondsToTime(os.time()-tonumber(time_epoch)) .. " ago]"
end
string_table = string_table .. "</div></td><td><div id=time_bye_ok>\n"
if(time_epoch_1 ~= "0") then
string_table = string_table .. time_1 .." [" .. secondsToTime(os.time()-tonumber(time_epoch_1)) .. " ago]"
end
string_table = string_table .. "</div></td></tr>\n"
time, time_epoch = getFlowValue(info, "SIP_CANCEL_TIME")
time_1, time_epoch_1 = getFlowValue(info, "SIP_CANCEL_OK_TIME")
string_table = string_table .. "<tr><th width=30%>Time of Cancel / Cancel Ok</th><td><div id=time_cancel>"
if(time_epoch ~= "0") then
string_table = string_table .. time .." [" .. secondsToTime(os.time()-time_epoch) .. " ago]"
end
string_table = string_table .. "</div></td><td><div id=time_cancel_ok>\n"
if(tonumber(time_epoch_1) ~= "0") then
string_table = string_table .. time_1 .." [" .. secondsToTime(os.time()-tonumber(time_epoch_1)) .. " ago]"
end
string_table = string_table .. "</div></td></tr>\n"
string_table = string_table.."<tr><th width=30%>RTP Stream Pears (src <i class=\"fa fa-exchange fa-lg\"></i> dst)</th><td colspan=2><div id=rtp_stream>"
if((getFlowValue(info, "SIP_RTP_IPV4_SRC_ADDR")~=nil) and (getFlowValue(info, "SIP_RTP_IPV4_SRC_ADDR")~="")) then
sip_rtp_src_addr = 1
string_table = string_table .. getFlowValue(info, "SIP_RTP_IPV4_SRC_ADDR")
end
if((getFlowValue(info, "SIP_RTP_L4_SRC_PORT")~=nil) and (getFlowValue(info, "SIP_RTP_L4_SRC_PORT")~="") and (sip_rtp_src_addr == 1)) then
string_table = string_table ..":"..getFlowValue(info, "SIP_RTP_IPV4_SRC_ADDR")
end
if((sip_rtp_src_addr == 1) or ((getFlowValue(info, "SIP_RTP_IPV4_DST_ADDR")~=nil) and (getFlowValue(info, "SIP_RTP_IPV4_DST_ADDR")~=""))) then
string_table = string_table.." <i class=\"fa fa-exchange fa-lg\"></i> "
end
if((getFlowValue(info, "SIP_RTP_IPV4_DST_ADDR")~=nil) and (getFlowValue(info, "SIP_RTP_IPV4_DST_ADDR")~="")) then
sip_rtp_dst_addr = 1
string_table = string_table .. getFlowValue(info, "SIP_RTP_IPV4_DST_ADDR")
end
if((getFlowValue(info, "SIP_RTP_L4_DST_PORT")~=nil) and (getFlowValue(info, "SIP_RTP_L4_DST_PORT")~="") and (sip_rtp_dst_addr == 1)) then
string_table = string_table ..":"..getFlowValue(info, "SIP_RTP_IPV4_DST_ADDR")
end
string_table = string_table.."</div></td></tr>\n"
string_table = string_table.."<tr><th width=30%> Failure Response Code </th><td colspan=2><div id=response_code>" .. getFlowValue(info, "SIP_RESPONSE_CODE") .. "</div></td></tr>\n"
val, val_original = getFlowValue(info, "SIP_REASON_CAUSE")
string_table = string_table.."<tr><th width=30%> Cancel/Bye/Failure Reason Cause </th><td colspan=2><div id=reason_cause>"
if(val_original ~= "0") then
string_table = string_table..val
end
string_table = string_table.."</div></td></tr>\n"
string_table = string_table.."<tr><th width=30%> C IP Addresses </th><td colspan=2><div id=c_ip>" .. getFlowValue(info, "SIP_C_IP") .. "</div></td></tr>\n"
string_table = string_table.."<tr><th width=30%> Call State </th><td colspan=2><div id=call_state>" .. getFlowValue(info, "SIP_CALL_STATE") .. "</div></td></tr>\n"
end
return string_table
end
-- #######################
function getRTPTableRows(info)
local string_table = ""
-- check if there is a RTP field
rtp_found = isThereProtocol("RTP", info)
if(rtp_found == 1) then
string_table = string_table.."<tr><th colspan=3 class=\"info\" >RTP Protocol Information</th></tr>\n"
string_table = string_table.."<tr><th width=30%> Sync Source ID </th><td colspan=2><div id=sync_source_id>" .. getFlowValue(info, "RTP_SSRC") .. "</div></td></tr>\n"
string_table = string_table .. "<tr><th width=30%>First / Last Flow Timestamp</th><td><div id=first_flow_timestamp><i class='fa fa-clock-o fa-lg'></i> "..getFlowValue(info, "RTP_FIRST_TS").."</div></td><td><div id=last_flow_timestamp><i class='fa fa-clock-o fa-lg'></i> "..getFlowValue(info, "RTP_LAST_TS").."</div></td></tr>\n"
string_table = string_table .. "<tr><th width=30%>First / Last Flow Sequence</th><td><div id=first_flow_sequence>"..getFlowValue(info, "RTP_FIRST_SEQ").."</div></td><td><div id=last_flow_sequence>"..getFlowValue(info, "RTP_LAST_SEQ").."</div></td></tr>\n"
string_table = string_table .. "<tr><th width=30%>Jitter IN / OUT</th><td><span id=jitter_in>"..getFlowValue(info, "RTP_IN_JITTER").." ms </span> <span id=jitter_in_trend></span></td><td><span id=jitter_out>"..getFlowValue(info, "RTP_OUT_JITTER").." ms </span> <span id=jitter_out_trend></span></td></tr>\n"
string_table = string_table .. "<tr><th width=30%>Packet Lost in Stream IN / OUT</th><td><span id=packet_lost_in>"..formatPackets(getFlowValue(info, "RTP_IN_PKT_LOST")).."</span> <span id=packet_lost_in_trend></span></td><td><span id=packet_lost_out>"..formatPackets(getFlowValue(info, "RTP_OUT_PKT_LOST")).." </span> <span id=packet_lost_out_trend></span></td></tr>\n"
string_table = string_table .. "<tr><th width=30%>Packet Discarded in Jitter Buffer IN / OUT</th><td><span id=packet_drop_in>"..formatPackets(getFlowValue(info, "RTP_IN_PKT_DROP")).."</span> <span id=packet_drop_in_trend></span></td><td><span id=packet_drop_out>"..formatPackets(getFlowValue(info, "RTP_OUT_PKT_DROP")).." </span> <span id=packet_drop_out_trend></span></td></tr>\n"
string_table = string_table .. "<tr><th width=30%>Payload Type IN / OUT</th><td><div id=payload_type_in>"..getFlowValue(info, "RTP_IN_PAYLOAD_TYPE").."</div></td><td><div id=payload_type_out>"..getFlowValue(info, "RTP_OUT_PAYLOAD_TYPE").."</div></td></tr>\n"
string_table = string_table .. "<tr><th width=30%>Max Delta Time between Packets IN / OUT</th><td><span id=max_delta_time_in>"..getFlowValue(info, "RTP_IN_MAX_DELTA").." ms </span> <span id=max_delta_time_in_trend></span></td><td><span id=max_delta_time_out>"..getFlowValue(info, "RTP_OUT_MAX_DELTA").." ms </span> <span id=max_delta_time_out_trend></span></td></tr>\n"
string_table = string_table .. "<tr><th width=30%> SIP Call Id </th><td colspan=2><div id=rtp_sip_call_id>" .. getFlowValue(info, "RTP_SIP_CALL_ID") .. "</div></td></tr>\n"
string_table = string_table .. "<tr><th width=30%>Quality of VoIP Communication (Average MOS/R-Factor) </th><td colspan=2><span><i class='fa fa-signal'></i> </span><span id=mos_average>"..getFlowValue(info, "RTP_MOS").." </span> <span id=mos_average_trend></span><span> / </span><span id=r_factor_average>"..getFlowValue(info, "RTP_R_FACTOR").." </span> <span id=r_factor_average_trend></span></td></tr>\n"
string_table = string_table .. "<tr><th width=30%>Quality of VoIP Communication (MOS/R-Factor) IN / OUT </th><td><span><i class='fa fa-signal'></i> </span><span id=mos_in>"..getFlowValue(info, "RTP_IN_MOS").." </span> <span id=mos_in_trend></span><span> / </span><span id=r_factor_in>"..getFlowValue(info, "RTP_IN_R_FACTOR").." </span> <span id=r_factor_in_trend></span></td><td><span><i class='fa fa-signal'></i> </span><span id=mos_out>"..getFlowValue(info, "RTP_OUT_MOS").." </span> <span id=mos_out_trend></span><span> / </span><span id=r_factor_out>"..getFlowValue(info, "RTP_OUT_R_FACTOR").." </span> <span id=r_factor_out_trend></span></td></tr>\n"
string_table = string_table .. "<tr><th width=30%>RTP Transit IN / OUT</th><td><div id=rtop_transit_in>"..getFlowValue(info, "RTP_IN_TRANSIT").."</div></td><td><div id=rtp_transit_out>"..getFlowValue(info, "RTP_OUT_TRANSIT").."</div></td></tr>\n"
string_table = string_table .. "<tr><th width=30%>Round Trip Time</th><td colspan=2><span id=rtp_rtt>"..getFlowValue(info, "RTP_RTT").." ms </span> <span id=rtp_rtt_trend></span></td></tr>\n"
string_table = string_table .. "<tr><th width=30%>DTMF tones sent during the call</th><td colspan=2><span id=dtmf_tones>"..getFlowValue(info, "RTP_DTMF_TONES").."</span></td></tr>\n"
end
return string_table
end
-- #######################