__u8 meta_len; // 元数据长度__u8 nr_frags; // 分片数量__u8 tx_flags; // 传输标志unsigned short gso_size; // 大分组分片(GSO)大小unsigned short gso_segs; // GSO 分段数struct sk_buff *frag_list; // 分片列表指针struct skb_shared_hwtstamps hwtstamps; // 硬件时间戳信息unsigned int...
int netif_receive_skb(struct sk_buff *skb) { net_timestamp_check(netdev_tstamp_prequeue, skb); if (skb_defer_rx_timestamp(skb)) return NET_RX_SUCCESS; #ifdef CONFIG_RPS if (static_key_false(&rps_needed)) { struct rps_dev_flow voidflow, *rflow = &voidflow; int cpu, ret; rcu_...
at skb->end. */ struct skb_shared_info { unsigned short nr_frags; unsigned short gso_size; /* Warning: this field is not always filled in (UFO)! */ unsigned short gso_segs; unsigned short gso_type; __be32 ip6_frag_id; __u8 tx_flags; struct sk_buff *frag_list; struct skb_...
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; intcpu, ret; rcu_read_lock; /...
*/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_...
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); ...
__skb_tstamp_tx(skb,NULL, skb->sk, SCM_TSTAMP_SCHED);/* Disable soft irqs for various locks below. Also * stops preemption for RCU. */rcu_read_lock_bh(); skb_update_prio(skb);/* If device/qdisc don't need skb->dst, release it right now while ...
ktime_t tstamp;#elseunion { ktime_t tstamp;structskb_mstamp skb_mstamp; };#endifstructsock *sk;structnet_device *dev;/** This is the control buffer. It is free to use for every * layer. Please put your private variables there. If you ...
数据包先统一经过一个安装在 clsact Qdisc 出口方向上的 eBPF filter。这个 eBPF filter 程序包含着主要的限速逻辑;它会根据某一个数据包所属流量类别的带宽来计算这个数据包的预计发送时间,并给它盖一个时间戳 (skb->tstamp); 随后,数据包被分发到设备的各个硬件队列,且每个硬件队列都有一个自己的 fq Qdisc; ...
bool(*rxtstamp)(struct phy_device *dev, struct sk_buff *skb,inttype); void(*txtstamp)(struct phy_device *dev, struct sk_buff *skb,inttype); int(*set_wol)(struct phy_device *dev, struct ethtool_wolinfo *wol); void(*get_wol)(struct phy_device *dev, struct ethtool_wolinfo *wol...