When doing network programming, we often encounter some errors and exceptions. Among them, the "pfring NewRing error: No such device" problem that occurs when opening the pfring library from the Go language is a common error that plagues developers. PHP editor Zimo will analyze the reasons and solutions for this error and help you solve this problem smoothly.
I want to use the github.com/google/gopacket/pfring
package to call pf_ring from go code, but can't make it run on debian 11 ( My code runs on debian 10).
This is my go code:
package main import ( "github.com/google/gopacket/pfring" "log" ) func main() { _, err := pfring.newring("eno1@0", 1574, pfring.flagpromisc|pfring.flag(1<<14)) if err == nil { log.printf("success!") return } log.fatalf("failure: %s", err) }
When I run it:
# ./test-go 2023/01/24 10:12:25 failure: pfring newring error: no such device
Obviously the eno1 interface exists:
# pf_ringcfg --list-interfaces name: eno1 driver: i40e rss: 12 [supported by zc] name: enp3s0f1 driver: i40e rss: 12 [supported by zc] name: enx0a229512eeb9 driver: cdc_ether rss: 1 [linux driver]
The weird thing is that the same code written in c also works:
#include <errno.h> #include <string.h> #include <stdio.h> #include <pfring.h> int main() { pfring* ring = pfring_open("eno1@0", 1574, pf_ring_promisc | pf_ring_zc_not_reprogram_rss); if (ring != null) { printf("success!\n"); exit(0); } int e = errno; char* msg = strerror(e); printf("failure %d: %s\n", e, msg); exit(1); }
# ./test-c Success!
Any ideas?
Turns out this is a bug in gopacket/pfring, see Issue #147 and Fixes. The library's call to pfring_open
reported no error, but the library misinterpreted the return code.
The above is the detailed content of Opening pfring from Go: pfring NewRing Error: No such device. For more information, please follow other related articles on the PHP Chinese website!