{"record":{"id":"ec9ee1e6a065295a","repo":"AdguardTeam/AdGuardHome","slug":"interface-s-has-no-ipv6-addresses","errorCode":null,"errorMessage":"interface %s has no ipv6 addresses","messagePattern":"interface (.+?) has no ipv6 addresses","errorType":"error_code","errorClass":null,"httpStatus":null,"severity":"warning","filePath":"internal/aghnet/dhcp_unix.go","lineNumber":230,"sourceCode":"\n\t\treturn true, false, nil\n\t}\n}\n\n// checkOtherDHCPv6 sends a DHCP request to the specified network interface, and\n// waits for a response for a period defined by defaultDiscoverTime.  l must not\n// be nil.\nfunc checkOtherDHCPv6(\n\tctx context.Context,\n\tl *slog.Logger,\n\tiface *net.Interface,\n) (ok bool, err error) {\n\tifaceIPNet, err := IfaceIPAddrs(iface, IPVersion6)\n\tif err != nil {\n\t\treturn false, fmt.Errorf(\"getting ipv6 addrs for iface %s: %w\", iface.Name, err)\n\t}\n\tif len(ifaceIPNet) == 0 {\n\t\treturn false, fmt.Errorf(\"interface %s has no ipv6 addresses\", iface.Name)\n\t}\n\n\tsrcIP := ifaceIPNet[0]\n\tsrc := netutil.JoinHostPort(srcIP.String(), 546)\n\tdst := \"[ff02::1:2]:547\"\n\n\tudpAddr, err := net.ResolveUDPAddr(\"udp6\", src)\n\tif err != nil {\n\t\treturn false, fmt.Errorf(\"dhcpv6: Couldn't resolve UDP address %s: %w\", src, err)\n\t}\n\n\tif !udpAddr.IP.To16().Equal(srcIP) {\n\t\treturn false, fmt.Errorf(\"dhcpv6: Resolved UDP address is not %s: %w\", src, err)\n\t}\n\n\tdstAddr, err := net.ResolveUDPAddr(\"udp6\", dst)\n\tif err != nil {\n\t\treturn false, fmt.Errorf(\"dhcpv6: Couldn't resolve UDP address %s: %w\", dst, err)","sourceCodeStart":212,"sourceCodeEnd":248,"githubUrl":"https://github.com/AdguardTeam/AdGuardHome/blob/b41aefbe51c8dde65e2c50f093996afa0502edf9/internal/aghnet/dhcp_unix.go#L212-L248","documentation":"While parsing query-log search URL parameters, the filtering-status criterion received a value that is not in the allowed set (filteringStatusValues). Query log search accepts only specific status strings for the filtering criterion; anything else is rejected with 'invalid value <val>'.","triggerScenarios":"GET /control/querylog with a search parameter like search=filtering_status(X) where X is not one of the accepted filtering status values (e.g. all, filtered, allowed, blocked depending on the version).","commonSituations":"Client written against an older/newer API where status names changed; typos in the status value; assuming status names from filtering logs rather than query-log search vocabulary.","solutions":["Check the filteringStatusValues set in internal/querylog/http.go (or API docs) for accepted status strings","Correct the value in the search expression and retry","URL-encode the value properly if it contains special characters","Pin/align client and server versions so status names match"],"exampleFix":"// before\nGET /control/querylog?search=filtering_status(blocked_all)\n// after\nGET /control/querylog?search=filtering_status(blocked) // use an accepted value","handlingStrategy":"validation","validationCode":"// Validate against known statuses before querying\nvar okStatuses = map[string]bool{\"all\": true, \"filtered\": true, \"allowed\": true, \"blocked\": true}\nif !okStatuses[val] { return fmt.Errorf(\"bad status %q\", val) }","typeGuard":"func isValidFilteringStatus(v string) bool {\n    return filteringStatusValues[v] // mirror server set\n}","tryCatchPattern":"if resp.StatusCode == 400 && strings.Contains(body, \"invalid value\") {\n    // drop the bad criterion and retry with accepted statuses\n}","preventionTips":["Fetch accepted enum values from API docs at build time","Pin client and server versions","Centralize search-expression builders in one helper"],"tags":["querylog","search","http","validation","go"],"backgroundTag":"enum-validation-failed","analyzedSha":"b41aefbe51c8dde65e2c50f093996afa0502edf9","analyzedAt":"2026-08-27T04:57:55.097Z","schemaVersion":2},"datasetVersion":"2026-08-27T08:17:20.692Z"}