感觉应该是SW,因为CPTS没使能,没用硬件PTP;下面的软件时戳也需要重新找; skb_tstamp_tx (skbuff.c) 硬件用入参hwtstamps, 软件时戳直接此时读取时间,二者只记录一个时戳; (2)接收数据包时,记录时戳: cpsw_rx_handler -> netif_receive_skb -> net_timestamp_check -> __net_timestamp...
首先申请一个skb 结构及pkt_len+5大小的内存用于保存数据,然后将接收到的数据从网卡复制到这个skb的数据部分中。 当数据从网卡中成功接收后,调用netif_rx(skb)进一 步处理数据,将skb加入到相应的input_pkt _ queue队列中,并调用netif_ rx _ schedule()函数,会产生 一 个软中断来执行网络协议栈的例程。 下半...
int netif_receive_skb(struct sk_buff *skb) { //RPS处理逻辑,先忽略 ... return __netif_receive_skb(skb); } static int __netif_receive_skb(struct sk_buff *skb) { ... ret = __netif_receive_skb_core(skb, false); } static int __netif_receive_skb_core(struct sk_buff *skb, bool...
skb_reset_mac_header(skb);// 这里是计算了套接字头到数据的这段大小// 这里告诉cpu 这种概率不是很大,但是有可能是真的,我比较倾向是假的if(unlikely(skb_shinfo(skb)->tx_flags & SKBTX_SCHED_TSTAMP)) __skb_tstamp_tx(skb,NULL, skb->sk, SCM_TSTAMP_SCHED);/* Disable soft irqs for various...
Leave earliest departure time in skb->tstamp (skb->skb_mstamp_ns) Cleanup our debris for IP stacks memset(skb->cb, 0, max(sizeof(struct inet_skb_parm), sizeof(struct inet6_skb_parm))); err = icsk->icsk_af_ops->queue_xmit(sk, skb, &inet->cork.fl); ...
intnetif_receive_skb(struct sk_buff *skb) { net_timestamp_check(netdev_tstamp_prequeue, skb); if(skb_defer_rx_timestamp(skb)) returnNET_RX_SUCCESS; #ifdefCONFIG_RPS if(static_key_false(&rps_needed)) { structrps_dev_flowvoidflow, *rflow= &voidflow; ...
这两个域是用来连接相关的skb的(如果有分片的话,可以通过它们将分片链接到一起),sk_buff是双链表结构。 */structsk_buff*next;/*链表中的下一个skb*/structsk_buff*prev;/*链表中的上一个skb*/union{ktime_t tstamp;/*记录接受或者传输报文的时间戳*/structskb_mstampskb_mstamp;};};structrb_noderb...
*/unsigned long dev_scratch;};};struct list_head list;//指向头节点};union{struct sock*sk;//报文所属的套接字int ip_defrag_offset;};union{ktime_t tstamp;//报文时间戳u64 skb_mstamp_ns;/* earliest departure time */};__u16 transport_header;//指向传输层协议首部的起始。__u16 network_...
最后调用netif_rx(skb)做进一步处理。该函数一般定义在net/core/dev.c中。 intnetif_rx(struct sk_buff*skb){struct softnet_data*queue;unsigned long flags;/* if netpoll wants it, pretend we never saw it */if(netpoll_rx(skb))returnNET_RX_DROP;if(!skb->tstamp.tv64)net_timestamp(skb);/* ...
每一个SKB都在设备结构中标识发送报文的目的地或接收发送报文的来源地,通常每个报文使用一个SKB表示,SKB主要用于在网络驱动程序和应用程序之间传递、复制数据包。 当应用程序要发送一个数据包时,数据通过系统调用提交到内核中,系统会分配一个SKB来存储数据,然后往下层传递,在传递给网络驱动后才将其释放。 当网络设备...