Skip to content

Commit fb74718

Browse files
show protocol in tooltips
1 parent 373cbbd commit fb74718

2 files changed

Lines changed: 87 additions & 2 deletions

File tree

ip_arc_diagram.js

Lines changed: 46 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2078,12 +2078,57 @@ function formatTimestamp(timestamp) {
20782078
}
20792079

20802080
function createTooltipHTML(data) {
2081+
// Helper to decode protocol numbers to names; falls back to TCP for legacy datasets.
2082+
const PROTOCOL_MAP = {
2083+
1: 'ICMP',
2084+
2: 'IGMP',
2085+
6: 'TCP',
2086+
17: 'UDP',
2087+
41: 'IPv6',
2088+
47: 'GRE',
2089+
50: 'ESP',
2090+
51: 'AH',
2091+
58: 'ICMPv6',
2092+
89: 'OSPF',
2093+
132: 'SCTP'
2094+
};
2095+
function normalizeProtocolValue(raw) {
2096+
if (raw === undefined || raw === null || raw === '') return 'TCP';
2097+
if (Array.isArray(raw)) raw = raw[0];
2098+
// If already a recognizable string, return upper-cased canonical form
2099+
if (typeof raw === 'string') {
2100+
const upper = raw.trim().toUpperCase();
2101+
// If it's a numeric string try decoding
2102+
if (/^\d+$/.test(upper)) {
2103+
const num = parseInt(upper, 10);
2104+
return PROTOCOL_MAP[num] ? `${PROTOCOL_MAP[num]} (${num})` : `Unknown (${num})`;
2105+
}
2106+
// Already a protocol token
2107+
return upper || 'TCP';
2108+
}
2109+
if (typeof raw === 'number') {
2110+
return PROTOCOL_MAP[raw] ? `${PROTOCOL_MAP[raw]} (${raw})` : `Unknown (${raw})`;
2111+
}
2112+
return 'TCP';
2113+
}
2114+
function extractProtocol(p) {
2115+
if (!p) return 'TCP';
2116+
const raw = p.protocol ?? p.ip_proto ?? p.ipProtocol ?? p.proto ?? p.ipProtocolNumber;
2117+
return normalizeProtocolValue(raw);
2118+
}
20812119
if (data.binned && data.count > 1) {
20822120
// Binned data tooltip
20832121
const { utcTime, timestampSec } = formatTimestamp(data.timestamp);
20842122
let tooltipContent = `<b>${data.flagType} (Binned)</b><br>`;
20852123
tooltipContent += `Count: ${data.count} packets<br>`;
20862124
tooltipContent += `From: ${data.src_ip}<br>To: ${data.dst_ip}<br>`;
2125+
// Aggregate protocols in the bin (in case of mixed, though unlikely)
2126+
if (data.originalPackets && data.originalPackets.length) {
2127+
const protocols = Array.from(new Set(data.originalPackets.map(extractProtocol)));
2128+
tooltipContent += `Protocol: ${protocols.join(', ')}<br>`;
2129+
} else {
2130+
tooltipContent += `Protocol: ${extractProtocol(data)}<br>`;
2131+
}
20872132
tooltipContent += `Time Bin: ${utcTime}<br>`;
20882133
tooltipContent += `Total Bytes: ${formatBytes(data.totalBytes)}`;
20892134

@@ -2100,7 +2145,7 @@ function createTooltipHTML(data) {
21002145
// Single packet tooltip
21012146
const packet = data.originalPackets ? data.originalPackets[0] : data;
21022147
const { utcTime, timestampSec } = formatTimestamp(packet.timestamp);
2103-
let tooltipContent = `<b>${classifyFlags(packet.flags)}</b><br>From: ${packet.src_ip}<br>To: ${packet.dst_ip}<br>Time: ${utcTime}`;
2148+
let tooltipContent = `<b>${classifyFlags(packet.flags)}</b><br>From: ${packet.src_ip}<br>To: ${packet.dst_ip}<br>Protocol: ${extractProtocol(packet)}<br>Time: ${utcTime}`;
21042149

21052150
// Add sequence and acknowledgment numbers if available
21062151
if (packet.seq_num !== undefined && packet.seq_num !== null) {

ip_bar_diagram.js

Lines changed: 41 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2315,12 +2315,52 @@ function formatTimestamp(timestamp) {
23152315
}
23162316

23172317
function createTooltipHTML(data) {
2318+
const PROTOCOL_MAP = {
2319+
1: 'ICMP',
2320+
2: 'IGMP',
2321+
6: 'TCP',
2322+
17: 'UDP',
2323+
41: 'IPv6',
2324+
47: 'GRE',
2325+
50: 'ESP',
2326+
51: 'AH',
2327+
58: 'ICMPv6',
2328+
89: 'OSPF',
2329+
132: 'SCTP'
2330+
};
2331+
function normalizeProtocolValue(raw) {
2332+
if (raw === undefined || raw === null || raw === '') return 'TCP';
2333+
if (Array.isArray(raw)) raw = raw[0];
2334+
if (typeof raw === 'string') {
2335+
const upper = raw.trim().toUpperCase();
2336+
if (/^\d+$/.test(upper)) {
2337+
const num = parseInt(upper, 10);
2338+
return PROTOCOL_MAP[num] ? `${PROTOCOL_MAP[num]} (${num})` : `Unknown (${num})`;
2339+
}
2340+
return upper || 'TCP';
2341+
}
2342+
if (typeof raw === 'number') {
2343+
return PROTOCOL_MAP[raw] ? `${PROTOCOL_MAP[raw]} (${raw})` : `Unknown (${raw})`;
2344+
}
2345+
return 'TCP';
2346+
}
2347+
function extractProtocol(p) {
2348+
if (!p) return 'TCP';
2349+
const raw = p.protocol ?? p.ip_proto ?? p.ipProtocol ?? p.proto ?? p.ipProtocolNumber;
2350+
return normalizeProtocolValue(raw);
2351+
}
23182352
if (data.binned && data.count > 1) {
23192353
// Binned data tooltip
23202354
const { utcTime, timestampSec } = formatTimestamp(data.timestamp);
23212355
let tooltipContent = `<b>${data.flagType} (Binned)</b><br>`;
23222356
tooltipContent += `Count: ${data.count} packets<br>`;
23232357
tooltipContent += `From: ${data.src_ip}<br>To: ${data.dst_ip}<br>`;
2358+
if (data.originalPackets && data.originalPackets.length) {
2359+
const protocols = Array.from(new Set(data.originalPackets.map(extractProtocol)));
2360+
tooltipContent += `Protocol: ${protocols.join(', ')}<br>`;
2361+
} else {
2362+
tooltipContent += `Protocol: ${extractProtocol(data)}<br>`;
2363+
}
23242364
tooltipContent += `Time Bin: ${utcTime}<br>`;
23252365
tooltipContent += `Total Bytes: ${formatBytes(data.totalBytes)}`;
23262366

@@ -2337,7 +2377,7 @@ function createTooltipHTML(data) {
23372377
// Single packet tooltip
23382378
const packet = data.originalPackets ? data.originalPackets[0] : data;
23392379
const { utcTime, timestampSec } = formatTimestamp(packet.timestamp);
2340-
let tooltipContent = `<b>${classifyFlags(packet.flags)}</b><br>From: ${packet.src_ip}<br>To: ${packet.dst_ip}<br>Time: ${utcTime}`;
2380+
let tooltipContent = `<b>${classifyFlags(packet.flags)}</b><br>From: ${packet.src_ip}<br>To: ${packet.dst_ip}<br>Protocol: ${extractProtocol(packet)}<br>Time: ${utcTime}`;
23412381

23422382
// Add sequence and acknowledgment numbers if available
23432383
if (packet.seq_num !== undefined && packet.seq_num !== null) {

0 commit comments

Comments
 (0)