我的Linux内核和NIC驱动程序是否支持NIC RX时间戳?
我想得到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
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
提供的。请尝试安装此软件包,看看这是否确实是解决方案。以前我认为这是一个内核代码,但事实并非如此。