{"record":{"id":"8d12fe421679c64d","repo":"netbirdio/netbird","slug":"destroy-s-interface-w","errorCode":null,"errorMessage":"destroy %s interface: %w","messagePattern":"destroy (.+?) interface: %w","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"client/iface/freebsd/link.go","lineNumber":173,"sourceCode":"\tinterfaceName, err := parseIFName(output)\n\tif err != nil {\n\t\treturn \"\", fmt.Errorf(\"parse new name: %w\", err)\n\t}\n\n\treturn interfaceName, nil\n}\n\nfunc (l *Link) del(name string) error {\n\tvar stderr bytes.Buffer\n\n\tcmd := exec.Command(\"ifconfig\", name, \"destroy\")\n\tcmd.Stderr = &stderr\n\n\terr := cmd.Run()\n\tif err != nil {\n\t\tlog.Debugf(\"ifconfig out: %s\", stderr.String())\n\n\t\treturn fmt.Errorf(\"destroy %s interface: %w\", name, err)\n\t}\n\n\treturn nil\n}\n\nfunc (l *Link) setMTU(mtu int) error {\n\tvar stderr bytes.Buffer\n\n\tcmd := exec.Command(\"ifconfig\", l.name, \"mtu\", strconv.Itoa(mtu))\n\tcmd.Stderr = &stderr\n\n\tif err := cmd.Run(); err != nil {\n\t\tlog.Debugf(\"ifconfig out: %s\", stderr.String())\n\n\t\treturn fmt.Errorf(\"set interface mtu: %w\", err)\n\t}\n\n\treturn nil","sourceCodeStart":155,"sourceCodeEnd":191,"githubUrl":"https://github.com/netbirdio/netbird/blob/93e97f4bf1ad715072dcb3fb6cdb1763431b5a9c/client/iface/freebsd/link.go#L155-L191","documentation":"del() destroys the interface with `ifconfig <name> destroy` and wraps a non-zero exit; ifconfig's stderr is logged at debug level. Common causes: the interface no longer exists (already destroyed by a concurrent path), the interface is busy (routes, addresses, or member-of-bridge references), or insufficient privilege.","triggerScenarios":"Link.Del()/Recreate() when the interface vanished concurrently (double teardown), when addresses or routes still reference it, or when the agent runs unprivileged.","commonSituations":"Running netbird down twice; a second agent instance already destroyed it; leftover routes keeping the kernel from releasing the interface; jail without interface rights.","solutions":["Treat a missing interface as success: verify with `ifconfig <name>` first and skip destroy if absent","Flush addresses/routes on the interface before destroy","Ensure a single agent instance owns the interface","Run `sudo ifconfig <name> destroy` by hand to see the exact kernel refusal"],"exampleFix":"// before\nif err := l.del(name); err != nil {\n    return err\n}\n\n// after: idempotent teardown\nif _, err := net.InterfaceByName(name); err != nil {\n    return nil // already gone\n}\nif err := l.del(name); err != nil {\n    return err\n}","handlingStrategy":"try-catch","validationCode":"if _, err := net.InterfaceByName(name); err != nil {\n    return nil // interface already gone, nothing to destroy\n}","typeGuard":null,"tryCatchPattern":"if err := link.Del(); err != nil {\n    if _, lerr := net.InterfaceByName(name); lerr != nil {\n        return nil // gone: treat as success\n    }\n    return err\n}","preventionTips":["Make teardown idempotent: a missing interface is success","Prevent concurrent agents from managing the same interface (single-instance lock)","Run netbird down before manually touching the interface"],"tags":["go","freebsd","ifconfig","destroy","teardown"],"backgroundTag":null,"analyzedSha":"93e97f4bf1ad715072dcb3fb6cdb1763431b5a9c","analyzedAt":"2026-08-16T03:09:19.136Z","schemaVersion":2},"datasetVersion":"2026-08-16T08:17:34.114Z"}