{"record":{"id":"bd7872b6ff4d35fa","repo":"OpenNHP/opennhp","slug":"inner-packet-too-large","errorCode":null,"errorMessage":"inner packet too large","messagePattern":"inner packet too large","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"endpoints/server/msghandler.go","lineNumber":818,"sourceCode":"\n\trealIP := net.ParseIP(rlyMsg.SourceAddr.Ip)\n\tif reason := validateRelaySourceAddr(realIP, rlyMsg.SourceAddr.Port, s.allowPrivateRelaySource.Load()); reason != \"\" {\n\t\tlog.Warning(\"server-relay[HandleRelayForward] rejecting %s from relay %s: %s:%d\",\n\t\t\treason, ppd.ConnData.RemoteAddr.String(), rlyMsg.SourceAddr.Ip, rlyMsg.SourceAddr.Port)\n\t\treturn fmt.Errorf(\"%s relay source address\", reason)\n\t}\n\trealAddr := &net.UDPAddr{IP: realIP, Port: rlyMsg.SourceAddr.Port}\n\n\trelayAddrStr := ppd.ConnData.RemoteAddr.String()\n\tlog.Info(\"server-relay[HandleRelayForward] from relay %s, real client %s, inner %d bytes\",\n\t\trelayAddrStr, realAddr, len(innerBytes))\n\n\t// Allocate a pool packet for the inner bytes.\n\tinnerPkt := s.device.AllocatePoolPacket()\n\tif len(innerBytes) > len(innerPkt.Buf) {\n\t\ts.device.ReleasePoolPacket(innerPkt)\n\t\tlog.Warning(\"server-relay[HandleRelayForward] inner packet too large (%d bytes)\", len(innerBytes))\n\t\treturn fmt.Errorf(\"inner packet too large\")\n\t}\n\tcopy(innerPkt.Buf[:], innerBytes)\n\tinnerPkt.Content = innerPkt.Buf[:len(innerBytes)]\n\n\t// Run standard RecvPrecheck on the inner packet.\n\tinnerType, _, err := s.device.RecvPrecheck(innerPkt)\n\tif err != nil {\n\t\ts.device.ReleasePoolPacket(innerPkt)\n\t\tlog.Warning(\"server-relay[HandleRelayForward] inner RecvPrecheck failed: %v\", err)\n\t\treturn err\n\t}\n\tinnerPkt.HeaderType = innerType\n\tlog.Info(\"server-relay[HandleRelayForward] inner [%s] from real client %s via relay %s\",\n\t\tcore.HeaderTypeToString(innerType), realAddr, relayAddrStr)\n\n\t// Same RKN-under-overload gate as the direct-UDP path\n\t// (recvPacketRoutine), but keyed on the REAL client IP rather than the\n\t// relay's: a relay legitimately fans out many clients, so keying on","sourceCodeStart":800,"sourceCodeEnd":836,"githubUrl":"https://github.com/OpenNHP/opennhp/blob/6e04ca5ff03222a699c24205cd4bf8fee9af7ffe/endpoints/server/msghandler.go#L800-L836","documentation":"The server allocates a pooled packet buffer for the relayed inner packet and rejects payloads larger than the fixed buffer size. This guards against oversized packets exhausting memory or breaking RecvPrecheck assumptions.","triggerScenarios":"A relay forwards innerBytes whose length exceeds len(innerPkt.Buf), i.e. larger than the device pool packet buffer capacity (typically max NHP UDP packet size).","commonSituations":"Misbehaving or buggy relay forwarding fragments/concatenated datagrams; malicious client tunnelling oversized payloads through a relay; UDP payload size changes after a protocol update.","solutions":["Check the relay is not coalescing multiple datagrams into one forward","Ensure the inner packet is a standard NHP packet within the max UDP payload size","Update relay/server to matching versions if the max packet size changed","Drop or truncate the oversized payload at the relay before forwarding"],"exampleFix":"// before: relay forwards whole datagram\n// after: guard at relay\nif len(inner) > maxPacketSize { log.Warning(\"dropping oversized inner packet\"); return }","handlingStrategy":"validation","validationCode":"if len(innerBytes) > maxPacketSize {\n    return fmt.Errorf(\"inner packet %d exceeds limit %d\", len(innerBytes), maxPacketSize)\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Keep relay forwarding one datagram per forward","Enforce the max packet size at the relay edge","Keep relay and server versions aligned"],"tags":["relay","packet-size","udp","validation"],"backgroundTag":"payload-too-large","analyzedSha":"6e04ca5ff03222a699c24205cd4bf8fee9af7ffe","analyzedAt":"2026-09-07T15:44:59.941Z","contentChangedAt":"2026-09-07T15:44:59.941Z","schemaVersion":2},"datasetVersion":"2026-09-16T04:17:20.429Z"}