在Linux内核中的时间戳错误?(timestamp error in linux kernel?)

2019-10-19 19:59发布

int netif_rx(struct sk_buff *skb) 
{
if(skb -> stamp.tv_sec ==0)
do_gettimeofday(&skb->stamp);
}

上述API是接收机侧的API,其从发送者接收到的数据。 我想计算T他的时候接收到的数据并将其存储在缓冲区中。 在行数2993以上API是在内核源代码可供选择:/linux/net/core/dev.c但我得到错误:如结构sk_buff中有没有名为印件。

http://lxr.free-electrons.com/source/include/linux/skbuff.h可能有人请帮我:如何获得linux内核的时间戳。

后来我改变了我的代码:

 int netif_rx(struct sk_buff *skb) 
    {
    if(skb -> tstamp.off_sec ==0)
    do_gettimeofday(&skb->tstamp);
    }

1: http://www.fsl.cs.sunysb.edu/kernel-api/re498.html


2: https://github.com/embest-tech/platform_prebuilt/blob/master/ndk/android-ndk-r7/platforms/android-4/arch-x86/usr/include/linux/skbuff.h

-------------------------检查这在行81 -------------------- --------------------------

现在我得到的错误是:ktime_t没有名为“tv_sec” memeber。 timeval结构,但参数的类型UNIO ktime_t的。

Answer 1:

sk_buff->tstamp是可变ktime_t类型。 do_gettimeofday设定时间的可变struct timeval 。 在这里,您有不同的类型,所以你需要一个转换。 一个简单的一个是:

int netif_rx(struct sk_buff *skb) 
{
    if(skb -> tstamp.off_sec ==0)
    {
        struct timespec now;
        getnstimeofday(&now);
        skb->tstamp = timespec_to_ktime(now);
    }
}

编辑:如果你只是想时间戳套接字缓冲区可以调用__net_timestamp

int netif_rx(struct sk_buff *skb) 
{
    __net_timestamp(skb);
}

或者,如果你不能叫__net_timestamp你可以通过你的手去做:

int netif_rx(struct sk_buff *skb) 
{
    skb->tstamp = ktime_get_real();
}


Answer 2:

你可以这样来做

your_function(struct sk_buff *skb)
{
    struct timeval tv;

    do_gettimeofday(&tv);
    skb->tstamp = timeval_to_ktime(tv);
}

看看这个代码 mwifiex_hard_start_xmit功能

在大多数的情况下,一个侧面说明,你不需要提供自己的执行netif_rx



文章来源: timestamp error in linux kernel?