UDP通过目的端口和目的地址做哈希,在 udp_hslot 结构中查找,而TCP是LHTABLE),关联调用udp_queue_rcv_skb,中间会判断队列是否满,是否有系统调用,最后调用sock_queue_rcv_skb把数据包送向套接字缓冲区
答案是网卡驱动中,在调用netif_receive_skb()前, skb->protocol = eth_type_trans(skb, bp->dev); 该函数对处理后skb>data跳过以太网报头,由mac_header指示以太网报头: 进入netif_receive_skb()函数 list_for_each_entry_rcu(ptype,&ptype_base[ntohs(type) & PTYPE_HASH_MASK], list) 按照协议类型依...
(sk->sk_route_caps & NETIF_F_SG); //msg里保存着用户传入一个或者多个缓冲区,而msg_data_left(msg)返回的就是缓冲区数据量的大小 while (msg_data_left(msg)) { int copy = 0; int max = size_goal; //获取发送队列中最后一个数据块,因为该数据块当前已保存数据可能还没有超过 //size_goal,所...
本篇文章在传输层以UDP协议为例子,上面指的勾子就是 udp_rcv,查找此数据包对应的socket(UDP和TCP通过skb_buff获取socket的过程是不一样的,UDP通过目的端口和目的地址做哈希,在 udp_hslot 结构中查找,而TCP是LHTABLE),关联调用 udp_queue_rcv_skb,中间会判断队列是否满,是否有系统调用,最后调用 sock_queue_rcv...
netif_receive_skb函数会根据包的协议,假如是udp包,会将包依次送到ip_rcv(),udp_rcv()协议处理函数中进行处理。 网络协议栈处理: //file: net/core/dev.c int netif_receive_skb(struct sk_buff *skb){ //RPS处理逻辑,先忽略 ... return __netif_receive_skb(skb); } static...
netif_receive_skb 函数会根据包的协议,假如是 udp 包,会将包依次送到 ip_rcv (),udp_rcv () 协议处理函数中进行处理。 图10 网络协议栈处理 //file: net/core/dev.c int netif_receive_skb(struct sk_buff *skb) //RPS 处理逻辑,先忽略
netif_receive_skb函数会根据包的协议,假如是udp包,会将包依次送到ip_rcv(),udp_rcv()协议处理函数中进行处理。 图10 网络协议栈处理 //file: net/core/dev.c int netif_receive_skb(struct sk_buff *skb){ //RPS处理逻辑,先忽略 ... 1.
0.053 net:netif_receive_skb:dev=veth79215ff skbaddr=0xffff96d481988b00 len=84) 0.060 net:netif_receive_skb_entry:dev=docker0 napi_id=0x3 queue_mapping=0 skbaddr=0xffff96d481988b00 vlan_tagged=0 vlan_proto=0x0000 vlan_tci=0x0000 protocol=0x0800 ip_summed=2 hash=0x00000000 l4_hash=...
netif_receive_skb函数会根据包的协议,假如是udp包,会将包依次送到ip_rcv(),udp_rcv()协议处理函数中进行处理。 //file: net/core/dev.cintnetif_receive_skb(struct sk_buff*skb){//RPS处理逻辑,先忽略 ...return__netif_receive_skb(skb);}staticint__netif_receive_skb(struct sk_buff*skb){...ret...
trace_netif_receive_skb_entry(skb);returnnetif_receive_skb_internal(skb); }staticintnetif_receive_skb_internal(structsk_buff *skb) {intret; ... rcu_read_lock(); #ifdef CONFIG_RPSif(static_key_false(&rps_needed)) {structrps_dev_flow voidflow, *rflow = &voidflow;//获取目的CPUintcpu...