| Seq | Timestamp | Type | Name | Duration |
|---|---|---|---|---|
| 0/0 | 2026/07/02 12:46 | flow | patch-triage |
1mArgs:null Results: {
"EnableConfigs": [
"IP_VS"
],
"FocusSymbols": [
"ip_vs_in_icmp"
],
"Reasoning": "The patch fixes MTU calculation for tunneled ICMP packets in IPVS by correctly accounting for the UDP/GRE tunnel header length. This is a functional change in reachable core IPVS logic.",
"WorthFuzzing": true
} |
| 1/1 | 2026/07/02 12:46 | action | read-patch-diff |
0mArgs:null Results: {
"PatchDiff": "commit c08ecacd231b7f6b8a1618e1520ce0a963f13c92\nAuthor: syz-cluster \u003ctriage@syzkaller.com\u003e\nDate: Thu Jul 2 12:46:43 2026 +0000\n\n syz-cluster: applied patch under review\n\ndiff --git a/net/netfilter/ipvs/ip_vs_core.c b/net/netfilter/ipvs/ip_vs_core.c\nindex d40b404c1bf646..906f2c36167638 100644\n--- a/net/netfilter/ipvs/ip_vs_core.c\n+++ b/net/netfilter/ipvs/ip_vs_core.c\n@@ -1767,6 +1767,7 @@ ip_vs_in_icmp(struct netns_ipvs *ipvs, struct sk_buff *skb, int *related,\n \tbool tunnel, new_cp = false;\n \tunion nf_inet_addr *raddr;\n \tchar *outer_proto = \"IPIP\";\n+\tint ulen = 0;\n \n \t*related = 1;\n \n@@ -1831,7 +1832,6 @@ ip_vs_in_icmp(struct netns_ipvs *ipvs, struct sk_buff *skb, int *related,\n \t\t /* Error for our tunnel must arrive at LOCAL_IN */\n \t\t (skb_rtable(skb)-\u003ert_flags \u0026 RTCF_LOCAL)) {\n \t\t__u8 iproto;\n-\t\tint ulen;\n \n \t\t/* Non-first fragment has no UDP/GRE header */\n \t\tif (unlikely(cih-\u003efrag_off \u0026 htons(IP_OFFSET)))\n@@ -1936,8 +1936,8 @@ ip_vs_in_icmp(struct netns_ipvs *ipvs, struct sk_buff *skb, int *related,\n \t\t\t\tif (dest_dst)\n \t\t\t\t\tmtu = dst_mtu(dest_dst-\u003edst_cache);\n \t\t\t}\n-\t\t\tif (mtu \u003e 68 + sizeof(struct iphdr))\n-\t\t\t\tmtu -= sizeof(struct iphdr);\n+\t\t\tif (mtu \u003e 68 + sizeof(struct iphdr) + ulen)\n+\t\t\t\tmtu -= sizeof(struct iphdr) + ulen;\n \t\t\tinfo = htonl(mtu);\n \t\t}\n \t\t/* Strip outer IP, ICMP and IPIP/UDP/GRE, go to IP header of\n"
} |
| 2/1 | 2026/07/02 12:46 | agent | patch-evaluator |
1mModel:gemini-3.1-pro-preview Args: null Results: {
"EnableConfigs": [
"IP_VS"
],
"FocusSymbols": [
"ip_vs_in_icmp"
],
"Reasoning": "The patch fixes MTU calculation for tunneled ICMP packets in IPVS by correctly accounting for the UDP/GRE tunnel header length. This is a functional change in reachable core IPVS logic.",
"WorthFuzzing": true
}Instruction: You are an expert Linux kernel maintainer. Your job is to review a provided patch series and determine if it makes functional changes to the kernel that should be fuzzed. IMPORTANT: The changes have ALREADY been applied and committed as the HEAD commit in your workspace. Do NOT rely on your internal knowledge of the kernel. You must actively use your code access tools to examine the actual source code and confirm any assumptions. Return WorthFuzzing=false if the patch only contains: - Modifications to Documentation/, Kconfig files, or code comments. - Purely decorative changes, such as logging (e.g., pr_err, printk) or tracepoints. - Changes to numeric constants or macros that do not functionally alter execution flow. - Code paths that are impossible to reach in virtualized environments like GCE or QEMU, even when utilizing software-emulated hardware (e.g., usb gadget, mac80211_hwsim). If it modifies reachable core kernel logic, drivers, or architectures, use your code search tools to verify the code can be executed, then return WorthFuzzing=true. When returning WorthFuzzing=true, you MUST ALSO: 1. Extract any specific kernel functions that should be heavily fuzzed into FocusSymbols. Avoid listing generic hot-path functions to prevent skewed test distributions. 2. Identify any specific CONFIG_ options required to properly test this new/modified feature. Go and look into the Kconfig files and check for ifdefs around the code, do not make assumptions. Do not list too generic configs (we already have them enabled). Only list those that specifically cover the modified code. List them in the EnableConfigs output array, and DO NOT add a 'CONFIG_' prefix (e.g., return "NET_IPV4" instead of "CONFIG_NET_IPV4"). Prefer calling several tools at the same time to save round-trips. Use set-results tool to provide results of the analysis. It must be called exactly once before the final reply. Ignore results of this tool. Prompt: For your convenience, here is the diff of the changes:
commit c08ecacd231b7f6b8a1618e1520ce0a963f13c92
Author: syz-cluster <triage@syzkaller.com>
Date: Thu Jul 2 12:46:43 2026 +0000
syz-cluster: applied patch under review
diff --git a/net/netfilter/ipvs/ip_vs_core.c b/net/netfilter/ipvs/ip_vs_core.c
index d40b404c1bf646..906f2c36167638 100644
--- a/net/netfilter/ipvs/ip_vs_core.c
+++ b/net/netfilter/ipvs/ip_vs_core.c
@@ -1767,6 +1767,7 @@ ip_vs_in_icmp(struct netns_ipvs *ipvs, struct sk_buff *skb, int *related,
bool tunnel, new_cp = false;
union nf_inet_addr *raddr;
char *outer_proto = "IPIP";
+ int ulen = 0;
*related = 1;
@@ -1831,7 +1832,6 @@ ip_vs_in_icmp(struct netns_ipvs *ipvs, struct sk_buff *skb, int *related,
/* Error for our tunnel must arrive at LOCAL_IN */
(skb_rtable(skb)->rt_flags & RTCF_LOCAL)) {
__u8 iproto;
- int ulen;
/* Non-first fragment has no UDP/GRE header */
if (unlikely(cih->frag_off & htons(IP_OFFSET)))
@@ -1936,8 +1936,8 @@ ip_vs_in_icmp(struct netns_ipvs *ipvs, struct sk_buff *skb, int *related,
if (dest_dst)
mtu = dst_mtu(dest_dst->dst_cache);
}
- if (mtu > 68 + sizeof(struct iphdr))
- mtu -= sizeof(struct iphdr);
+ if (mtu > 68 + sizeof(struct iphdr) + ulen)
+ mtu -= sizeof(struct iphdr) + ulen;
info = htonl(mtu);
}
/* Strip outer IP, ICMP and IPIP/UDP/GRE, go to IP header of
|
| 3/2 | 2026/07/02 12:46 | llm | patch-evaluator |
0mModel:gemini-3.1-pro-preview Args: null Results: null Tokens: input: 2165 output: 36 thoughts: 217 Thoughts: **Analyzing the IPVS ICMP MTU Patch** Okay, so I'm looking at this patch for `net/netfilter/ipvs/ip_vs_core.c` and specifically the changes to `ip_vs_in_icmp`. It looks like a simple functional change, but MTU calculations are always something to be cautious about, especially in a network context. This patch appears to modify the MTU calculation for ICMP packets. Previously, the code subtracted `sizeof(struct iphdr)` from the MTU if it was large enough. Now, it's subtracting `sizeof(struct iphdr) + ulen`, where `ulen` is moved and initialized to zero at the start of the function. This indicates it's fixing an MTU calculation error, probably related to the ICMP payload length, as ulen seems related to the size. The change itself looks straightforward; the issue is subtle. This is the kind of thing that could lead to fragmentation issues or, worse, hard-to-diagnose connection problems under specific network conditions. It's easy to miss a seemingly minor integer overflow. I'm noting that. My first thought is, this needs to be fuzzed thoroughly. MTU-related issues are prime targets for fuzzing campaigns, and IPVS is a critical component for load balancing. I need to make sure this doesn't introduce any new vulnerabilities or regressions. I should start by checking the surrounding `ip_vs_in_icmp` function and any related functions in `net/netfilter/ipvs/ip_vs_core.c` for any potential side effects or related calculations. And, let me see if I can find the current IPVS configuration, or any associated documentation to ensure that MTU is properly set. This is a good place to start my investigation. |
| 4/2 | 2026/07/02 12:46 | tool | grepper |
0mArgs:{
"Expression": "ip_vs_core.o",
"PathPrefix": "net/netfilter/ipvs/Makefile"
}Results: {
"Output": "net/netfilter/ipvs/Makefile=14=ip_vs-extra_objs-$(CONFIG_IP_VS_NFCT) += ip_vs_nfct.o\nnet/netfilter/ipvs/Makefile-15-\nnet/netfilter/ipvs/Makefile:16:ip_vs-objs :=\tip_vs_conn.o ip_vs_core.o ip_vs_ctl.o ip_vs_sched.o\t \\\nnet/netfilter/ipvs/Makefile-17-\t\tip_vs_xmit.o ip_vs_app.o ip_vs_sync.o\t \t\t \\\n"
} |
| 5/2 | 2026/07/02 12:46 | llm | patch-evaluator |
0mModel:gemini-3.1-pro-preview Args: null Results: null Tokens: input: 2960 output: 42 thoughts: 42 Thoughts: Okay, here's my interpretation of that thought process, assuming I'm an expert in this area: **Analyzing IP Virtual Server Configuration** Alright, the core focus here is `CONFIG_IP_VS`. That's the key enabling option for IP Virtual Server functionality in the Linux kernel. My next step, based on that, is to immediately dive into the `ip_vs_in_icmp` function within `net/netfilter/ipvs/ip_vs_core.c`. I need to figure out how ICMP traffic is handled within the context of the IPVS core. I know that file and function like the back of my hand, so I'm already anticipating the nuances of the interaction. I need to understand how incoming ICMP packets are processed and routed within the IPVS framework. Any potential issues with ICMP's behavior in relation to IPVS are always a concern, and this `ip_vs_in_icmp` function is often the key to resolving such issues. I will go through the implementation to ensure that it aligns with expected functionality, especially considering the current context. |
| 6/2 | 2026/07/02 12:46 | tool | grepper |
0mArgs:{
"Expression": "ip_vs_in_icmp",
"PathPrefix": "net/netfilter/ipvs/ip_vs_core.c"
}Results: {
"Output": "net/netfilter/ipvs/ip_vs_core.c=1755=static int\nnet/netfilter/ipvs/ip_vs_core.c:1756:ip_vs_in_icmp(struct netns_ipvs *ipvs, struct sk_buff *skb, int *related,\nnet/netfilter/ipvs/ip_vs_core.c-1757-\t unsigned int hooknum)\n--\nnet/netfilter/ipvs/ip_vs_core.c-1978-#ifdef CONFIG_IP_VS_IPV6\nnet/netfilter/ipvs/ip_vs_core.c:1979:static int ip_vs_in_icmp_v6(struct netns_ipvs *ipvs, struct sk_buff *skb,\nnet/netfilter/ipvs/ip_vs_core.c-1980-\t\t\t int *related, unsigned int hooknum,\n--\nnet/netfilter/ipvs/ip_vs_core.c=2086=ip_vs_in_hook(void *priv, struct sk_buff *skb, const struct nf_hook_state *state)\n--\nnet/netfilter/ipvs/ip_vs_core.c-2135-\t\t\tint related;\nnet/netfilter/ipvs/ip_vs_core.c:2136:\t\t\tint verdict = ip_vs_in_icmp_v6(ipvs, skb, \u0026related,\nnet/netfilter/ipvs/ip_vs_core.c-2137-\t\t\t\t\t\t hooknum, \u0026iph);\n--\nnet/netfilter/ipvs/ip_vs_core.c-2145-\t\t\tint related;\nnet/netfilter/ipvs/ip_vs_core.c:2146:\t\t\tint verdict = ip_vs_in_icmp(ipvs, skb, \u0026related,\nnet/netfilter/ipvs/ip_vs_core.c-2147-\t\t\t\t\t\t hooknum);\n--\nnet/netfilter/ipvs/ip_vs_core.c-2274- * but ICMP destined for 0.0.0.0/0 cannot not be easily marked and\nnet/netfilter/ipvs/ip_vs_core.c:2275: * sent to ip_vs_in_icmp. So, catch them at the NF_INET_FORWARD chain\nnet/netfilter/ipvs/ip_vs_core.c:2276: * and send them to ip_vs_in_icmp.\nnet/netfilter/ipvs/ip_vs_core.c-2277- */\n--\nnet/netfilter/ipvs/ip_vs_core.c=2279=ip_vs_forward_icmp(void *priv, struct sk_buff *skb,\n--\nnet/netfilter/ipvs/ip_vs_core.c-2300-\nnet/netfilter/ipvs/ip_vs_core.c:2301:\t\treturn ip_vs_in_icmp_v6(ipvs, skb, \u0026r, state-\u003ehook, \u0026iphdr);\nnet/netfilter/ipvs/ip_vs_core.c-2302-#endif\n--\nnet/netfilter/ipvs/ip_vs_core.c-2304-\nnet/netfilter/ipvs/ip_vs_core.c:2305:\treturn ip_vs_in_icmp(ipvs, skb, \u0026r, state-\u003ehook);\nnet/netfilter/ipvs/ip_vs_core.c-2306-}\n"
} |
| 7/2 | 2026/07/02 12:46 | llm | patch-evaluator |
0mModel:gemini-3.1-pro-preview Args: null Results: null Tokens: input: 4152 output: 35 thoughts: 62 Thoughts: **Analyzing the ICMP Handling in IPVS** Okay, so I'm looking at this `ip_vs_in_icmp` function, and it's clear that it's being used by both `ip_vs_in_hook` and `ip_vs_forward_icmp`. That's good – it means the core ICMP processing is definitely reachable and active. I'm assuming the `IP_VS` config option is enabled, which is the baseline. But I need to double-check: is there anything *else* that needs to be enabled for this specific ICMP functionality to work correctly? Are there any related config dependencies I might be missing? Time to dig a bit deeper into the config options... |
| 8/2 | 2026/07/02 12:46 | tool | grepper |
0mError:no matches Args: {
"Expression": "CONFIG_IP_VS",
"PathPrefix": "net/netfilter/ipvs/Kconfig"
}Results: {
"error": "no matches"
} |
| 9/2 | 2026/07/02 12:46 | llm | patch-evaluator |
0mModel:gemini-3.1-pro-preview Args: null Results: null Tokens: input: 4416 output: 34 thoughts: 26 Thoughts: Okay, here's my take on those thoughts, framed as an expert's internal monologue: **Investigating Netfilter Configuration Options** Right, so I need to figure out where a specific netfilter-related configuration option might be located. My gut feeling is that it's buried in one of the Kconfig files. The logical places to start poking around are `net/netfilter/Kconfig` – the obvious general netfilter configuration file – or, since I'm vaguely remembering something about connection tracking or load balancing, perhaps `net/netfilter/ipvs/Kconfig`. Those are the two most likely candidates. I'll take a look at those files and see what I can find. It's a bit of a process of elimination sometimes. Hopefully the options are well-documented within those files. |
| 10/2 | 2026/07/02 12:47 | tool | grepper |
0mArgs:{
"Expression": "config IP_VS",
"PathPrefix": "net/netfilter/ipvs/Kconfig"
}Results: {
"Output": "net/netfilter/ipvs/Kconfig-4-#\nnet/netfilter/ipvs/Kconfig:5:menuconfig IP_VS\nnet/netfilter/ipvs/Kconfig-6-\ttristate \"IP virtual server support\"\n--\nnet/netfilter/ipvs/Kconfig=286=comment 'IPVS SH scheduler'\nnet/netfilter/ipvs/Kconfig-287-\nnet/netfilter/ipvs/Kconfig:288:config IP_VS_SH_TAB_BITS\nnet/netfilter/ipvs/Kconfig-289-\tint \"IPVS source hashing table size (the Nth power of 2)\"\n--\nnet/netfilter/ipvs/Kconfig=301=comment 'IPVS MH scheduler'\nnet/netfilter/ipvs/Kconfig-302-\nnet/netfilter/ipvs/Kconfig:303:config IP_VS_MH_TAB_INDEX\nnet/netfilter/ipvs/Kconfig-304-\tint \"IPVS maglev hashing table index of size (the prime numbers)\"\n"
} |
| 11/2 | 2026/07/02 12:47 | llm | patch-evaluator |
0mModel:gemini-3.1-pro-preview Args: null Results: null Tokens: input: 4917 output: 45 thoughts: 60 Thoughts: Okay, let's break this down. **IPVS Configuration Deep Dive** Alright, so I'm focusing on the `IP_VS` configuration here. My immediate thought is, "Okay, what options are available?" Then I recall `ip_vs_in_icmp`, and I have to clarify: wait, that's specifically for IPv4 ICMP traffic, isn't it? I need to make sure I'm not missing anything else that's relevant. My train of thought goes straight to needing to look deeper, specifically I need to go to `ip_vs_core.c` and dig around for this `ip_vs_in_icmp` setting to gain a more complete understanding. That's probably where I'll find the most comprehensive information and context. |
| 12/2 | 2026/07/02 12:47 | tool | read-file |
0mArgs:{
"File": "net/netfilter/ipvs/ip_vs_core.c",
"FirstLine": 1750,
"LineCount": 100
}Results: {
"Contents": "1750:\t *\tHandle ICMP messages in the outside-to-inside direction (incoming).\n1751:\t *\tFind any that might be relevant, check against existing connections,\n1752:\t *\tforward to the right destination host if relevant.\n1753:\t *\tCurrently handles error types - unreachable, quench, ttl exceeded.\n1754:\t */\n1755:\tstatic int\n1756:\tip_vs_in_icmp(struct netns_ipvs *ipvs, struct sk_buff *skb, int *related,\n1757:\t\t unsigned int hooknum)\n1758:\t{\n1759:\t\tstruct iphdr *iph;\n1760:\t\tstruct icmphdr\t_icmph, *ic;\n1761:\t\tstruct iphdr\t_ciph, *cih;\t/* The ip header contained within the ICMP */\n1762:\t\tstruct ip_vs_iphdr ciph;\n1763:\t\tstruct ip_vs_conn *cp;\n1764:\t\tstruct ip_vs_protocol *pp;\n1765:\t\tstruct ip_vs_proto_data *pd;\n1766:\t\tunsigned int offset, offset2, ihl, verdict;\n1767:\t\tbool tunnel, new_cp = false;\n1768:\t\tunion nf_inet_addr *raddr;\n1769:\t\tchar *outer_proto = \"IPIP\";\n1770:\t\tint ulen = 0;\n1771:\t\n1772:\t\t*related = 1;\n1773:\t\n1774:\t\t/* reassemble IP fragments */\n1775:\t\tif (ip_is_fragment(ip_hdr(skb))) {\n1776:\t\t\tif (ip_vs_gather_frags(ipvs, skb, ip_vs_defrag_user(hooknum)))\n1777:\t\t\t\treturn NF_STOLEN;\n1778:\t\t}\n1779:\t\n1780:\t\tiph = ip_hdr(skb);\n1781:\t\toffset = ihl = iph-\u003eihl * 4;\n1782:\t\tic = skb_header_pointer(skb, offset, sizeof(_icmph), \u0026_icmph);\n1783:\t\tif (ic == NULL)\n1784:\t\t\treturn NF_DROP;\n1785:\t\n1786:\t\tIP_VS_DBG(12, \"Incoming ICMP (%d,%d) %pI4-\u003e%pI4\\n\",\n1787:\t\t\t ic-\u003etype, ntohs(icmp_id(ic)),\n1788:\t\t\t \u0026iph-\u003esaddr, \u0026iph-\u003edaddr);\n1789:\t\n1790:\t\t/*\n1791:\t\t * Work through seeing if this is for us.\n1792:\t\t * These checks are supposed to be in an order that means easy\n1793:\t\t * things are checked first to speed up processing.... however\n1794:\t\t * this means that some packets will manage to get a long way\n1795:\t\t * down this stack and then be rejected, but that's life.\n1796:\t\t */\n1797:\t\tif ((ic-\u003etype != ICMP_DEST_UNREACH) \u0026\u0026\n1798:\t\t (ic-\u003etype != ICMP_SOURCE_QUENCH) \u0026\u0026\n1799:\t\t (ic-\u003etype != ICMP_TIME_EXCEEDED)) {\n1800:\t\t\t*related = 0;\n1801:\t\t\treturn NF_ACCEPT;\n1802:\t\t}\n1803:\t\n1804:\t\t/* Now find the contained IP header */\n1805:\t\toffset += sizeof(_icmph);\n1806:\t\tcih = skb_header_pointer(skb, offset, sizeof(_ciph), \u0026_ciph);\n1807:\t\tif (cih == NULL)\n1808:\t\t\treturn NF_ACCEPT; /* The packet looks wrong, ignore */\n1809:\t\traddr = (union nf_inet_addr *)\u0026cih-\u003edaddr;\n1810:\t\n1811:\t\t/* Special case for errors for IPIP/UDP/GRE tunnel packets */\n1812:\t\ttunnel = false;\n1813:\t\tif (cih-\u003eprotocol == IPPROTO_IPIP) {\n1814:\t\t\tstruct ip_vs_dest *dest;\n1815:\t\n1816:\t\t\tif (unlikely(cih-\u003efrag_off \u0026 htons(IP_OFFSET)))\n1817:\t\t\t\treturn NF_ACCEPT;\n1818:\t\t\t/* Error for our IPIP must arrive at LOCAL_IN */\n1819:\t\t\tif (!(skb_rtable(skb)-\u003ert_flags \u0026 RTCF_LOCAL))\n1820:\t\t\t\treturn NF_ACCEPT;\n1821:\t\t\tdest = ip_vs_find_tunnel(ipvs, AF_INET, raddr, 0);\n1822:\t\t\t/* Only for known tunnel */\n1823:\t\t\tif (!dest || dest-\u003etun_type != IP_VS_CONN_F_TUNNEL_TYPE_IPIP)\n1824:\t\t\t\treturn NF_ACCEPT;\n1825:\t\t\toffset += cih-\u003eihl * 4;\n1826:\t\t\tcih = skb_header_pointer(skb, offset, sizeof(_ciph), \u0026_ciph);\n1827:\t\t\tif (cih == NULL)\n1828:\t\t\t\treturn NF_ACCEPT; /* The packet looks wrong, ignore */\n1829:\t\t\ttunnel = true;\n1830:\t\t} else if ((cih-\u003eprotocol == IPPROTO_UDP ||\t/* Can be UDP encap */\n1831:\t\t\t cih-\u003eprotocol == IPPROTO_GRE) \u0026\u0026\t/* Can be GRE encap */\n1832:\t\t\t /* Error for our tunnel must arrive at LOCAL_IN */\n1833:\t\t\t (skb_rtable(skb)-\u003ert_flags \u0026 RTCF_LOCAL)) {\n1834:\t\t\t__u8 iproto;\n1835:\t\n1836:\t\t\t/* Non-first fragment has no UDP/GRE header */\n1837:\t\t\tif (unlikely(cih-\u003efrag_off \u0026 htons(IP_OFFSET)))\n1838:\t\t\t\treturn NF_ACCEPT;\n1839:\t\t\toffset2 = offset + cih-\u003eihl * 4;\n1840:\t\t\tif (cih-\u003eprotocol == IPPROTO_UDP) {\n1841:\t\t\t\tulen = ipvs_udp_decap(ipvs, skb, offset2, AF_INET,\n1842:\t\t\t\t\t\t raddr, \u0026iproto);\n1843:\t\t\t\touter_proto = \"UDP\";\n1844:\t\t\t} else {\n1845:\t\t\t\tulen = ipvs_gre_decap(ipvs, skb, offset2, AF_INET,\n1846:\t\t\t\t\t\t raddr, \u0026iproto);\n1847:\t\t\t\touter_proto = \"GRE\";\n1848:\t\t\t}\n1849:\t\t\tif (ulen \u003e 0) {\n"
} |
| 13/2 | 2026/07/02 12:47 | llm | patch-evaluator |
0mModel:gemini-3.1-pro-preview Args: null Results: null Tokens: input: 6954 output: 35 thoughts: 746 Thoughts: **Analyzing the IPVS ICMP MTU Patch** Okay, so I've been looking at a patch that modifies the `ip_vs_in_icmp` function. The code seems functional, and the config associated with this change is `IP_VS`. My primary focus is definitely `ip_vs_in_icmp`, so I want to explore it in depth. First, let's see if there are any other functions impacted by this patch. Hmm, nope, it's just `ip_vs_in_icmp`. Alright, let me take a closer look at the actual code change itself. Ah, this is fixing the MTU calculation for ICMP packets that are tunneled through IPVS. It looks like the change introduces a `ulen` variable to adjust the MTU calculation and address an MTU calculation issue that occurs with UDP or GRE encapsulated packets. This type of fix is definitely something that could benefit from thorough fuzzing. My primary focus is definitely `ip_vs_in_icmp`, and I want to confirm that. Yes, it is indeed a static function. That helps. And a quick check reveals that `ip_vs_in_icmp` is called by `ip_vs_in_hook` and `ip_vs_forward_icmp`. Both of these are netfilter hooks, which reinforces my understanding of the relevant context. This makes `ip_vs_in_icmp` a solid choice for focused analysis. Now, let me make sure `IP_VS` is the only config here. Does this involve any IPVS UDP or GRE tunneling? Let me quickly check the related functions such as `ipvs_udp_decap` and `ipvs_gre_decap` to make sure there are no other configurations I need to consider for this analysis. Good, I think I have a solid understanding of the impact of this change, and I'm ready to proceed with more detailed analysis. |
| 14/2 | 2026/07/02 12:47 | tool | grepper |
0mArgs:{
"Expression": "ipvs_udp_decap",
"PathPrefix": "net/netfilter/ipvs/"
}Results: {
"Output": "net/netfilter/ipvs/ip_vs_core.c=1644=ip_vs_try_to_schedule(struct netns_ipvs *ipvs, int af, struct sk_buff *skb,\n--\nnet/netfilter/ipvs/ip_vs_core.c-1678-/* Check the UDP tunnel and return its header length */\nnet/netfilter/ipvs/ip_vs_core.c:1679:static int ipvs_udp_decap(struct netns_ipvs *ipvs, struct sk_buff *skb,\nnet/netfilter/ipvs/ip_vs_core.c-1680-\t\t\t unsigned int offset, __u16 af,\n--\nnet/netfilter/ipvs/ip_vs_core.c=1756=ip_vs_in_icmp(struct netns_ipvs *ipvs, struct sk_buff *skb, int *related,\n--\nnet/netfilter/ipvs/ip_vs_core.c-1840-\t\tif (cih-\u003eprotocol == IPPROTO_UDP) {\nnet/netfilter/ipvs/ip_vs_core.c:1841:\t\t\tulen = ipvs_udp_decap(ipvs, skb, offset2, AF_INET,\nnet/netfilter/ipvs/ip_vs_core.c-1842-\t\t\t\t\t raddr, \u0026iproto);\n"
} |
| 15/2 | 2026/07/02 12:47 | llm | patch-evaluator |
0mModel:gemini-3.1-pro-preview Args: null Results: null Tokens: input: 8494 output: 34 thoughts: 19 Thoughts: Okay, here's my thought process summarized, keeping in mind my expert understanding: **Investigating IPVS and UDP/GRE Tunneling Configurations** Alright, let's get down to brass tacks. I need to quickly ascertain if there are any *specific* configuration options within the IP Virtual Server (IPVS) system that are particularly relevant to UDP or GRE (Generic Routing Encapsulation) tunneling. I know the basics, but I need to be sure I'm not missing some nuance or a specialized setting that optimizes performance or behavior in a tunneling scenario. I'm going to start by quickly scanning the standard documentation and maybe some less obvious sources—perhaps some forum discussions or experimental configurations—to see if there's any IPVS-specific tuning required when these protocols are involved. It’s about being thorough and making sure the solution is optimal, not just functional. |
| 16/2 | 2026/07/02 12:47 | tool | grepper |
0mArgs:{
"Expression": "config IP_VS",
"PathPrefix": "net/netfilter/ipvs/Kconfig"
}Results: {
"Output": "net/netfilter/ipvs/Kconfig-4-#\nnet/netfilter/ipvs/Kconfig:5:menuconfig IP_VS\nnet/netfilter/ipvs/Kconfig-6-\ttristate \"IP virtual server support\"\n--\nnet/netfilter/ipvs/Kconfig=286=comment 'IPVS SH scheduler'\nnet/netfilter/ipvs/Kconfig-287-\nnet/netfilter/ipvs/Kconfig:288:config IP_VS_SH_TAB_BITS\nnet/netfilter/ipvs/Kconfig-289-\tint \"IPVS source hashing table size (the Nth power of 2)\"\n--\nnet/netfilter/ipvs/Kconfig=301=comment 'IPVS MH scheduler'\nnet/netfilter/ipvs/Kconfig-302-\nnet/netfilter/ipvs/Kconfig:303:config IP_VS_MH_TAB_INDEX\nnet/netfilter/ipvs/Kconfig-304-\tint \"IPVS maglev hashing table index of size (the prime numbers)\"\n"
} |
| 17/2 | 2026/07/02 12:47 | llm | patch-evaluator |
0mModel:gemini-3.1-pro-preview Args: null Results: null Tokens: input: 8999 output: 36 thoughts: 31 Thoughts: Okay, here's my interpretation of those thoughts, tailored for an expert audience: **Investigating IPVS Tunneling Options** Alright, I need to get a clear picture of how IPVS handles tunneling protocols. My first instinct is to dive directly into the `net/netfilter/ipvs/Kconfig` file. That's the configuration file, and it should give me a good overview of the available options and dependencies related to tunneling. Specifically, I'm going to scan the entire file for any mentions of `TUNNEL`, `GRE`, or `UDP` keywords. This will quickly highlight any relevant configurations, module dependencies, or feature flags tied to these tunneling technologies within the IPVS context. It's a quick and dirty, but effective, way to get a baseline understanding before I start digging into the code itself. This is my starting point, before any deeper analysis. |
| 18/2 | 2026/07/02 12:47 | tool | grepper |
0mArgs:{
"Expression": "TUNNEL|GRE|UDP",
"PathPrefix": "net/netfilter/ipvs/Kconfig"
}Results: {
"Output": "net/netfilter/ipvs/Kconfig=79=config\tIP_VS_PROTO_TCP\n--\nnet/netfilter/ipvs/Kconfig-84-\nnet/netfilter/ipvs/Kconfig:85:config\tIP_VS_PROTO_UDP\nnet/netfilter/ipvs/Kconfig:86:\tbool \"UDP load balancing support\"\nnet/netfilter/ipvs/Kconfig-87-\thelp\nnet/netfilter/ipvs/Kconfig:88:\t This option enables support for load balancing UDP transport\nnet/netfilter/ipvs/Kconfig-89-\t protocol. Say Y if unsure.\n--\nnet/netfilter/ipvs/Kconfig=345=config\tIP_VS_PE_SIP\nnet/netfilter/ipvs/Kconfig-346-\ttristate \"SIP persistence engine\"\nnet/netfilter/ipvs/Kconfig:347:\tdepends on IP_VS_PROTO_UDP\nnet/netfilter/ipvs/Kconfig-348-\tdepends on NF_CONNTRACK_SIP\n"
} |
| 19/2 | 2026/07/02 12:47 | llm | patch-evaluator |
0mModel:gemini-3.1-pro-preview Args: null Results: null Tokens: input: 9520 output: 42 thoughts: 155 Thoughts: **UDP Load Balancing Considerations** Okay, so I'm looking at this code and I see `IP_VS_PROTO_UDP`. My initial thought is, "Right, that's for UDP load balancing, got it." But then I remember that `ipvs_udp_decap` is actually defined within `ip_vs_core.c`. And that file gets compiled unconditionally if `IP_VS` is enabled. So, the question is, *do* I even need `IP_VS_PROTO_UDP` for the tunneling itself, or is it just for the load balancing aspect? It's easy to get confused with these preprocessor directives. I think to be completely safe, I'll just go ahead and include both `IP_VS` and `IP_VS_PROTO_UDP`. But wait, I should double check: I'm pretty sure `ipvs_udp_decap` isn't conditional on `CONFIG_IP_VS_PROTO_UDP`, and since it's defined in `ip_vs_core.c`, and that's enabled with `IP_VS`, it doesn't seem to be. |
| 20/2 | 2026/07/02 12:47 | tool | grepper |
0mArgs:{
"Expression": "ipvs_udp_decap",
"PathPrefix": "net/netfilter/ipvs/ip_vs_core.c"
}Results: {
"Output": "net/netfilter/ipvs/ip_vs_core.c=1644=ip_vs_try_to_schedule(struct netns_ipvs *ipvs, int af, struct sk_buff *skb,\n--\nnet/netfilter/ipvs/ip_vs_core.c-1678-/* Check the UDP tunnel and return its header length */\nnet/netfilter/ipvs/ip_vs_core.c:1679:static int ipvs_udp_decap(struct netns_ipvs *ipvs, struct sk_buff *skb,\nnet/netfilter/ipvs/ip_vs_core.c-1680-\t\t\t unsigned int offset, __u16 af,\n--\nnet/netfilter/ipvs/ip_vs_core.c=1756=ip_vs_in_icmp(struct netns_ipvs *ipvs, struct sk_buff *skb, int *related,\n--\nnet/netfilter/ipvs/ip_vs_core.c-1840-\t\tif (cih-\u003eprotocol == IPPROTO_UDP) {\nnet/netfilter/ipvs/ip_vs_core.c:1841:\t\t\tulen = ipvs_udp_decap(ipvs, skb, offset2, AF_INET,\nnet/netfilter/ipvs/ip_vs_core.c-1842-\t\t\t\t\t raddr, \u0026iproto);\n"
} |
| 21/2 | 2026/07/02 12:47 | llm | patch-evaluator |
0mModel:gemini-3.1-pro-preview Args: null Results: null Tokens: input: 10315 output: 44 thoughts: 26 Thoughts: Here's my thought process, as if I were considering this code: **Diving into `ip_vs_core.c` and `ipvs_udp_decap`** Okay, so we need to look at the context surrounding `ipvs_udp_decap` in `ip_vs_core.c`. My immediate thought is, "Right, let's see where this function is called, what it's doing, and what data structures it's interacting with." I need to understand how the UDP decapsulation is handled within the IPVS framework. I'm assuming, given the name, this is where we're peeling off the encapsulation headers for UDP traffic destined for Virtual Servers. We'll be looking for how the encapsulated packet is received, processed, and passed onto the Real Server. I'll be particularly interested in anything that relates to connection tracking or load balancing decisions at this point. I'll need to remember to check for any potential edge cases or error handling related to malformed packets or unexpected UDP header configurations. Any potential security implications should also be kept in mind, as improper handling of encapsulated traffic can sometimes lead to vulnerabilities. |
| 22/2 | 2026/07/02 12:47 | tool | read-file |
0mArgs:{
"File": "net/netfilter/ipvs/ip_vs_core.c",
"FirstLine": 1670,
"LineCount": 20
}Results: {
"Contents": "1670:\t\n1671:\t\t\t*verdict = NF_ACCEPT;\n1672:\t\t\treturn 0;\n1673:\t\t}\n1674:\t\n1675:\t\treturn 1;\n1676:\t}\n1677:\t\n1678:\t/* Check the UDP tunnel and return its header length */\n1679:\tstatic int ipvs_udp_decap(struct netns_ipvs *ipvs, struct sk_buff *skb,\n1680:\t\t\t\t unsigned int offset, __u16 af,\n1681:\t\t\t\t const union nf_inet_addr *daddr, __u8 *proto)\n1682:\t{\n1683:\t\tstruct udphdr _udph, *udph;\n1684:\t\tstruct ip_vs_dest *dest;\n1685:\t\n1686:\t\tudph = skb_header_pointer(skb, offset, sizeof(_udph), \u0026_udph);\n1687:\t\tif (!udph)\n1688:\t\t\tgoto unk;\n1689:\t\toffset += sizeof(struct udphdr);\n"
} |
| 23/2 | 2026/07/02 12:47 | llm | patch-evaluator |
0mModel:gemini-3.1-pro-preview Args: null Results: null Tokens: input: 10931 output: 37 thoughts: 713 Thoughts: **Analyzing the IPVS ICMP Patch** Okay, so I'm looking at this patch and my initial thought is that it's focusing on `ip_vs_in_icmp`, which is pretty straightforward. Since it doesn't seem to be gated by any `#ifdef` statements, I can assume that `IP_VS` is the relevant config option here, as it enables IPVS functionality overall. I should still verify that. Let's quickly confirm if `IP_VS_IPV6` is relevant, but looking at the function name, `ip_vs_in_icmp`, it's clear this is the IPv4 version. Now, the main change seems to be within `ip_vs_in_icmp`, and it looks like a fix related to MTU calculations in tunneled ICMP packets, and correctly accounting for the header length of the tunneling protocols. Okay, let me go over the details. It looks like it's addressing an MTU calculation for ICMP packets tunneled over various protocols (likely GRE or UDP encapsulated). The patch is modifying `mtu -= sizeof(struct iphdr) + ulen;`, and this change will affect the core IPVS logic. Now, let's just make sure that `IP_VS` is really the *only* required config. While IPVS covers the core functions, could it need something specific for, say, UDP or GRE tunneling? I'll quickly check for any dependencies on `IP_VS_PROTO_UDP` or `IP_VS_PROTO_GRE`. I'm going to look for references to GRE, as that's a common tunneling protocol. |
| 24/2 | 2026/07/02 12:47 | tool | grepper |
0mError:no matches Args: {
"Expression": "IP_VS_PROTO_GRE",
"PathPrefix": "net/netfilter/ipvs/Kconfig"
}Results: {
"error": "no matches"
} |
| 25/2 | 2026/07/02 12:47 | llm | patch-evaluator |
0mModel:gemini-3.1-pro-preview Args: null Results: null Tokens: input: 12042 output: 45 thoughts: 42 Thoughts: Okay, here's my take on those thoughts, framed as my own: **Quick IPVS Bug Check** Alright, that's straightforward. The initial assessment is a firm *no*. I'm thinking, "No, we don't need to consider anything beyond `IP_VS` for this specific issue." So the critical factor here is simply `IP_VS`. I've already made the decision. Now, just to be thorough and because it's good practice, let's do a fast verification. I'll take a look at the `ip_vs_in_icmp_v6` module. I want to quickly confirm whether it exhibits the same behavior or potential vulnerability. It's about a quick cross-check to solidify my current assumption and avoid any oversight. |
| 26/2 | 2026/07/02 12:47 | tool | grepper |
0mArgs:{
"Expression": "ip_vs_in_icmp_v6",
"PathPrefix": "net/netfilter/ipvs/ip_vs_core.c"
}Results: {
"Output": "net/netfilter/ipvs/ip_vs_core.c=1756=ip_vs_in_icmp(struct netns_ipvs *ipvs, struct sk_buff *skb, int *related,\n--\nnet/netfilter/ipvs/ip_vs_core.c-1978-#ifdef CONFIG_IP_VS_IPV6\nnet/netfilter/ipvs/ip_vs_core.c:1979:static int ip_vs_in_icmp_v6(struct netns_ipvs *ipvs, struct sk_buff *skb,\nnet/netfilter/ipvs/ip_vs_core.c-1980-\t\t\t int *related, unsigned int hooknum,\n--\nnet/netfilter/ipvs/ip_vs_core.c=2086=ip_vs_in_hook(void *priv, struct sk_buff *skb, const struct nf_hook_state *state)\n--\nnet/netfilter/ipvs/ip_vs_core.c-2135-\t\t\tint related;\nnet/netfilter/ipvs/ip_vs_core.c:2136:\t\t\tint verdict = ip_vs_in_icmp_v6(ipvs, skb, \u0026related,\nnet/netfilter/ipvs/ip_vs_core.c-2137-\t\t\t\t\t\t hooknum, \u0026iph);\n--\nnet/netfilter/ipvs/ip_vs_core.c=2279=ip_vs_forward_icmp(void *priv, struct sk_buff *skb,\n--\nnet/netfilter/ipvs/ip_vs_core.c-2300-\nnet/netfilter/ipvs/ip_vs_core.c:2301:\t\treturn ip_vs_in_icmp_v6(ipvs, skb, \u0026r, state-\u003ehook, \u0026iphdr);\nnet/netfilter/ipvs/ip_vs_core.c-2302-#endif\n"
} |
| 27/2 | 2026/07/02 12:47 | llm | patch-evaluator |
0mModel:gemini-3.1-pro-preview Args: null Results: null Tokens: input: 12781 output: 45 thoughts: 24 Thoughts: Okay, here's my take on those thoughts, tailored for an expert audience, presented in the first person: **Analyzing the IPv6 ICMPv6 Input Filtering Code** Alright, let's dive in. I need to quickly refresh my understanding of how we're handling ICMPv6 input within the kernel, specifically focusing on the potential for related filtering. I'm going to grab the source code for `ip_vs_in_icmp_v6`. The key thing I'm immediately interested in is the presence of `ulen`. Based on past experience with IPv4 and IPv6, the `ulen` field or similar construct, is a critical piece when we're dealing with ICMP handling. It's often at the heart of filtering logic. Checking that quickly will give me a valuable data point. This could be where the relevant modifications need to be made. I'm looking for a quick scan of the code to confirm if it has this attribute or equivalent. |
| 28/2 | 2026/07/02 12:47 | tool | read-file |
0mArgs:{
"File": "net/netfilter/ipvs/ip_vs_core.c",
"FirstLine": 1979,
"LineCount": 100
}Results: {
"Contents": "1979:\tstatic int ip_vs_in_icmp_v6(struct netns_ipvs *ipvs, struct sk_buff *skb,\n1980:\t\t\t\t int *related, unsigned int hooknum,\n1981:\t\t\t\t struct ip_vs_iphdr *iph)\n1982:\t{\n1983:\t\tstruct icmp6hdr\t_icmph, *ic;\n1984:\t\tstruct ip_vs_iphdr ciph = {.flags = 0, .fragoffs = 0};/*Contained IP */\n1985:\t\tstruct ip_vs_conn *cp;\n1986:\t\tstruct ip_vs_protocol *pp;\n1987:\t\tstruct ip_vs_proto_data *pd;\n1988:\t\tunsigned int offset, verdict;\n1989:\t\tbool new_cp = false;\n1990:\t\n1991:\t\t*related = 1;\n1992:\t\n1993:\t\tic = frag_safe_skb_hp(skb, iph-\u003elen, sizeof(_icmph), \u0026_icmph);\n1994:\t\tif (ic == NULL)\n1995:\t\t\treturn NF_DROP;\n1996:\t\n1997:\t\t/*\n1998:\t\t * Work through seeing if this is for us.\n1999:\t\t * These checks are supposed to be in an order that means easy\n2000:\t\t * things are checked first to speed up processing.... however\n2001:\t\t * this means that some packets will manage to get a long way\n2002:\t\t * down this stack and then be rejected, but that's life.\n2003:\t\t */\n2004:\t\tif (ic-\u003eicmp6_type \u0026 ICMPV6_INFOMSG_MASK) {\n2005:\t\t\t*related = 0;\n2006:\t\t\treturn NF_ACCEPT;\n2007:\t\t}\n2008:\t\t/* Fragment header that is before ICMP header tells us that:\n2009:\t\t * it's not an error message since they can't be fragmented.\n2010:\t\t */\n2011:\t\tif (iph-\u003eflags \u0026 IP6_FH_F_FRAG)\n2012:\t\t\treturn NF_DROP;\n2013:\t\n2014:\t\tIP_VS_DBG(8, \"Incoming ICMPv6 (%d,%d) %pI6c-\u003e%pI6c\\n\",\n2015:\t\t\t ic-\u003eicmp6_type, ntohs(icmpv6_id(ic)),\n2016:\t\t\t \u0026iph-\u003esaddr, \u0026iph-\u003edaddr);\n2017:\t\n2018:\t\toffset = iph-\u003elen + sizeof(_icmph);\n2019:\t\tif (!ip_vs_fill_iph_skb_icmp(AF_INET6, skb, offset, true, \u0026ciph))\n2020:\t\t\treturn NF_ACCEPT;\n2021:\t\n2022:\t\tpd = ip_vs_proto_data_get(ipvs, ciph.protocol);\n2023:\t\tif (!pd)\n2024:\t\t\treturn NF_ACCEPT;\n2025:\t\tpp = pd-\u003epp;\n2026:\t\n2027:\t\t/* Cannot handle fragmented embedded protocol */\n2028:\t\tif (ciph.fragoffs)\n2029:\t\t\treturn NF_ACCEPT;\n2030:\t\n2031:\t\tIP_VS_DBG_PKT(11, AF_INET6, pp, skb, offset,\n2032:\t\t\t \"Checking incoming ICMPv6 for\");\n2033:\t\n2034:\t\t/* The embedded headers contain source and dest in reverse order\n2035:\t\t * if not from localhost\n2036:\t\t */\n2037:\t\tcp = INDIRECT_CALL_1(pp-\u003econn_in_get, ip_vs_conn_in_get_proto,\n2038:\t\t\t\t ipvs, AF_INET6, skb, \u0026ciph);\n2039:\t\n2040:\t\tif (!cp) {\n2041:\t\t\tint v;\n2042:\t\n2043:\t\t\tif (!sysctl_schedule_icmp(ipvs))\n2044:\t\t\t\treturn NF_ACCEPT;\n2045:\t\n2046:\t\t\tif (!ip_vs_try_to_schedule(ipvs, AF_INET6, skb, pd, \u0026v, \u0026cp, \u0026ciph))\n2047:\t\t\t\treturn v;\n2048:\t\n2049:\t\t\tnew_cp = true;\n2050:\t\t}\n2051:\t\n2052:\t\t/* VS/TUN, VS/DR and LOCALNODE just let it go */\n2053:\t\tif ((hooknum == NF_INET_LOCAL_OUT) \u0026\u0026\n2054:\t\t (IP_VS_FWD_METHOD(cp) != IP_VS_CONN_F_MASQ)) {\n2055:\t\t\tverdict = NF_ACCEPT;\n2056:\t\t\tgoto out;\n2057:\t\t}\n2058:\t\n2059:\t\t/* do the statistics and put it back */\n2060:\t\tip_vs_in_stats(cp, skb);\n2061:\t\n2062:\t\t/* Need to mangle contained IPv6 header in ICMPv6 packet */\n2063:\t\toffset = ciph.len;\n2064:\t\tif (IPPROTO_TCP == ciph.protocol || IPPROTO_UDP == ciph.protocol ||\n2065:\t\t IPPROTO_SCTP == ciph.protocol)\n2066:\t\t\toffset += 2 * sizeof(__u16); /* Also mangle ports */\n2067:\t\n2068:\t\tverdict = ip_vs_icmp_xmit_v6(skb, cp, pp, offset, hooknum, \u0026ciph);\n2069:\t\n2070:\tout:\n2071:\t\tif (likely(!new_cp))\n2072:\t\t\t__ip_vs_conn_put(cp);\n2073:\t\telse\n2074:\t\t\tip_vs_conn_put(cp);\n2075:\t\n2076:\t\treturn verdict;\n2077:\t}\n2078:\t#endif\n"
} |
| 29/2 | 2026/07/02 12:47 | llm | patch-evaluator |
0mModel:gemini-3.1-pro-preview Args: null Results: null Tokens: input: 14661 output: 85 thoughts: 104 Thoughts: **My Analysis of the IPVS ICMPv6 Patch** Okay, so looking at this patch, it's pretty clear that `ip_vs_in_icmp_v6` isn't involved at all. The tunnel logic, specifically the part that handles MTU calculations for encapsulated ICMP packets, isn't present in the IPv6 implementation of ICMP processing within IPVS. Therefore, the fix is exclusively for IPv4 traffic. The configuration that's relevant here is `IP_VS`, of course. My focus is narrowed down to `ip_vs_in_icmp`, the function in question, that's what's been changed. The reasoning is straightforward: this patch is fixing a crucial MTU calculation issue within IPVS. It's about correctly accounting for the overhead introduced by UDP or GRE tunnels when handling ICMP packets. This is a functional change, a core part of the reachable logic within IPVS, so that's why it's been identified as important. Right, I think this looks good. I'll get this set-result logged. |
| 30/2 | 2026/07/02 12:47 | tool | set-results |
0mArgs:{
"EnableConfigs": [
"IP_VS"
],
"FocusSymbols": [
"ip_vs_in_icmp"
],
"Reasoning": "The patch fixes MTU calculation for tunneled ICMP packets in IPVS by correctly accounting for the UDP/GRE tunnel header length. This is a functional change in reachable core IPVS logic.",
"WorthFuzzing": true
}Results: {
"EnableConfigs": [
"IP_VS"
],
"FocusSymbols": [
"ip_vs_in_icmp"
],
"Reasoning": "The patch fixes MTU calculation for tunneled ICMP packets in IPVS by correctly accounting for the UDP/GRE tunnel header length. This is a functional change in reachable core IPVS logic.",
"WorthFuzzing": true
} |
| Total Calls | Total Tokens | Avg Tokens | Total Duration (Seconds) | Avg Duration (Seconds) |
|---|
| Total Calls | Total Duration (Seconds) | Avg Duration (Seconds) |
|---|