Home  >  Article  >  Backend Development  >  Opening pfring from Go: pfring NewRing Error: No such device

Opening pfring from Go: pfring NewRing Error: No such device

王林
王林forward
2024-02-10 17:30:09423browse

从 Go 打开 pfring:pfring NewRing 错误:没有这样的设备

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.

Question content

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?

Workaround

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!

Statement:
This article is reproduced at:stackoverflow.com. If there is any infringement, please contact admin@php.cn delete