当前位置:网站首页>数据包传输:应用层-内核-硬件
数据包传输:应用层-内核-硬件
2022-07-27 10:53:00 【对我好两点】
以下,整理出了 ping request 报文,从应用层,经内核,到达硬件,的 data path。
1. 应用层
// 应用层
busybox/ping.c
== ping_main()
== common_ping_main()
== ping()
== create_icmp_socket()
== socket(AF_INET, SOCK_RAW, 1);
== ping4()
== sendping4()
== sendping_tail()
== xsendto()
== sendto() // 系统调用
2. 内核
2.1 内核-网络
// (1)内核-网络
// net/socket.c
== __sys_sendto() // sendto() 在内核的系统调用服务程序为 __sys_sendto()
== sock_sendmsg()
== sock_sendmsg_nosec()
== raw_sendmsg() // sock->ops->sendmsg,应用层使用 SOCK_RAW 创建 socket,故 sock->ops->sendmsg 指向 raw_sendmsg()
// net/ipv4/ip_output.c
== ip_push_pending_frames()
== ip_send_skb()
== ip_local_out()
== __ip_local_out() // 经过 NF 的 LOCAL_OUT 钩子点
== dst_output()
== ip_output() // skb_dst(skb)->output
== ip_finish_output()
== __ip_finish_output()
== ip_finish_output2()
// net/core/neighbour.c/h
== neigh_output()
== neigh_resolve_output()
// net/core/dev.c
== dev_queue_xmit()
== __dev_queue_xmit()
== dev_hard_start_xmit()
== xmit_one()
// include/linux/netdevice.h
== netdev_start_xmit()
== __netdev_start_xmit()
== ops->ndo_start_xmit(skb, dev); // 送入驱动
== dev_open(struct net_device *dev);
== __dev_open();
== ops->ndo_open(dev);
== eth_open(struct net_device *net);
== eth_start(struct eth_dev *dev, gfp_t gfp_flags);
== rx_fill(struct eth_dev *dev, gfp_t gfp_flags);
== rx_submit(struct eth_dev *dev, struct usb_request *req, gfp_t gfp_flags);
req->complete = rx_complete;
== rx_complete(struct usb_ep *ep, struct usb_request *req);
== dev->unwrap(dev->port_usb, skb, &dev->rx_frames);
== eem_unwrap();
2.2 内核-驱动
// (2)内核-驱动
// drivers/net/usb/lan78xx.c
== lan78xx_start_xmit() // .ndo_start_xmit = lan78xx_start_xmit
== skb_queue_tail() // 插入队列
== tasklet_schedule(&dev->bh); // 触发任务调度 lan78xx_bh
== lan78xx_bh()
== lan78xx_tx_bh()
== skb_dequeue() // 取出数据
== usb_fill_bulk_urb() // 填充数据到 USB
// drivers/usb/core
== usb_submit_urb() // USB 发送数据
对于usb gadget 模式下,使用 function eem 的网卡驱动:
// \drivers\usb\gadget\function\u_ether.c // .ndo_start_xmit = eth_start_xmit,
== eth_start_xmit(struct sk_buff *skb, struct net_device *net)
== usb_ep_queue(struct usb_ep *ep, struct usb_request *req, gfp_t gfp_flags) // 插入队列
== ret = ep->ops->queue(ep, req, gfp_flags);
== dwc3_gadget_ep_queue();
== __dwc3_gadget_ep_queue();
== __dwc3_gadget_kick_transfer();
== dwc3_prepare_trbs();
== dwc3_send_gadget_ep_cmd(); trace_dwc3_gadget_ep_cmd(dep, cmd, params, cmd_status);
== dwc3_writel(dep->regs, DWC3_DEPCMDPAR0, params->param0);
3. 硬件
// 硬件
== usb_submit_urb(cmdinfo->cmd_urb, GFP_ATOMIC);
== usb_hcd_submit_urb(struct urb *urb, gfp_t mem_flags)
hcd->driver->urb_enqueue(hcd, urb, mem_flags);
== xhci_urb_enqueue(); trace_xhci_urb_enqueue(urb);
== xhci_queue_bulk_tx(); //批量传输
== prepare_transfer();
== usb_hcd_link_urb_to_ep() //add an URB to its endpoint queue
== list_add_tail(&urb->urb_list, &urb->ep->urb_list);
== queue_trb() trace_xhci_queue_trb(ring, trb); //queueing a TRB on a ring
== inc_enq() trace_xhci_inc_enq(ring);
== giveback_first_trb() //Pass all the TRBs to the hardware at once and make sure this write isn't reordered.
== xhci_ring_ep_doorbell() trace_xhci_ring_ep_doorbell(slot_id, DB_VALUE(ep_index, stream_id));
== writel(DB_VALUE(ep_index, stream_id), db_addr);
边栏推荐
- Raw socket grabs packets, and packets on some ports cannot be caught
- 第10章 枚举类与注解
- Everything cannot be searched for startup_ Lpc11x.s file
- C programming language (2nd Edition) -- Reading Notes -- 1.5.2
- 最长上升子序列模型 AcWing 1017. 怪盗基德的滑翔翼
- Error while unzipping file in win10: unable to create symbolic link. You may need to run WinRAR with administrator privileges. The client does not have the required privileges
- 背包问题 AcWing 9. 分组背包问题
- C programming language (2nd Edition) -- Reading Notes -- 1.5.4
- Modelarts image classification and object detection
- Caused by:org.gradle.api.internal. plugins . PluginApplicationException: Failed to apply plugin
猜你喜欢

数字三角形模型 AcWing 1027. 方格取数

Inclusion exclusion principle acwing 890. divisible numbers

背包模型 AcWing 423. 采药

Properties file

最长上升子序列模型 AcWing 272. 最长公共上升子序列

A deep analysis of the soul of C language -- pointer

Gaussian elimination acwing 884. Gaussian elimination for solving XOR linear equations

力扣——10. 正则表达式匹配

博弈论 AcWing 891. Nim游戏

Analysis of distributed database and cache double write consistency scheme (Reprint)
随机推荐
Vscode establishes automatic search of header files under non engineering directories
为什么选择智能电视?
Instructions for mock platform
什么是私域流量?
C programming language (2nd Edition) -- Reading Notes -- 1.5.2
博弈论 AcWing 892. 台阶-Nim游戏
Modelarts image classification and object detection
A deep analysis of the soul of C language -- pointer
Remember not to copy your group work, students. Fortunately, you only passed two questions. Don't have an accident
(4) Operator
2022 Niuke multi school (3) j.journey
ACM warm-up Exercise 1 in 2022 summer vacation (summary)
Knapsack model acwing 1024. Packing problem
Longest ascending subsequence model acwing 1010. Interceptor missile
The C programming language (2nd) -- Notes -- 1.9
ethereum rpc
背包模型 AcWing 1024. 装箱问题
Maker Hongmeng application development training notes 02
Remember an experience of using canvas to make the banner streamer effect of Tencent cloud homepage
状态压缩DP AcWing 91. 最短Hamilton路径