Linuxカーネルのタイムスタンプエラー?



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

上記の API は、送信側からデータを受信する受信側 API です。データを受信して​​バッファに格納する時間を計算したい。行番号 2993 の上記の api は、/linux/net/core/dev.c のカーネル ソース コードで利用できます。

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」という名前のメンバーがありません。 struct timeval ですが、引数は unio ktime_t 型です。


答え:


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();
}