-- -- (C) 2013-18 - ntop.org -- dirs = ntop.getDirs() package.path = dirs.installdir .. "/scripts/lua/modules/?.lua;" .. package.path require "template" require "voip_utils" require "graph_utils" local tcp_flow_state_utils = require("tcp_flow_state_utils") if ntop.isPro() then package.path = dirs.installdir .. "/scripts/lua/pro/modules/?.lua;" .. package.path shaper_utils = require("shaper_utils") require "snmp_utils" end local json = require ("dkjson") -- 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 formatInterfaceId(id, idx, snmpdevice) if(id == 65535) then return("Unknown") else if(snmpdevice ~= nil) then return(''..id..'') else return(id) end end end -- ####################### function handleCustomFlowField(key, value, snmpdevice) if((key == 'TCP_FLAGS') or (key == '6')) then return(formatTcpFlags(value)) elseif((key == 'INPUT_SNMP') or (key == '10')) then return(formatInterfaceId(value, "inIfIdx", snmpdevice)) elseif((key == 'OUTPUT_SNMP') or (key == '14')) then return(formatInterfaceId(value, "outIfIdx", snmpdevice)) elseif((key == 'EXPORTER_IPV4_ADDRESS') or (key == 'NPROBE_IPV4_ADDRESS') or (key == '130') or (key == '57943')) then local res = getResolvedAddress(hostkey2hostinfo(value)) local ret = "" if((res == "") or (res == nil)) then ret = ret .. ipaddr else ret = ret .. res end return(ret .. "") elseif((key == 'FLOW_USER_NAME') or (key == '57593')) then elems = string.split(value, ';') if((elems ~= nil) and (#elems == 6)) then r = '' 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 .. "" r = r .. "" r = r .. "" r = r .. "" r = r .. "" r = r .. "" r = r .. "
"..i18n("flow_details.imsi")..""..elems[1]..mcc_name r = r .. "
"..i18n("flow_details.nsapi").."".. elems[2].."
"..i18n("flow_details.gsm_cell_lac").."".. elems[3].."
"..i18n("flow_details.gsm_cell_identifier").."".. elems[4].."
"..i18n("flow_details.sac_service_area_code").."".. elems[5].."
"..i18n("ip_address").."".. ntop.inet_ntoa(elems[6]).."
" 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 "0" 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 = "" if((flags & 1) == 2) then rsp = rsp .. " SYN " end if((flags & 16) == 16) then rsp = rsp .. " ACK " end if((flags & 1) == 1) then rsp = rsp .. " FIN " end if((flags & 4) == 4) then rsp = rsp .. " RST " end if((flags & 8) == 8 ) then rsp = rsp .. " PUSH " end return(rsp .. "") end -- ####################### -- IMPORTANT: keep it in sync with ParserInterface::ParserInterface() local flow_fields_description = { ["IN_BYTES"] = i18n("flow_fields_description.in_bytes"), ["IN_PKTS"] = i18n("flow_fields_description.in_pkts"), ["PROTOCOL"] = i18n("flow_fields_description.protocol"), ["PROTOCOL_MAP"] = i18n("flow_fields_description.protocol_map"), ["SRC_TOS"] = i18n("flow_fields_description.src_tos"), ["TCP_FLAGS"] = i18n("flow_fields_description.tcp_flags"), ["L4_SRC_PORT"] = i18n("flow_fields_description.l4_src_port"), ["L4_SRC_PORT_MAP"] = i18n("flow_fields_description.l4_src_port_map"), ["IPV4_SRC_ADDR"] = i18n("flow_fields_description.ipv4_src_addr"), ["IPV4_SRC_MASK"] = i18n("flow_fields_description.ipv4_src_mask"), ["INPUT_SNMP"] = i18n("flow_fields_description.input_snmp"), ["L4_DST_PORT"] = i18n("flow_fields_description.l4_dst_port"), ["L4_DST_PORT_MAP"] = i18n("flow_fields_description.l4_dst_port_map"), ["L4_SRV_PORT"] = i18n("flow_fields_description.l4_srv_port"), ["L4_SRV_PORT_MAP"] = i18n("flow_fields_description.l4_srv_port_map"), ["IPV4_DST_ADDR"] = i18n("flow_fields_description.ipv4_dst_addr"), ["IPV4_DST_MASK"] = i18n("flow_fields_description.ipv4_dst_mask"), ["OUTPUT_SNMP"] = i18n("flow_fields_description.output_snmp"), ["IPV4_NEXT_HOP"] = i18n("flow_fields_description.ipv4_next_hop"), ["SRC_AS"] = i18n("flow_fields_description.src_as"), ["DST_AS"] = i18n("flow_fields_description.dst_as"), ["LAST_SWITCHED"] = i18n("flow_fields_description.last_switched"), ["FIRST_SWITCHED"] = i18n("flow_fields_description.first_switched"), ["OUT_BYTES"] = i18n("flow_fields_description.out_bytes"), ["OUT_PKTS"] = i18n("flow_fields_description.out_pkts"), ["IPV6_SRC_ADDR"] = i18n("flow_fields_description.ipv6_src_addr"), ["IPV6_DST_ADDR"] = i18n("flow_fields_description.ipv6_dst_addr"), ["IPV6_SRC_MASK"] = i18n("flow_fields_description.ipv6_src_mask"), ["IPV6_DST_MASK"] = i18n("flow_fields_description.ipv6_dst_mask"), ["ICMP_TYPE"] = i18n("flow_fields_description.icmp_type"), ["SAMPLING_INTERVAL"] = i18n("flow_fields_description.sampling_interval"), ["SAMPLING_ALGORITHM"] = i18n("flow_fields_description.sampling_algorithm"), ["FLOW_ACTIVE_TIMEOUT"] = i18n("flow_fields_description.flow_active_timeout"), ["FLOW_INACTIVE_TIMEOUT"] = i18n("flow_fields_description.flow_inactive_timeout"), ["ENGINE_TYPE"] = i18n("flow_fields_description.engine_type"), ["ENGINE_ID"] = i18n("flow_fields_description.engine_id"), ["TOTAL_BYTES_EXP"] = i18n("flow_fields_description.total_bytes_exp"), ["TOTAL_PKTS_EXP"] = i18n("flow_fields_description.total_pkts_exp"), ["TOTAL_FLOWS_EXP"] = i18n("flow_fields_description.total_flows_exp"), ["MIN_TTL"] = i18n("flow_fields_description.min_ttl"), ["MAX_TTL"] = i18n("flow_fields_description.max_ttl"), ["DST_TOS"] = i18n("flow_fields_description.dst_tos"), ["IN_SRC_MAC"] = i18n("flow_fields_description.in_src_mac"), ["OUT_SRC_MAC"] = i18n("flow_fields_description.out_src_mac"), ["SRC_VLAN"] = i18n("flow_fields_description.src_vlan"), ["DST_VLAN"] = i18n("flow_fields_description.dst_vlan"), ["DOT1Q_SRC_VLAN"] = i18n("flow_fields_description.dot1q_src_vlan"), ["DOT1Q_DST_VLAN"] = i18n("flow_fields_description.dot1q_dst_vlan"), ["IP_PROTOCOL_VERSION"] = i18n("flow_fields_description.ip_protocol_version"), ["DIRECTION"] = i18n("flow_fields_description.direction"), ["IPV6_NEXT_HOP"] = i18n("flow_fields_description.ipv6_next_hop"), ["MPLS_LABEL_1"] = i18n("flow_fields_description.mpls_label_1"), ["MPLS_LABEL_2"] = i18n("flow_fields_description.mpls_label_2"), ["MPLS_LABEL_3"] = i18n("flow_fields_description.mpls_label_3"), ["MPLS_LABEL_4"] = i18n("flow_fields_description.mpls_label_4"), ["MPLS_LABEL_5"] = i18n("flow_fields_description.mpls_label_5"), ["MPLS_LABEL_6"] = i18n("flow_fields_description.mpls_label_6"), ["MPLS_LABEL_7"] = i18n("flow_fields_description.mpls_label_7"), ["MPLS_LABEL_8"] = i18n("flow_fields_description.mpls_label_8"), ["MPLS_LABEL_9"] = i18n("flow_fields_description.mpls_label_9"), ["MPLS_LABEL_10"] = i18n("flow_fields_description.mpls_label_10"), ["IN_DST_MAC"] = i18n("flow_fields_description.in_dst_mac"), ["OUT_DST_MAC"] = i18n("flow_fields_description.out_dst_mac"), ["APPLICATION_ID"] = i18n("flow_fields_description.application_id"), ["PACKET_SECTION_OFFSET"] = i18n("flow_fields_description.packet_section_offset"), ["SAMPLED_PACKET_SIZE"] = i18n("flow_fields_description.sampled_packet_size"), ["SAMPLED_PACKET_ID"] = i18n("flow_fields_description.sampled_packet_id"), ["EXPORTER_IPV4_ADDRESS"] = i18n("flow_fields_description.exporter_ipv4_address"), ["EXPORTER_IPV6_ADDRESS"] = i18n("flow_fields_description.exporter_ipv6_address"), ["FLOW_ID"] = i18n("flow_fields_description.flow_id"), ["FLOW_START_SEC"] = i18n("flow_fields_description.flow_start_sec"), ["FLOW_END_SEC"] = i18n("flow_fields_description.flow_end_sec"), ["FLOW_START_MILLISECONDS"] = i18n("flow_fields_description.flow_start_milliseconds"), ["FLOW_START_MICROSECONDS"] = i18n("flow_fields_description.flow_start_microseconds"), ["FLOW_END_MILLISECONDS"] = i18n("flow_fields_description.flow_end_milliseconds"), ["FLOW_END_MICROSECONDS"] = i18n("flow_fields_description.flow_end_microseconds"), ['FIREWALL_EVENT'] = i18n("flow_fields_description.firewall_event"), ["BIFLOW_DIRECTION"] = i18n("flow_fields_description.biflow_direction"), ["INGRESS_VRFID"] = i18n("flow_fields_description.ingress_vrfid"), ["FLOW_DURATION_MILLISECONDS"] = i18n("flow_fields_description.flow_duration_milliseconds"), ["FLOW_DURATION_MICROSECONDS"] = i18n("flow_fields_description.flow_duration_microseconds"), ["ICMP_IPV4_TYPE"] = i18n("flow_fields_description.icmp_ipv4_type"), ["ICMP_IPV4_CODE"] = i18n("flow_fields_description.icmp_ipv4_code"), ["POST_NAT_SRC_IPV4_ADDR"] = i18n("flow_fields_description.post_nat_src_ipv4_addr"), ["POST_NAT_DST_IPV4_ADDR"] = i18n("flow_fields_description.post_nat_dst_ipv4_addr"), ["POST_NAPT_SRC_TRANSPORT_PORT"] = i18n("flow_fields_description.post_napt_src_transport_port"), ["POST_NAPT_DST_TRANSPORT_PORT"] = i18n("flow_fields_description.post_napt_dst_transport_port"), ["OBSERVATION_POINT_TYPE"] = i18n("flow_fields_description.observation_point_type"), ["OBSERVATION_POINT_ID"] = i18n("flow_fields_description.observation_point_id"), ["SELECTOR_ID"] = i18n("flow_fields_description.selector_id"), ["IPFIX_SAMPLING_ALGORITHM"] = i18n("flow_fields_description.ipfix_sampling_algorithm"), ["SAMPLING_SIZE"] = i18n("flow_fields_description.sampling_size"), ["SAMPLING_POPULATION"] = i18n("flow_fields_description.sampling_population"), ["FRAME_LENGTH"] = i18n("flow_fields_description.frame_length"), ["PACKETS_OBSERVED"] = i18n("flow_fields_description.packets_observed"), ["PACKETS_SELECTED"] = i18n("flow_fields_description.packets_selected"), ["SELECTOR_NAME"] = i18n("flow_fields_description.selector_name"), ["APPLICATION_NAME"] = i18n("flow_fields_description.application_name"), ["USER_NAME"] = i18n("flow_fields_description.user_name"), ["SRC_FRAGMENTS"] = i18n("flow_fields_description.src_fragments"), ["DST_FRAGMENTS"] = i18n("flow_fields_description.dst_fragments"), ["CLIENT_NW_LATENCY_MS"] = i18n("flow_fields_description.client_nw_latency_ms"), ["SERVER_NW_LATENCY_MS"] = i18n("flow_fields_description.server_nw_latency_ms"), ["APPL_LATENCY_MS"] = i18n("flow_fields_description.appl_latency_ms"), ["NPROBE_IPV4_ADDRESS"] = i18n("flow_fields_description.nprobe_ipv4_address"), ["SRC_TO_DST_MAX_THROUGHPUT"] = i18n("flow_fields_description.src_to_dst_max_throughput"), ["SRC_TO_DST_MIN_THROUGHPUT"] = i18n("flow_fields_description.src_to_dst_min_throughput"), ["SRC_TO_DST_AVG_THROUGHPUT"] = i18n("flow_fields_description.src_to_dst_avg_throughput"), ["DST_TO_SRC_MAX_THROUGHPUT"] = i18n("flow_fields_description.dst_to_src_max_throughput"), ["DST_TO_SRC_MIN_THROUGHPUT"] = i18n("flow_fields_description.dst_to_src_min_throughput"), ["DST_TO_SRC_AVG_THROUGHPUT"] = i18n("flow_fields_description.dst_to_src_avg_throughput"), ["NUM_PKTS_UP_TO_128_BYTES"] = i18n("flow_fields_description.num_pkts_up_to_128_bytes"), ["NUM_PKTS_128_TO_256_BYTES"] = i18n("flow_fields_description.num_pkts_128_to_256_bytes"), ["NUM_PKTS_256_TO_512_BYTES"] = i18n("flow_fields_description.num_pkts_256_to_512_bytes"), ["NUM_PKTS_512_TO_1024_BYTES"] = i18n("flow_fields_description.num_pkts_512_to_1024_bytes"), ["NUM_PKTS_1024_TO_1514_BYTES"] = i18n("flow_fields_description.num_pkts_1024_to_1514_bytes"), ["NUM_PKTS_OVER_1514_BYTES"] = i18n("flow_fields_description.num_pkts_over_1514_bytes"), ["CUMULATIVE_ICMP_TYPE"] = i18n("flow_fields_description.cumulative_icmp_type"), ["SRC_IP_COUNTRY"] = i18n("flow_fields_description.src_ip_country"), ["SRC_IP_CITY"] = i18n("flow_fields_description.src_ip_city"), ["DST_IP_COUNTRY"] = i18n("flow_fields_description.dst_ip_country"), ["DST_IP_CITY"] = i18n("flow_fields_description.dst_ip_city"), ["SRC_IP_LONG"] = i18n("flow_fields_description.src_ip_long"), ["SRC_IP_LAT"] = i18n("flow_fields_description.src_ip_lat"), ["DST_IP_LONG"] = i18n("flow_fields_description.dst_ip_long"), ["DST_IP_LAT"] = i18n("flow_fields_description.dst_ip_lat"), ["FLOW_PROTO_PORT"] = i18n("flow_fields_description.flow_proto_port"), ["UPSTREAM_TUNNEL_ID"] = i18n("flow_fields_description.upstream_tunnel_id"), ["UPSTREAM_SESSION_ID"] = i18n("flow_fields_description.upstream_session_id"), ["LONGEST_FLOW_PKT"] = i18n("flow_fields_description.longest_flow_pkt"), ["SHORTEST_FLOW_PKT"] = i18n("flow_fields_description.shortest_flow_pkt"), ["RETRANSMITTED_IN_BYTES"] = i18n("flow_fields_description.retransmitted_in_bytes"), ["RETRANSMITTED_IN_PKTS"] = i18n("flow_fields_description.retransmitted_in_pkts"), ["RETRANSMITTED_OUT_BYTES"] = i18n("flow_fields_description.retransmitted_out_bytes"), ["RETRANSMITTED_OUT_PKTS"] = i18n("flow_fields_description.retransmitted_out_pkts"), ["OOORDER_IN_PKTS"] = i18n("flow_fields_description.ooorder_in_pkts"), ["OOORDER_OUT_PKTS"] = i18n("flow_fields_description.ooorder_out_pkts"), ["UNTUNNELED_PROTOCOL"] = i18n("flow_fields_description.untunneled_protocol"), ["UNTUNNELED_IPV4_SRC_ADDR"] = i18n("flow_fields_description.untunneled_ipv4_src_addr"), ["UNTUNNELED_L4_SRC_PORT"] = i18n("flow_fields_description.untunneled_l4_src_port"), ["UNTUNNELED_IPV4_DST_ADDR"] = i18n("flow_fields_description.untunneled_ipv4_dst_addr"), ["UNTUNNELED_L4_DST_PORT"] = i18n("flow_fields_description.untunneled_l4_dst_port"), ["L7_PROTO"] = i18n("flow_fields_description.l7_proto"), ["L7_PROTO_NAME"] = i18n("flow_fields_description.l7_proto_name"), ["DOWNSTREAM_TUNNEL_ID"] = i18n("flow_fields_description.downstream_tunnel_id"), ["DOWNSTREAM_SESSION_ID"] = i18n("flow_fields_description.downstream_session_id"), ["SSL_SERVER_NAME"] = i18n("flow_fields_description.ssl_server_name"), ["BITTORRENT_HASH"] = i18n("flow_fields_description.bittorrent_hash"), ["FLOW_USER_NAME"] = i18n("flow_fields_description.flow_user_name"), ["FLOW_SERVER_NAME"] = i18n("flow_fields_description.flow_server_name"), ["PLUGIN_NAME"] = i18n("flow_fields_description.plugin_name"), ["UNTUNNELED_IPV6_SRC_ADDR"] = i18n("flow_fields_description.untunneled_ipv6_src_addr"), ["UNTUNNELED_IPV6_DST_ADDR"] = i18n("flow_fields_description.untunneled_ipv6_dst_addr"), ["NUM_PKTS_TTL_EQ_1"] = i18n("flow_fields_description.num_pkts_ttl_eq_1"), ["NUM_PKTS_TTL_2_5"] = i18n("flow_fields_description.num_pkts_ttl_2_5"), ["NUM_PKTS_TTL_5_32"] = i18n("flow_fields_description.num_pkts_ttl_5_32"), ["NUM_PKTS_TTL_32_64"] = i18n("flow_fields_description.num_pkts_ttl_32_64"), ["NUM_PKTS_TTL_64_96"] = i18n("flow_fields_description.num_pkts_ttl_64_96"), ["NUM_PKTS_TTL_96_128"] = i18n("flow_fields_description.num_pkts_ttl_96_128"), ["NUM_PKTS_TTL_128_160"] = i18n("flow_fields_description.num_pkts_ttl_128_160"), ["NUM_PKTS_TTL_160_192"] = i18n("flow_fields_description.num_pkts_ttl_160_192"), ["NUM_PKTS_TTL_192_224"] = i18n("flow_fields_description.num_pkts_ttl_192_224"), ["NUM_PKTS_TTL_224_255"] = i18n("flow_fields_description.num_pkts_ttl_224_255"), ["IN_SRC_OSI_SAP"] = i18n("flow_fields_description.in_src_osi_sap"), ["OUT_DST_OSI_SAP"] = i18n("flow_fields_description.out_dst_osi_sap"), ["DURATION_IN"] = i18n("flow_fields_description.duration_in"), ["DURATION_OUT"] = i18n("flow_fields_description.duration_out"), ["TCP_WIN_MIN_IN"] = i18n("flow_fields_description.tcp_win_min_in"), ["TCP_WIN_MAX_IN"] = i18n("flow_fields_description.tcp_win_max_in"), ["TCP_WIN_MSS_IN"] = i18n("flow_fields_description.tcp_win_mss_in"), ["TCP_WIN_SCALE_IN"] = i18n("flow_fields_description.tcp_win_scale_in"), ["TCP_WIN_MIN_OUT"] = i18n("flow_fields_description.tcp_win_min_out"), ["TCP_WIN_MAX_OUT"] = i18n("flow_fields_description.tcp_win_max_out"), ["TCP_WIN_MSS_OUT"] = i18n("flow_fields_description.tcp_win_mss_out"), ["TCP_WIN_SCALE_OUT"] = i18n("flow_fields_description.tcp_win_scale_out"), ["PAYLOAD_HASH"] = i18n("flow_fields_description.payload_hash"), ["SRC_AS_MAP"] = i18n("flow_fields_description.src_as_map"), ["DST_AS_MAP"] = i18n("flow_fields_description.dst_as_map"), -- BGP Update Listener ["SRC_AS_PATH_1"] = i18n("flow_fields_description.src_as_path_1"), ["SRC_AS_PATH_2"] = i18n("flow_fields_description.src_as_path_2"), ["SRC_AS_PATH_3"] = i18n("flow_fields_description.src_as_path_3"), ["SRC_AS_PATH_4"] = i18n("flow_fields_description.src_as_path_4"), ["SRC_AS_PATH_5"] = i18n("flow_fields_description.src_as_path_5"), ["SRC_AS_PATH_6"] = i18n("flow_fields_description.src_as_path_6"), ["SRC_AS_PATH_7"] = i18n("flow_fields_description.src_as_path_7"), ["SRC_AS_PATH_8"] = i18n("flow_fields_description.src_as_path_8"), ["SRC_AS_PATH_9"] = i18n("flow_fields_description.src_as_path_9"), ["SRC_AS_PATH_10"] = i18n("flow_fields_description.src_as_path_10"), ["DST_AS_PATH_1"] = i18n("flow_fields_description.dst_as_path_1"), ["DST_AS_PATH_2"] = i18n("flow_fields_description.dst_as_path_2"), ["DST_AS_PATH_3"] = i18n("flow_fields_description.dst_as_path_3"), ["DST_AS_PATH_4"] = i18n("flow_fields_description.dst_as_path_4"), ["DST_AS_PATH_5"] = i18n("flow_fields_description.dst_as_path_5"), ["DST_AS_PATH_6"] = i18n("flow_fields_description.dst_as_path_6"), ["DST_AS_PATH_7"] = i18n("flow_fields_description.dst_as_path_7"), ["DST_AS_PATH_8"] = i18n("flow_fields_description.dst_as_path_8"), ["DST_AS_PATH_9"] = i18n("flow_fields_description.dst_as_path_9"), ["DST_AS_PATH_10"] = i18n("flow_fields_description.dst_as_path_10"), -- DHCP Protocol ["DHCP_CLIENT_MAC"] = i18n("flow_fields_description.dhcp_client_mac"), ["DHCP_CLIENT_IP"] = i18n("flow_fields_description.dhcp_client_ip"), ["DHCP_CLIENT_NAME"] = i18n("flow_fields_description.dhcp_client_name"), ["DHCP_REMOTE_ID"] = i18n("flow_fields_description.dhcp_remote_id"), ["DHCP_SUBSCRIBER_ID"] = i18n("flow_fields_description.dhcp_subscriber_id"), ["DHCP_MESSAGE_TYPE"] = i18n("flow_fields_description.dhcp_message_type"), -- Diameter Protocol ["DIAMETER_REQ_MSG_TYPE"] = i18n("flow_fields_description.diameter_req_msg_type"), ["DIAMETER_RSP_MSG_TYPE"] = i18n("flow_fields_description.diameter_rsp_msg_type"), ["DIAMETER_REQ_ORIGIN_HOST"] = i18n("flow_fields_description.diameter_req_origin_host"), ["DIAMETER_RSP_ORIGIN_HOST"] = i18n("flow_fields_description.diameter_rsp_origin_host"), ["DIAMETER_REQ_USER_NAME"] = i18n("flow_fields_description.diameter_req_user_name"), ["DIAMETER_RSP_RESULT_CODE"] = i18n("flow_fields_description.diameter_rsp_result_code"), ["DIAMETER_EXP_RES_VENDOR_ID"] = i18n("flow_fields_description.diameter_exp_res_vendor_id"), ["DIAMETER_EXP_RES_RESULT_CODE"] = i18n("flow_fields_description.diameter_exp_res_result_code"), ["DIAMETER_HOP_BY_HOP_ID"] = i18n("flow_fields_description.diameter_hop_by_hop_id"), ["DIAMETER_CLR_CANCEL_TYPE"] = i18n("flow_fields_description.diameter_clr_cancel_type"), ["DIAMETER_CLR_FLAGS"] = i18n("flow_fields_description.diameter_clr_flags"), -- DNS/LLMNR Protocol ["DNS_QUERY"] = i18n("flow_fields_description.dns_query"), ["DNS_QUERY_ID"] = i18n("flow_fields_description.dns_query_id"), ["DNS_QUERY_TYPE"] = i18n("flow_fields_description.dns_query_type"), ["DNS_RET_CODE"] = i18n("flow_fields_description.dns_ret_code"), ["DNS_NUM_ANSWERS"] = i18n("flow_fields_description.dns_num_answers"), ["DNS_TTL_ANSWER"] = i18n("flow_fields_description.dns_ttl_answer"), ["DNS_RESPONSE"] = i18n("flow_fields_description.dns_response"), -- FTP Protocol ["FTP_LOGIN"] = i18n("flow_fields_description.ftp_login"), ["FTP_PASSWORD"] = i18n("flow_fields_description.ftp_password"), ["FTP_COMMAND"] = i18n("flow_fields_description.ftp_command"), ["FTP_COMMAND_RET_CODE"] = i18n("flow_fields_description.ftp_command_ret_code"), -- GTPv0 Signaling Protocol ["GTPV0_REQ_MSG_TYPE"] = i18n("flow_fields_description.gtpv0_req_msg_type"), ["GTPV0_RSP_MSG_TYPE"] = i18n("flow_fields_description.gtpv0_rsp_msg_type"), ["GTPV0_TID"] = i18n("flow_fields_description.gtpv0_tid"), ["GTPV0_APN_NAME"] = i18n("flow_fields_description.gtpv0_apn_name"), ["GTPV0_END_USER_IP"] = i18n("flow_fields_description.gtpv0_end_user_ip"), ["GTPV0_END_USER_MSISDN"] = i18n("flow_fields_description.gtpv0_end_user_msisdn"), ["GTPV0_RAI_MCC"] = i18n("flow_fields_description.gtpv0_rai_mcc"), ["GTPV0_RAI_MNC"] = i18n("flow_fields_description.gtpv0_rai_mnc"), ["GTPV0_RAI_CELL_LAC"] = i18n("flow_fields_description.gtpv0_rai_cell_lac"), ["GTPV0_RAI_CELL_RAC"] = i18n("flow_fields_description.gtpv0_rai_cell_rac"), ["GTPV0_RESPONSE_CAUSE"] = i18n("flow_fields_description.gtpv0_response_cause"), -- GTPv1 Signaling Protocol ["GTPV1_REQ_MSG_TYPE"] = i18n("flow_fields_description.gtpv1_req_msg_type"), ["GTPV1_RSP_MSG_TYPE"] = i18n("flow_fields_description.gtpv1_rsp_msg_type"), ["GTPV1_C2S_TEID_DATA"] = i18n("flow_fields_description.gtpv1_c2s_teid_data"), ["GTPV1_C2S_TEID_CTRL"] = i18n("flow_fields_description.gtpv1_c2s_teid_ctrl"), ["GTPV1_S2C_TEID_DATA"] = i18n("flow_fields_description.gtpv1_s2c_teid_data"), ["GTPV1_S2C_TEID_CTRL"] = i18n("flow_fields_description.gtpv1_s2c_teid_ctrl"), ["GTPV1_END_USER_IP"] = i18n("flow_fields_description.gtpv1_end_user_ip"), ["GTPV1_END_USER_IMSI"] = i18n("flow_fields_description.gtpv1_end_user_imsi"), ["GTPV1_END_USER_MSISDN"] = i18n("flow_fields_description.gtpv1_end_user_msisdn"), ["GTPV1_END_USER_IMEI"] = i18n("flow_fields_description.gtpv1_end_user_imei"), ["GTPV1_APN_NAME"] = i18n("flow_fields_description.gtpv1_apn_name"), ["GTPV1_RAT_TYPE"] = i18n("flow_fields_description.gtpv1_rat_type"), ["GTPV1_RAI_MCC"] = i18n("flow_fields_description.gtpv1_rai_mcc"), ["GTPV1_RAI_MNC"] = i18n("flow_fields_description.gtpv1_rai_mnc"), ["GTPV1_RAI_LAC"] = i18n("flow_fields_description.gtpv1_rai_lac"), ["GTPV1_RAI_RAC"] = i18n("flow_fields_description.gtpv1_rai_rac"), ["GTPV1_ULI_MCC"] = i18n("flow_fields_description.gtpv1_uli_mcc"), ["GTPV1_ULI_MNC"] = i18n("flow_fields_description.gtpv1_uli_mnc"), ["GTPV1_ULI_CELL_LAC"] = i18n("flow_fields_description.gtpv1_uli_cell_lac"), ["GTPV1_ULI_CELL_CI"] = i18n("flow_fields_description.gtpv1_uli_cell_ci"), ["GTPV1_ULI_SAC"] = i18n("flow_fields_description.gtpv1_uli_sac"), ["GTPV1_RESPONSE_CAUSE"] = i18n("flow_fields_description.gtpv1_response_cause"), -- GTPv2 Signaling Protocol ["GTPV2_REQ_MSG_TYPE"] = i18n("flow_fields_description.gtpv2_req_msg_type"), ["GTPV2_RSP_MSG_TYPE"] = i18n("flow_fields_description.gtpv2_rsp_msg_type"), ["GTPV2_C2S_S1U_GTPU_TEID"] = i18n("flow_fields_description.gtpv2_c2s_s1u_gtpu_teid"), ["GTPV2_C2S_S1U_GTPU_IP"] = i18n("flow_fields_description.gtpv2_c2s_s1u_gtpu_ip"), ["GTPV2_S2C_S1U_GTPU_TEID"] = i18n("flow_fields_description.gtpv2_s2c_s1u_gtpu_teid"), ["GTPV2_S5_S8_GTPC_TEID"] = i18n("flow_fields_description.gtpv2_s5_s8_gtpc_teid"), ["GTPV2_S2C_S1U_GTPU_IP"] = i18n("flow_fields_description.gtpv2_s2c_s1u_gtpu_ip"), ["GTPV2_C2S_S5_S8_GTPU_TEID"] = i18n("flow_fields_description.gtpv2_c2s_s5_s8_gtpu_teid"), ["GTPV2_S2C_S5_S8_GTPU_TEID"] = i18n("flow_fields_description.gtpv2_s2c_s5_s8_gtpu_teid"), ["GTPV2_C2S_S5_S8_GTPU_IP"] = i18n("flow_fields_description.gtpv2_c2s_s5_s8_gtpu_ip"), ["GTPV2_S2C_S5_S8_GTPU_IP"] = i18n("flow_fields_description.gtpv2_s2c_s5_s8_gtpu_ip"), ["GTPV2_END_USER_IMSI"] = i18n("flow_fields_description.gtpv2_end_user_imsi"), ["GTPV2_END_USER_MSISDN"] = i18n("flow_fields_description.gtpv2_end_user_msisdn"), ["GTPV2_APN_NAME"] = i18n("flow_fields_description.gtpv2_apn_name"), ["GTPV2_ULI_MCC"] = i18n("flow_fields_description.gtpv2_uli_mcc"), ["GTPV2_ULI_MNC"] = i18n("flow_fields_description.gtpv2_uli_mnc"), ["GTPV2_ULI_CELL_TAC"] = i18n("flow_fields_description.gtpv2_uli_cell_tac"), ["GTPV2_ULI_CELL_ID"] = i18n("flow_fields_description.gtpv2_uli_cell_id"), ["GTPV2_RESPONSE_CAUSE"] = i18n("flow_fields_description.gtpv2_response_cause"), ["GTPV2_RAT_TYPE"] = i18n("flow_fields_description.gtpv2_rat_type"), ["GTPV2_PDN_IP"] = i18n("flow_fields_description.gtpv2_pdn_ip"), ["GTPV2_END_USER_IMEI"] = i18n("flow_fields_description.gtpv2_end_user_imei"), ["GTPV2_C2S_S5_S8_GTPC_IP"] = i18n("flow_fields_description.gtpv2_c2s_s5_s8_gtpc_ip"), ["GTPV2_S2C_S5_S8_GTPC_IP"] = i18n("flow_fields_description.gtpv2_s2c_s5_s8_gtpc_ip"), ["GTPV2_C2S_S5_S8_SGW_GTPU_TEID"] = i18n("flow_fields_description.gtpv2_c2s_s5_s8_sgw_gtpu_teid"), ["GTPV2_S2C_S5_S8_SGW_GTPU_TEID"] = i18n("flow_fields_description.gtpv2_s2c_s5_s8_sgw_gtpu_teid"), ["GTPV2_C2S_S5_S8_SGW_GTPU_IP"] = i18n("flow_fields_description.gtpv2_c2s_s5_s8_sgw_gtpu_ip"), ["GTPV2_S2C_S5_S8_SGW_GTPU_IP"] = i18n("flow_fields_description.gtpv2_s2c_s5_s8_sgw_gtpu_ip"), -- HTTP Protocol ["HTTP_URL"] = i18n("flow_fields_description.http_url"), ["HTTP_METHOD"] = i18n("flow_fields_description.http_method"), ["HTTP_RET_CODE"] = i18n("flow_fields_description.http_ret_code"), ["HTTP_REFERER"] = i18n("flow_fields_description.http_referer"), ["HTTP_UA"] = i18n("flow_fields_description.http_ua"), ["HTTP_MIME"] = i18n("flow_fields_description.http_mime"), ["HTTP_HOST"] = i18n("flow_fields_description.http_host"), ["HTTP_SITE"] = i18n("flow_fields_description.http_site"), ["HTTP_X_FORWARDED_FOR"] = i18n("flow_fields_description.http_x_forwarded_for"), ["HTTP_VIA"] = i18n("flow_fields_description.http_via"), -- IMAP Protocol ["IMAP_LOGIN"] = i18n("flow_fields_description.imap_login"), -- MySQL Plugin ["MYSQL_SERVER_VERSION"] = i18n("flow_fields_description.mysql_server_version"), ["MYSQL_USERNAME"] = i18n("flow_fields_description.mysql_username"), ["MYSQL_DB"] = i18n("flow_fields_description.mysql_db"), ["MYSQL_QUERY"] = i18n("flow_fields_description.mysql_query"), ["MYSQL_RESPONSE"] = i18n("flow_fields_description.mysql_response"), ["MYSQL_APPL_LATENCY_USEC"] = i18n("flow_fields_description.mysql_appl_latency_usec"), -- NETBIOS Protocol ["NETBIOS_QUERY_NAME"] = i18n("flow_fields_description.netbios_query_name"), ["NETBIOS_QUERY_TYPE"] = i18n("flow_fields_description.netbios_query_type"), ["NETBIOS_RESPONSE"] = i18n("flow_fields_description.netbios_response"), ["NETBIOS_QUERY_OS"] = i18n("flow_fields_description.netbios_query_os"), -- Oracle Protocol ["ORACLE_USERNAME"] = i18n("flow_fields_description.oracle_username"), ["ORACLE_QUERY"] = i18n("flow_fields_description.oracle_query"), ["ORACLE_RSP_CODE"] = i18n("flow_fields_description.oracle_rsp_code"), ["ORACLE_RSP_STRING"] = i18n("flow_fields_description.oracle_rsp_string"), ["ORACLE_QUERY_DURATION"] = i18n("flow_fields_description.oracle_query_duration"), -- OP3 Protocol ["POP_USER"] = i18n("flow_fields_description.pop_user"), -- System process information ["SRC_PROC_PID"] = i18n("flow_fields_description.src_proc_pid"), ["SRC_PROC_NAME"] = i18n("flow_fields_description.src_proc_name"), ["SRC_PROC_UID"] = i18n("flow_fields_description.src_proc_uid"), ["SRC_PROC_USER_NAME"] = i18n("flow_fields_description.src_proc_user_name"), ["SRC_FATHER_PROC_PID"] = i18n("flow_fields_description.src_father_proc_pid"), ["SRC_FATHER_PROC_NAME"] = i18n("flow_fields_description.src_father_proc_name"), ["SRC_PROC_ACTUAL_MEMORY"] = i18n("flow_fields_description.src_proc_actual_memory"), ["SRC_PROC_PEAK_MEMORY"] = i18n("flow_fields_description.src_proc_peak_memory"), ["SRC_PROC_AVERAGE_CPU_LOAD"] = i18n("flow_fields_description.src_proc_average_cpu_load"), ["SRC_PROC_NUM_PAGE_FAULTS"] = i18n("flow_fields_description.src_proc_num_page_faults"), ["SRC_PROC_PCTG_IOWAIT"] = i18n("flow_fields_description.src_proc_pctg_iowait"), ["DST_PROC_PID"] = i18n("flow_fields_description.dst_proc_pid"), ["DST_PROC_NAME"] = i18n("flow_fields_description.dst_proc_name"), ["DST_PROC_UID"] = i18n("flow_fields_description.dst_proc_uid"), ["DST_PROC_USER_NAME"] = i18n("flow_fields_description.dst_proc_user_name"), ["DST_FATHER_PROC_PID"] = i18n("flow_fields_description.dst_father_proc_pid"), ["DST_FATHER_PROC_NAME"] = i18n("flow_fields_description.dst_father_proc_name"), ["DST_PROC_ACTUAL_MEMORY"] = i18n("flow_fields_description.dst_proc_actual_memory"), ["DST_PROC_PEAK_MEMORY"] = i18n("flow_fields_description.dst_proc_peak_memory"), ["DST_PROC_AVERAGE_CPU_LOAD"] = i18n("flow_fields_description.dst_proc_average_cpu_load"), ["DST_PROC_NUM_PAGE_FAULTS"] = i18n("flow_fields_description.dst_proc_num_page_faults"), ["DST_PROC_PCTG_IOWAIT"] = i18n("flow_fields_description.dst_proc_pctg_iowait"), -- Radius Protocol ["RADIUS_REQ_MSG_TYPE"] = i18n("flow_fields_description.radius_req_msg_type"), ["RADIUS_RSP_MSG_TYPE"] = i18n("flow_fields_description.radius_rsp_msg_type"), ["RADIUS_USER_NAME"] = i18n("flow_fields_description.radius_user_name"), ["RADIUS_CALLING_STATION_ID"] = i18n("flow_fields_description.radius_calling_station_id"), ["RADIUS_CALLED_STATION_ID"] = i18n("flow_fields_description.radius_called_station_id"), ["RADIUS_NAS_IP_ADDR"] = i18n("flow_fields_description.radius_nas_ip_addr"), ["RADIUS_NAS_IDENTIFIER"] = i18n("flow_fields_description.radius_nas_identifier"), ["RADIUS_USER_IMSI"] = i18n("flow_fields_description.radius_user_imsi"), ["RADIUS_USER_IMEI"] = i18n("flow_fields_description.radius_user_imei"), ["RADIUS_FRAMED_IP_ADDR"] = i18n("flow_fields_description.radius_framed_ip_addr"), ["RADIUS_ACCT_SESSION_ID"] = i18n("flow_fields_description.radius_acct_session_id"), ["RADIUS_ACCT_STATUS_TYPE"] = i18n("flow_fields_description.radius_acct_status_type"), ["RADIUS_ACCT_IN_OCTETS"] = i18n("flow_fields_description.radius_acct_in_octets"), ["RADIUS_ACCT_OUT_OCTETS"] = i18n("flow_fields_description.radius_acct_out_octets"), ["RADIUS_ACCT_IN_PKTS"] = i18n("flow_fields_description.radius_acct_in_pkts"), ["RADIUS_ACCT_OUT_PKTS"] = i18n("flow_fields_description.radius_acct_out_pkts"), -- RTP Plugin ["RTP_SSRC"] = i18n("flow_fields_description.rtp_ssrc"), ["RTP_FIRST_SEQ"] = i18n("flow_fields_description.rtp_first_seq"), ["RTP_FIRST_TS"] = i18n("flow_fields_description.rtp_first_ts"), ["RTP_LAST_SEQ"] = i18n("flow_fields_description.rtp_last_seq"), ["RTP_LAST_TS"] = i18n("flow_fields_description.rtp_last_ts"), ["RTP_IN_JITTER"] = i18n("flow_fields_description.rtp_in_jitter"), ["RTP_OUT_JITTER"] = i18n("flow_fields_description.rtp_out_jitter"), ["RTP_IN_PKT_LOST"] = i18n("flow_fields_description.rtp_in_pkt_lost"), ["RTP_OUT_PKT_LOST"] = i18n("flow_fields_description.rtp_out_pkt_lost"), ["RTP_IN_PKT_DROP"] = i18n("flow_fields_description.rtp_in_pkt_drop"), ["RTP_OUT_PKT_DROP"] = i18n("flow_fields_description.rtp_out_pkt_drop"), ["RTP_IN_PAYLOAD_TYPE"] = i18n("flow_fields_description.rtp_in_payload_type"), ["RTP_OUT_PAYLOAD_TYPE"] = i18n("flow_fields_description.rtp_out_payload_type"), ["RTP_IN_MAX_DELTA"] = i18n("flow_fields_description.rtp_in_max_delta"), ["RTP_OUT_MAX_DELTA"] = i18n("flow_fields_description.rtp_out_max_delta"), ["RTP_SIP_CALL_ID"] = i18n("flow_fields_description.rtp_sip_call_id"), ["RTP_MOS"] = i18n("flow_fields_description.rtp_mos"), ["RTP_IN_MOS"] = i18n("flow_fields_description.rtp_in_mos"), ["RTP_OUT_MOS"] = i18n("flow_fields_description.rtp_out_mos"), ["RTP_R_FACTOR"] = i18n("flow_fields_description.rtp_r_factor"), ["RTP_IN_R_FACTOR"] = i18n("flow_fields_description.rtp_in_r_factor"), ["RTP_OUT_R_FACTOR"] = i18n("flow_fields_description.rtp_out_r_factor"), ["RTP_IN_TRANSIT"] = i18n("flow_fields_description.rtp_in_transit"), ["RTP_OUT_TRANSIT"] = i18n("flow_fields_description.rtp_out_transit"), ["RTP_RTT"] = i18n("flow_fields_description.rtp_rtt"), ["RTP_DTMF_TONES"] = i18n("flow_fields_description.rtp_dtmf_tones"), -- S1AP Protocol ["S1AP_ENB_UE_S1AP_ID"] = i18n("flow_fields_description.s1ap_enb_ue_s1ap_id"), ["S1AP_MME_UE_S1AP_ID"] = i18n("flow_fields_description.s1ap_mme_ue_s1ap_id"), ["S1AP_MSG_EMM_TYPE_MME_TO_ENB"] = i18n("flow_fields_description.s1ap_msg_emm_type_mme_to_enb"), ["S1AP_MSG_ESM_TYPE_MME_TO_ENB"] = i18n("flow_fields_description.s1ap_msg_esm_type_mme_to_enb"), ["S1AP_MSG_EMM_TYPE_ENB_TO_MME"] = i18n("flow_fields_description.s1ap_msg_emm_type_enb_to_mme"), ["S1AP_MSG_ESM_TYPE_ENB_TO_MME"] = i18n("flow_fields_description.s1ap_msg_esm_type_enb_to_mme"), ["S1AP_CAUSE_ENB_TO_MME"] = i18n("flow_fields_description.s1ap_cause_enb_to_mme"), ["S1AP_DETAILED_CAUSE_ENB_TO_MME"] = i18n("flow_fields_description.s1ap_detailed_cause_enb_to_mme"), -- SIP Plugin ["SIP_CALL_ID"] = i18n("flow_fields_description.sip_call_id"), ["SIP_CALLING_PARTY"] = i18n("flow_fields_description.sip_calling_party"), ["SIP_CALLED_PARTY"] = i18n("flow_fields_description.sip_called_party"), ["SIP_RTP_CODECS"] = i18n("flow_fields_description.sip_rtp_codecs"), ["SIP_INVITE_TIME"] = i18n("flow_fields_description.sip_invite_time"), ["SIP_TRYING_TIME"] = i18n("flow_fields_description.sip_trying_time"), ["SIP_RINGING_TIME"] = i18n("flow_fields_description.sip_ringing_time"), ["SIP_INVITE_OK_TIME"] = i18n("flow_fields_description.sip_invite_ok_time"), ["SIP_INVITE_FAILURE_TIME"] = i18n("flow_fields_description.sip_invite_failure_time"), ["SIP_BYE_TIME"] = i18n("flow_fields_description.sip_bye_time"), ["SIP_BYE_OK_TIME"] = i18n("flow_fields_description.sip_bye_ok_time"), ["SIP_CANCEL_TIME"] = i18n("flow_fields_description.sip_cancel_time"), ["SIP_CANCEL_OK_TIME"] = i18n("flow_fields_description.sip_cancel_ok_time"), ["SIP_RTP_IPV4_SRC_ADDR"] = i18n("flow_fields_description.sip_rtp_ipv4_src_addr"), ["SIP_RTP_L4_SRC_PORT"] = i18n("flow_fields_description.sip_rtp_l4_src_port"), ["SIP_RTP_IPV4_DST_ADDR"] = i18n("flow_fields_description.sip_rtp_ipv4_dst_addr"), ["SIP_RTP_L4_DST_PORT"] = i18n("flow_fields_description.sip_rtp_l4_dst_port"), ["SIP_RESPONSE_CODE"] = i18n("flow_fields_description.sip_response_code"), ["SIP_REASON_CAUSE"] = i18n("flow_fields_description.sip_reason_cause"), ["SIP_C_IP"] = i18n("flow_fields_description.sip_c_ip"), ["SIP_CALL_STATE"] = i18n("flow_fields_description.sip_call_state"), -- SMTP Protocol ["SMTP_MAIL_FROM"] = i18n("flow_fields_description.smtp_mail_from"), ["SMTP_RCPT_TO"] = i18n("flow_fields_description.smtp_rcpt_to"), -- SSDP Protocol ["SSDP_HOST"] = i18n("flow_fields_description.ssdp_host"), ["SSDP_USN"] = i18n("flow_fields_description.ssdp_usn"), ["SSDP_SERVER"] = i18n("flow_fields_description.ssdp_server"), ["SSDP_TYPE"] = i18n("flow_fields_description.ssdp_type"), ["SSDP_METHOD"] = i18n("flow_fields_description.ssdp_method"), } -- ####################### -- See Utils::l4proto2name() l4_protocols = { ['IP'] = 0, ['ICMP'] = 1, ['IGMP'] = 2, ['TCP'] = 6, ['UDP'] = 17, ['IPv6'] = 41, ['RSVP'] = 46, ['GRE'] = 47, ['ESP'] = 50, ['IPv6-ICMP'] = 58, ['OSPF'] = 89, ['PIM'] = 103, ['VRRP'] = 112, ['HIP'] = 139, } function getL4ProtoName(proto_id) local proto_id = tonumber(proto_id) for k,v in pairs(l4_protocols) do if v == proto_id then return k end end return nil end -- ####################### function extractSIPCaller(caller) local i local j -- find string between \" and \" i = string.find(caller, "\\\"") if(i ~= nil) then j = string.find(caller, "\\\"",i+2) if(j ~= nil) then return string.sub(caller, i+2, j-1) end end -- find string between " and " i = string.find(caller, "\"") if(i ~= nil) then j = string.find(caller, "\"",i+1) if(j ~= nil) then return string.sub(caller, i+1, j-1) end end -- find string between : and @ i = string.find(caller, ":") if(i ~= nil) then j = string.find(caller, "@",i+1) if(j ~= nil) then return string.sub(caller, i+1, j-1) end end return caller end -- ####################### function map_failure_resp_code(fail_resp_code_string) if (fail_resp_code_string ~= nil) then if(fail_resp_code_string == "200") then return "OK" end if(fail_resp_code_string == "100") then return "TRYING" end if(fail_resp_code_string == "180") then return "RINGING" end if(tonumber(fail_resp_code_string) > 399) then return "FAILURE" end end return fail_resp_code_string end -- ####################### function getAlertTimeBounds(alert) local epoch_begin local epoch_end local half_interval = 1800 local alert_tstamp = alert.alert_tstamp if alert.first_switched and alert.last_switched then epoch_begin = alert.first_switched - half_interval epoch_end = alert.last_switched + half_interval else epoch_begin = alert_tstamp - half_interval epoch_end = alert_tstamp + half_interval end return math.floor(epoch_begin), math.floor(epoch_end) end -- ####################### local function formatFlowHost(flow, cli_or_srv, historical_bounds) local host_name = ""..shortenString(flowinfo2hostname(flow,cli_or_srv)) if(flow[cli_or_srv .. ".systemhost"] == true) then host_name = host_name.." " end if(flow[cli_or_srv .. ".blacklisted"] == true) then host_name = host_name.." " end host_name = host_name.."" return host_name end local function formatFlowPort(flow, cli_or_srv, port, historical_bounds) if not historical_bounds then return ""..port.."" end -- TODO port filter local port_url = "" .. port .. "" return port_url end function getFlowLabel(flow, show_macs, add_hyperlinks, historical_bounds) if flow == nil then return "" end local cli_name = flowinfo2hostname(flow, "cli", true) local srv_name = flowinfo2hostname(flow, "srv", true) if((not isIPv4(cli_name)) and (not isIPv6(cli_name))) then cli_name = shortenString(cli_name) end if((not isIPv4(srv_name)) and (not isIPv6(srv_name))) then srv_name = shortenString(srv_name) end local cli_port local srv_port if flow["cli.port"] > 0 then cli_port = flow["cli.port"] end if flow["srv.port"] > 0 then srv_port = flow["srv.port"] end local srv_mac if(not isEmptyString(flow["srv.mac"]) and flow["srv.mac"] ~= "00:00:00:00:00:00") then srv_mac = flow["srv.mac"] end local cli_mac if(flow["cli.mac"] ~= nil and flow["cli.mac"]~= "" and flow["cli.mac"] ~= "00:00:00:00:00:00") then cli_mac = flow["cli.mac"] end if add_hyperlinks then cli_name = formatFlowHost(flow, "cli", historical_bounds) srv_name = formatFlowHost(flow, "srv", historical_bounds) if cli_port then cli_port = formatFlowPort(flow, "cli", cli_port, historical_bounds) end if srv_port then srv_port = formatFlowPort(flow, "srv", srv_port, historical_bounds) end if cli_mac then cli_mac = "" ..cli_mac.."" end if srv_mac then srv_mac = "" ..srv_mac.."" end end local label = "" if not isEmptyString(cli_name) then label = label..cli_name end if cli_port then label = label..":"..cli_port end if show_macs and cli_mac then label = label.." [ "..cli_mac.." ]" end label = label.." " if not isEmptyString(srv_name) then label = label..srv_name end if srv_port then label = label..":"..srv_port end if show_macs and srv_mac then label = label.." [ "..srv_mac.." ]" end return label end -- ####################### function getFlowKey(name) local s = flow_fields_description[name] if(s == nil) then -- Try to decode the name as . -- then try to look up the name or directly the field -- in the rtemplate (pen is ignored). -- TODO: currently rtemplate is flat and PENs are ignored, we should add PEN there local pen, field = name:match("^(%d+)%.(%d+)$") local v = (rtemplate[tonumber(name)] or rtemplate[tonumber(field)]) if(v == nil) then return(name) end s = flow_fields_description[v] end if(s ~= nil) then s = string.gsub(s, "<", "<") s = string.gsub(s, ">", ">") return(s) else return(name) end end -- ####################### function isFieldProtocol(protocol, field) if((field ~= nil) and (protocol ~= nil)) then if(starts(field, protocol)) then return true end end return false 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 = "0" local value_original = "0" if(info[field] ~= nil) then return_value = info[field] value_original = info[field] else for key,value in pairs(info) do if(rtemplate[tonumber(key)] == field) then return_value = handleCustomFlowField(key, value) value_original = value end end end return_value = string.gsub(return_value, "<", "<") return_value = string.gsub(return_value, ">", ">") return_value = string.gsub(return_value, "\"", "\\\"") -- io.write(field.." = ["..return_value..","..value_original.."]\n") return return_value , value_original end -- ####################### function mapCallState(call_state) -- return call_state if(call_state == "CALL_STARTED") then return(i18n("flow_details.call_started")) elseif(call_state == "CALL_IN_PROGRESS") then return(i18n("flow_details.ongoing_call")) elseif(call_state == "CALL_COMPLETED") then return(""..i18n("flow_details.call_completed").."") elseif(call_state == "CALL_ERROR") then return(""..i18n("flow_details.call_error").."") elseif(call_state == "CALL_CANCELED") then return(""..i18n("flow_details.call_canceled").."") else return(call_state) end end -- ####################### function isThereProtocol(protocol, info) local found = 0 for key,value in pairs(info) do if(isFieldProtocol(protocol, key)) then found = 1 break end end return found end -- ####################### function isThereSIPCall(info) local retVal = 0 local call_state = getFlowValue(info, "SIP_CALL_STATE") if((call_state ~= nil) and (call_state ~= "")) then retVal = 1 end return retVal end -- ####################### function getSIPInfo(infoPar) local called_party = "" local calling_party = "" local sip_found_flow local returnString = "" local infoFlow, posFlow, errFlow = json.decode(infoPar["moreinfo.json"], 1, nil) if (infoFlow ~= nil) then sip_found_flow = isThereSIPCall(infoFlow) if(sip_found_flow == 1) then called_party = getFlowValue(infoFlow, "SIP_CALLED_PARTY") calling_party = getFlowValue(infoFlow, "SIP_CALLING_PARTY") called_party = string.gsub(called_party, "\\\"","\"") calling_party = string.gsub(calling_party, "\\\"","\"") called_party = extractSIPCaller(called_party) calling_party = extractSIPCaller(calling_party) if(((called_party == nil) or (called_party == "")) and ((calling_party == nil) or (calling_party == ""))) then returnString = "" else returnString = calling_party .. " " .. called_party end end end return returnString end -- ####################### function getRTPInfo(infoPar) local call_id local returnString = "" local infoFlow, posFlow, errFlow = json.decode(infoPar["moreinfo.json"], 1, nil) if infoFlow ~= nil then call_id = getFlowValue(infoFlow, "RTP_SIP_CALL_ID") if tostring(call_id) ~= "" then call_id = " "..call_id else call_id = "" end returnString = call_id end return returnString end -- ####################### function getSIPTableRows(info) local string_table = "" local call_id = "" local call_id_ico = " " local called_party = "" local calling_party = "" local rtp_codecs = "" local sip_rtp_src_addr = 0 local sip_rtp_dst_addr = 0 local print_second = 0 local print_second_2 = 0 -- check if there is a SIP field sip_found = isThereProtocol("SIP", info) if(sip_found == 1) then sip_found = isThereSIPCall(info) end if(sip_found == 1) then string_table = string_table..""..i18n("flow_details.sip_protocol_information").."\n" call_id = getFlowValue(info, "SIP_CALL_ID") if((call_id == nil) or (call_id == "")) then string_table = string_table.." "..i18n("flow_details.call_id").." "..call_id_ico.."
\n" else string_table = string_table.." "..i18n("flow_details.call_id").." "..call_id_ico.."
" .. call_id .. "
\n" end called_party = getFlowValue(info, "SIP_CALLED_PARTY") calling_party = getFlowValue(info, "SIP_CALLING_PARTY") called_party = string.gsub(called_party, "\\\"","\"") calling_party = string.gsub(calling_party, "\\\"","\"") called_party = extractSIPCaller(called_party) calling_party = extractSIPCaller(calling_party) if(((called_party == nil) or (called_party == "")) and ((calling_party == nil) or (calling_party == ""))) then string_table = string_table..""..i18n("flow_details.call_initiator").." "..i18n("flow_details.called_party").."
\n" else string_table = string_table..""..i18n("flow_details.call_initiator").." "..i18n("flow_details.called_party").."
" .. calling_party .. " " .. called_party .. "
\n" end rtp_codecs = getFlowValue(info, "SIP_RTP_CODECS") if((rtp_codecs == nil) or (rtp_codecs == "")) then string_table = string_table..""..i18n("flow_details.rtp_codecs").."
\n" else string_table = string_table..""..i18n("flow_details.rtp_codecs").."
" .. rtp_codecs .. "\n" end local string_table_1 = "" local string_table_2 = "" local string_table_3 = "" local string_table_4 = "" local string_table_5 = "" local show_rtp_stream = 0 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_1 = getFlowValue(info, "SIP_RTP_IPV4_SRC_ADDR") if (string_table_1 ~= "0.0.0.0") then sip_rtp_src_address_ip = string_table_1 interface.select(ifname) rtp_host = interface.getHostInfo(string_table_1) if(rtp_host ~= nil) then string_table_1 = "" string_table_1 = string_table_1..sip_rtp_src_address_ip string_table_1 = string_table_1.."" end end show_rtp_stream = 1 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_L4_SRC_PORT") --string_table_2 = ":"..getFlowValue(info, "SIP_RTP_L4_SRC_PORT") sip_rtp_src_port = getFlowValue(info, "SIP_RTP_L4_SRC_PORT") string_table_2 = ":" string_table_2 = string_table_2..sip_rtp_src_port string_table_2 = string_table_2.."" show_rtp_stream = 1 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.." " string_table_3 = " " show_rtp_stream = 1 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_4 = getFlowValue(info, "SIP_RTP_IPV4_DST_ADDR") if (string_table_4 ~= "0.0.0.0") then sip_rtp_dst_address_ip = string_table_4 interface.select(ifname) rtp_host = interface.getHostInfo(string_table_4) if(rtp_host ~= nil) then string_table_4 = "" string_table_4 = string_table_4..sip_rtp_dst_address_ip string_table_4 = string_table_4.."" end end show_rtp_stream = 1 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_L4_DST_PORT") --string_table_5 = ":"..getFlowValue(info, "SIP_RTP_L4_DST_PORT") sip_rtp_dst_port = getFlowValue(info, "SIP_RTP_L4_DST_PORT") string_table_5 = ":" string_table_5 = string_table_5..sip_rtp_dst_port string_table_5 = string_table_5.."" show_rtp_stream = 1 end if (show_rtp_stream == 1) then string_table = string_table..""..i18n("flow_details.rtp_stream_peers").." (src dst)
" else string_table = string_table..""..i18n("flow_details.rtp_stream_peers").." (src dst)
" end string_table = string_table..string_table_1..string_table_2..string_table_3..string_table_4..string_table_5 local rtp_flow_key = interface.getFlowKey(sip_rtp_src_address_ip or "", tonumber(sip_rtp_src_port) or 0, sip_rtp_dst_address_ip or "", tonumber(sip_rtp_dst_port) or 0, 17 --[[ UDP --]]) if tonumber(rtp_flow_key) ~= nil and interface.findFlowByKey(tonumber(rtp_flow_key)) ~= nil then string_table = string_table..' ' string_table = string_table.." " string_table = string_table..sip_rtp_dst_address_ip..":"..sip_rtp_dst_port.."\">" string_table = string_table..''..i18n("flow_details.rtp_flow")..'' end string_table = string_table.."
\n" val, val_original = getFlowValue(info, "SIP_REASON_CAUSE") if(val_original ~= "0") then string_table = string_table.." "..i18n("flow_details.cancel_bye_failure_reason_cause").."
" string_table = string_table..val else string_table = string_table.." "..i18n("flow_details.cancel_bye_failure_reason_cause").."
" end string_table = string_table.."
\n" if(info["SIP_C_IP"] ~= nil) then string_table = string_table.." "..i18n("flow_details.c_ip_addresses").."
" .. getFlowValue(info, "SIP_C_IP") .. "
\n" end if((getFlowValue(info, "SIP_CALL_STATE") == nil) or (getFlowValue(info, "SIP_CALL_STATE") == "")) then string_table = string_table.." "..i18n("flow_details.call_state").."
\n" else string_table = string_table.." "..i18n("flow_details.call_state").."
" .. mapCallState(getFlowValue(info, "SIP_CALL_STATE")) .. "
\n" end end return string_table end -- ####################### function getRTPTableRows(info) local string_table = "" -- check if there is a RTP field local rtp_found = isThereProtocol("RTP_IN_MAX_DELTA", info) if(rtp_found == 1) then -- SSRC string_table = string_table..""..i18n("flow_details.rtp_protocol_information").."\n" if(info["RTP_SSRC"] ~= nil) then sync_source_var = getFlowValue(info, "RTP_SSRC") if((sync_source_var == nil) or (sync_source_var == "")) then sync_source_hide = "style=\"display: none;\"" else sync_source_hide = "style=\"display: table-row;\"" end string_table = string_table.." "..i18n("flow_details.sync_source_id").."
" .. sync_source_var .. "\n" end -- ROUND-TRIP-TIME if(info["RTP_RTT"] ~= nil) then rtp_rtt_var = getFlowValue(info, "RTP_RTT") if((rtp_rtt_var == nil) or (rtp_rtt_var == "")) then rtp_rtt_hide = "style=\"display: none;\"" else rtp_rtt_hide = "style=\"display: table-row;\"" end string_table = string_table .. ""..i18n("flow_details.round_trip_time").."" if((rtp_rtt_var ~= nil) and (rtp_rtt_var ~= "")) then string_table = string_table .. rtp_rtt_var .. " ms " end string_table = string_table .. " \n" end -- RTP-IN-TRASIT if(info["RTP_IN_TRANSIT"] ~= nil) then rtp_in_transit = getFlowValue(info, "RTP_IN_TRANSIT")/100 rtp_out_transit = getFlowValue(info, "RTP_OUT_TRANSIT")/100 if(((rtp_in_transit == nil) or (rtp_in_transit == "")) and ((rtp_out_transit == nil) or (rtp_out_transit == ""))) then rtp_transit_hide = "style=\"display: none;\"" else rtp_transit_hide = "style=\"display: table-row;\"" end string_table = string_table .. ""..i18n("flow_details.rtp_transit_in_out").."
"..getFlowValue(info, "RTP_IN_TRANSIT").."
"..getFlowValue(info, "RTP_OUT_TRANSIT").."
\n" end -- TONES if(info["RTP_DTMF_TONES"] ~= nil) then rtp_dtmf_var = getFlowValue(info, "RTP_DTMF_TONES") if((rtp_dtmf_var == nil) or (rtp_dtmf_var == "")) then rtp_dtmf_hide = "style=\"display: none;\"" else rtp_dtmf_hide = "style=\"display: table-row;\"" end string_table = string_table .. ""..i18n("flow_details.dtmf_tones_sent")..""..rtp_dtmf_var.."\n" end -- FIRST REQUEST if(info["RTP_FIRST_SEQ"] ~= nil) then first_flow_sequence_var = getFlowValue(info, "RTP_FIRST_SEQ") last_flow_sequence_var = getFlowValue(info, "RTP_FIRST_SEQ") if(((first_flow_sequence_var == nil) or (first_flow_sequence_var == "")) and ((last_flow_sequence_var == nil) or (last_flow_sequence_var == ""))) then first_last_flow_sequence_hide = "style=\"display: none;\"" else first_last_flow_sequence_hide = "style=\"display: table-row;\"" end string_table = string_table .. ""..i18n("flow_details.first_last_flow_sequence").."
"..first_flow_sequence_var.."
"..last_flow_sequence_var.."
\n" end -- CALL-ID if(info["RTP_SIP_CALL_ID"] ~= nil) then sip_call_id_var = getFlowValue(info, "RTP_SIP_CALL_ID") if((sip_call_id_var == nil) or (sip_call_id_var == "")) then sip_call_id_hide = "style=\"display: none;\"" else sip_call_id_hide = "style=\"display: table-row;\"" end string_table = string_table .. " "..i18n("flow_details.sip_call_id").."  
" .. sip_call_id_var .. "
\n" end -- TWO-WAY CALL-QUALITY INDICATORS string_table = string_table..""..i18n("flow_details.call_quality_indicators")..""..i18n("flow_details.forward")..""..i18n("flow_details.reverse").."" -- JITTER if(info["RTP_IN_JITTER"] ~= nil) then rtp_in_jitter = getFlowValue(info, "RTP_IN_JITTER")/100 rtp_out_jitter = getFlowValue(info, "RTP_OUT_JITTER")/100 if(((rtp_in_jitter == nil) or (rtp_in_jitter == "")) and ((rtp_out_jitter == nil) or (rtp_out_jitter == ""))) then rtp_out_jitter_hide = "style=\"display: none;\"" else rtp_out_jitter_hide = "style=\"display: table-row;\"" end string_table = string_table .. ""..i18n("flow_details.jitter").."" if((rtp_in_jitter ~= nil) and (rtp_in_jitter ~= "")) then string_table = string_table .. rtp_in_jitter.." ms " end string_table = string_table .. " " if((rtp_out_jitter ~= nil) and (rtp_out_jitter ~= "")) then string_table = string_table .. rtp_out_jitter.." ms " end string_table = string_table .. " \n" end -- PACKET LOSS if(info["RTP_IN_PKT_LOST"] ~= nil) then rtp_in_pkt_lost = getFlowValue(info, "RTP_IN_PKT_LOST") rtp_out_pkt_lost = getFlowValue(info, "RTP_OUT_PKT_LOST") if(((rtp_in_pkt_lost == nil) or (rtp_in_pkt_lost == "")) and ((rtp_out_pkt_lost == nil) or (rtp_out_pkt_lost == ""))) then rtp_packet_loss_hide = "style=\"display: none;\"" else rtp_packet_loss_hide = "style=\"display: table-row;\"" end string_table = string_table .. ""..i18n("flow_details.lost_packets").."" if((rtp_in_pkt_lost ~= nil) and (rtp_in_pkt_lost ~= "")) then string_table = string_table .. formatPackets(rtp_in_pkt_lost) end string_table = string_table .. " " if((rtp_out_pkt_lost ~= nil) and (rtp_out_pkt_lost ~= "")) then string_table = string_table .. formatPackets(rtp_out_pkt_lost) end string_table = string_table .. " \n" end -- PACKET DROPS if(info["RTP_IN_PKT_DROP"] ~= nil) then rtp_in_pkt_drop = getFlowValue(info, "RTP_IN_PKT_DROP") rtp_out_pkt_drop = getFlowValue(info, "RTP_OUT_PKT_DROP") if(((rtp_in_pkt_drop == nil) or (rtp_in_pkt_drop == "")) and ((rtp_out_pkt_drop == nil) or (rtp_out_pkt_drop == ""))) then rtp_pkt_drop_hide = "style=\"display: none;\"" else rtp_pkt_drop_hide = "style=\"display: table-row;\"" end string_table = string_table .. ""..i18n("flow_details.dropped_packets").."" if((rtp_in_pkt_drop ~= nil) and (rtp_in_pkt_drop ~= "")) then string_table = string_table .. formatPackets(rtp_in_pkt_drop) end string_table = string_table .. " " if((rtp_out_pkt_drop ~= nil) and (rtp_out_pkt_drop ~= "")) then string_table = string_table .. formatPackets(rtp_out_pkt_drop) end string_table = string_table .. " \n" end -- MAXIMUM DELTA BETWEEN CONSECUTIVE PACKETS if(info["RTP_IN_MAX_DELTA"] ~= nil) then rtp_in_max_delta = getFlowValue(info, "RTP_IN_MAX_DELTA") rtp_out_max_delta = getFlowValue(info, "RTP_OUT_MAX_DELTA") if(((rtp_in_max_delta == nil) or (rtp_in_max_delta == "")) and ((rtp_out_max_delta == nil) or (rtp_out_max_delta == ""))) then rtp_max_delta_hide = "style=\"display: none;\"" else rtp_max_delta_hide = "style=\"display: table-row;\"" end string_table = string_table .. ""..i18n("flow_details.max_packet_interarrival_time").."" if((rtp_in_max_delta ~= nil) and (rtp_in_max_delta ~= "")) then string_table = string_table .. rtp_in_max_delta .. " ms " end string_table = string_table .. " " if((rtp_out_max_delta ~= nil) and (rtp_out_max_delta ~= "")) then string_table = string_table .. rtp_out_max_delta .. " ms " end string_table = string_table .. " \n" end -- PAYLOAD TYPE if(info["RTP_IN_PAYLOAD_TYPE"] ~= nil) then rtp_payload_in_var = formatRtpPayloadType(getFlowValue(info, "RTP_IN_PAYLOAD_TYPE")) rtp_payload_out_var = formatRtpPayloadType(getFlowValue(info, "RTP_OUT_PAYLOAD_TYPE")) if(((rtp_payload_in_var == nil) or (rtp_payload_in_var == "")) and ((rtp_payload_out_var == nil) or (rtp_payload_out_var == ""))) then rtp_payload_hide = "style=\"display: none;\"" else rtp_payload_hide = "style=\"display: table-row;\"" end string_table = string_table .. ""..i18n("flow_details.payload_type").."
"..rtp_payload_in_var.."
"..rtp_payload_out_var.."
\n" end -- MOS if(info["RTP_IN_MOS"] ~= nil) then rtp_in_mos = getFlowValue(info, "RTP_IN_MOS")/100 rtp_out_mos = getFlowValue(info, "RTP_OUT_MOS")/100 if(rtp_in_mos == nil or rtp_in_mos == "") and (rtp_out_mos == nil or rtp_out_mos == "") then quality_mos_hide = "style=\"display: none;\"" else quality_mos_hide = "style=\"display: table-row;\"" end string_table = string_table .. ""..i18n("flow_details.pseudo_mos").."" if((rtp_in_mos ~= nil) and (rtp_in_mos ~= "")) then string_table = string_table .. MosPercentageBar(rtp_in_mos) end string_table = string_table .. " " string_table = string_table .. "" if((rtp_out_mos ~= nil) and (rtp_out_mos ~= "")) then string_table = string_table .. MosPercentageBar(rtp_out_mos) end string_table = string_table .. " " end -- R_FACTOR if(info["RTP_IN_R_FACTOR"] ~= nil) then rtp_in_r_factor = getFlowValue(info, "RTP_IN_R_FACTOR")/100 rtp_out_r_factor = getFlowValue(info, "RTP_OUT_R_FACTOR")/100 if(rtp_in_r_factor == nil or rtp_in_r_factor == "" or rtp_in_r_factor == "0") and (rtp_out_r_factor == nil or rtp_out_r_factor == "" or rtp_out_r_factor == "0") then quality_r_factor_hide = "style=\"display: none;\"" else quality_r_factor_hide = "style=\"display: table-row;\"" end string_table = string_table .. ""..i18n("flow_details.r_factor").."" if((rtp_in_r_factor ~= nil) and (rtp_in_r_factor ~= "")) then string_table = string_table .. RFactorPercentageBar(rtp_in_r_factor) end string_table = string_table .. " " string_table = string_table .. "" if((rtp_out_r_factor ~= nil) and (rtp_out_r_factor ~= "")) then string_table = string_table .. RFactorPercentageBar(rtp_out_r_factor) end string_table = string_table .. " " end end return string_table end -- ####################### function getFlowQuota(ifid, info, as_client) local pool_id, quota_source if as_client then pool_id = info["cli.pool_id"] quota_source = info["cli.quota_source"] else pool_id = info["srv.pool_id"] quota_source = info["srv.quota_source"] end local master_proto, app_proto = splitProtocol(info["proto.ndpi"]) app_proto = app_proto or master_proto local pools_stats = interface.getHostPoolsStats() local pool_stats = pools_stats and pools_stats[tonumber(pool_id)] local quota_and_protos = shaper_utils.getPoolProtoShapers(ifid, pool_id) if pool_stats ~= nil then local key = nil if quota_source == "policy_source_protocol" then proto_stats = pool_stats.ndpi -- determine if the quota is on the app or master proto if(quota_and_protos[master_proto] ~= nil) then key = master_proto else key = app_proto end elseif quota_source == "policy_source_category" then key = flow["proto.ndpi_cat"] proto_stats = nil category_stats = pool_stats.ndpi_categories elseif quota_source == "policy_source_pool" then key = "Default" proto_stats = nil category_stats = {default = pool_stats.cross_application} end if key ~= nil then local proto_info = nil if key ~= "Default" then proto_info = quota_and_protos[key] else proto_info = shaper_utils.getCrossApplicationShaper(ifid, pool_id) end if proto_info ~= nil then return proto_info, proto_stats, category_stats end end end return nil end -- ####################### function printFlowQuota(ifid, info, as_client) local flow_quota, proto_stats, category_stats = getFlowQuota(ifid, info, as_client) if flow_quota ~= nil then print("") print(string.gsub(printProtocolQuota(flow_quota, proto_stats, category_stats, {traffic=true, time=true}, true), "\n", "")) print("
") else print(i18n("shaping.no_quota_applied")) end end -- ####################### function printFlowSNMPInfo(snmpdevice, input_idx, output_idx) local available_devices = get_snmp_devices() if available_devices == nil then available_devices = {} end for dev, _ in pairs(available_devices) do local snmp_device = require "snmp_device" snmp_device.init(dev) if dev == snmpdevice then local community = get_snmp_community(dev) local port_indexes = get_snmp_device_port_indexes(dev, community) if port_indexes == nil then port_indexes = {} end local snmpurl = ""..dev.."" local snmp_interfaces = snmp_device.get_device()["interfaces"] local inputurl, outputurl local function prepare_interface_url(idx, port) local ifurl if port then local label = port["index"] if port["name"] and port["name"] ~= "" then label = shortenString(port["name"]) end ifurl = ""..label.."" else ifurl = idx end return ifurl end local inputurl = prepare_interface_url(input_idx, snmp_interfaces[input_idx]) local outputurl = prepare_interface_url(output_idx, snmp_interfaces[output_idx]) print(""..i18n("details.flow_snmp_localization")..""..i18n("snmp.snmp_device")..""..i18n("details.input_device_port").." / "..i18n("details.output_device_port").."") print(""..snmpurl..""..inputurl.." / "..outputurl.."") break end end end -- ####################### function printBlockFlowJs() print[[ var block_flow_csrf = "]] print(ntop.getRandomCSRFValue()) print[["; function block_flow(flow_key) { var url = "]] print(ntop.getHttpPrefix()) print[[/lua/pro/nedge/block_flow.lua"; $.ajax({ type: 'GET', url: url, cache: false, data: { csrf: block_flow_csrf, flow_key: flow_key }, success: function(content) { var data = jQuery.parseJSON(content); block_flow_csrf = data.csrf; if (data.status == "BLOCKED") { $('#'+flow_key+'_info').find('.block-badge') .removeClass('label-default') .addClass('label-danger') .attr('title', ']] print(i18n("flow_details.flow_traffic_is_dropped")) print[['); $('#'+flow_key+'_application, #'+flow_key+'_l4, #'+flow_key+'_client, #'+flow_key+'_server') .css("text-decoration", "line-through"); } }, error: function(content) { console.log("error"); } }); } ]] end -- ####################### local function printDropdownEntries(entries, base_url, param_arr, param_filter, curr_filter) for _, htype in ipairs(entries) do param_arr[param_filter] = htype[1] print[[]] print(htype[2]) print[[]] end end local function getParamFilter(page_params, param_name) if page_params[param_name] then return '' end return '' end function printActiveFlowsDropdown(base_url, page_params, ifstats, ndpistats) -- Local / Remote hosts selector local flowhosts_type_params = table.clone(page_params) flowhosts_type_params["flowhosts_type"] = nil print[['\
\ \ \
\ ']] -- Status selector local flow_status_params = table.clone(page_params) flow_status_params["flow_status"] = nil print[[, '\
\ \ \
\ ']] if interface.isPacketInterface() then -- TCP flow state filter local tcp_state_params = table.clone(page_params) tcp_state_params["tcp_flow_state"] = nil print[[, '\
\ \ \
\ ']] end -- Unidirectional flows selector local traffic_type_params = table.clone(page_params) traffic_type_params["traffic_type"] = nil print[[, '\
\ \ \
\ ']] if not page_params.category then -- L7 Application print(', \'
'") end if not page_params.application then -- L7 Application Category print(', \'
'") end -- Ip version selector local ipversion_params = table.clone(page_params) ipversion_params["version"] = nil print[[, '
]] printIpVersionDropdown(base_url, ipversion_params) print [[
']] -- VLAN selector local vlan_params = table.clone(page_params) if ifstats.vlan then print[[, '
]] printVLANFilterDropdown(base_url, vlan_params) print[[
']] end if ntop.isPro() and interface.isPacketInterface() == false then printFlowDevicesFilterDropdown(base_url, vlan_params) end end -- ####################### function getFlowsTableTitle() local filter_msg = (_GET["application"] or _GET["category"] or _GET["vhost"] or firstToUpper(_GET["flow_status"] or "")) local active_msg if not interface.isPacketInterface() then active_msg = i18n("flows_page.recently_active_flows", {filter=filter_msg}) elseif interface.isPcapDumpInterface() then active_msg = i18n("flows_page.flows", {filter=filter_msg}) else active_msg = i18n("flows_page.active_flows", {filter=filter_msg}) end if(_GET["network_name"] ~= nil) then active_msg = active_msg .. i18n("network", {network=_GET["network_name"]}) end if(_GET["inIfIdx"] ~= nil) then active_msg = active_msg .. " ["..i18n("flows_page.inIfIdx").." ".._GET["inIfIdx"].."]" end if(_GET["outIfIdx"] ~= nil) then active_msg = active_msg .. " ["..i18n("flows_page.outIfIdx").." ".._GET["outIfIdx"].."]" end if(_GET["deviceIP"] ~= nil) then active_msg = active_msg .. " ["..i18n("flows_page.device_ip").." ".._GET["deviceIP"].."]" end if(_GET["tcp_flow_state"] ~= nil) then active_msg = active_msg .. " ["..tcp_flow_state_utils.state2i18n(_GET["tcp_flow_state"]).."]" end return active_msg end -- #######################