Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我的Linux内核和NIC驱动程序是否支持NIC RX时间戳?_C_Sockets_Linux Kernel_Timestamp_Network Programming - Fatal编程技术网

我的Linux内核和NIC驱动程序是否支持NIC RX时间戳?

我的Linux内核和NIC驱动程序是否支持NIC RX时间戳?,c,sockets,linux-kernel,timestamp,network-programming,C,Sockets,Linux Kernel,Timestamp,Network Programming,我想得到NIC RX时间戳。此示例显示了如何获取它们: 它包含以下函数。运行时,我得到一个错误消息输出 static void do_ioctl(struct configuration* cfg, int sock) { #ifdef SIOCSHWTSTAMP struct ifreq ifr; struct hwtstamp_config hwc; #endif if( cfg->cfg_ioctl == NULL ) return; #ifdef SIOC

我想得到NIC RX时间戳。此示例显示了如何获取它们:

它包含以下函数。运行时,我得到一个错误消息输出

static void do_ioctl(struct configuration* cfg, int sock)
{
#ifdef SIOCSHWTSTAMP
  struct ifreq ifr;
  struct hwtstamp_config hwc;
#endif

  if( cfg->cfg_ioctl == NULL )
    return;

#ifdef SIOCSHWTSTAMP
  bzero(&ifr, sizeof(ifr));
  snprintf(ifr.ifr_name, sizeof(ifr.ifr_name), "%s", cfg->cfg_ioctl);

  /* Standard kernel ioctl options */
  hwc.flags = 0;
  hwc.tx_type = 0;
  hwc.rx_filter = HWTSTAMP_FILTER_ALL;

  ifr.ifr_data = (char*)&hwc;

  TRY( ioctl(sock, SIOCSHWTSTAMP, &ifr) );
  return;
#else
  (void) sock;
  printf("SIOCHWTSTAMP ioctl not supported on this kernel.\n");     // I get this output
  exit(-ENOTSUP);
  return;
#endif
}
但是,当我运行代码时,我得到:

此内核不支持SIOCHWTSTAMP ioctl

“内核”是指NIC驱动程序还是操作系统内核

我将很快改用Solarflare NIC,我不确定这是否能解决问题,或者问题是否出在我的Linux内核上


如果我破解它并自己定义SIOCHWTSTAMP,我会遇到编译错误,无法识别
struct ifreq
struct hwtstamp\u config

,很明显,您会遇到此错误,因为编译并运行了特定的代码分支(没有定义
SIOCHWTSTAMP
)。我怀疑这不是代码中编译依赖于该定义的唯一地方(不是唯一的源文件)。除非您使用早期的内核版本来编译它,否则您应该在内核源代码中定义它。可能是查找并包含正确的头文件的问题。@Aleksey您是否知道链接中的哪个头文件与此包含文件相关?netdb.h、sys/types.h、sys/socket.h、sys/ioctl.h、net/if.hk知道您的内核版本和环境/分发版本会有所帮助。看起来问题中的文件是内核2.6.30中的
。它是从内核3.7开始的。这个头文件包含在
中,在我手边的一个高度后端口的内核3.10中(注意区别:
linux/
与您的示例中的
sys/
),也许将
sys
更改为
linux
会对您有所帮助。只要小心,只要有一个依赖于这个定义。请让我知道这是否有帮助。我只是仔细查看了你问题中链接的完整来源。这有点复杂。实际上,这取决于
NO_KERNEL\u TS_INCLUDE
的定义(或不定义),而这又取决于Makefile中明确说明的两个头文件的存在。文件不在人们认为应该在的地方。听起来很不寻常,这两个文件似乎是由我的系统上的包
linux-libc-devel
提供的。请尝试安装此软件包,看看这是否确实是解决方案。以前我认为这是一个内核代码,但事实并非如此。