栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 系统运维 > 运维 > Linux

网卡数据到Lwip内核的传递

Linux 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

网卡数据到Lwip内核的传递

 1.首先netif_add()进行挂载网卡—网卡初始化ethernetif_init()—low_level_init()创建接收线程ethernet_input() — 等待信号量;

struct netif *netif_add(struct netif *netif, struct ip_addr *ipaddr, struct ip_addr *netmask,struct ip_addr *gw,  void *state,  err_t (* init)(struct netif *netif),  err_t (* input)(struct pbuf *p, struct netif *netif))  
init-->ethernetif_init(struct netif *netif)   //底层初始化函数,函数里实际调用low_level_init()对硬件进行设置
input-->ethernet_input(struct pbuf *p, struct netif *netif)  //处理从底层接收来的以太网帧,P指向接收到的数据包,p->payload指向以太网帧头

2.  eth 接收完数据后产生一个中断,然后释放一个信号量semaphore通知网卡接收线程去处理这些接收的数据;

当网卡收到数据后,调用数据帧接收函数进行数据帧的接收,最后通过(*input)()函数传至协议栈(netif->input封装)。

在添加网络接口时将netif->input()指向tcpip_input函数,即:网络协议栈入口为tcpip_input()函数;

tcpip_input()函数并不直接进行数据处理,通过tcpip_inpkt()函数将数据传递到tcpip_thread()函数进行处理。tcpip_inpkt()函数填充tcpip_msg结构体,发送一个邮箱消息(在tcpip_thread处进行处理);

流程:(*input)() -> tcpip_input() -> tcpip_inpkt() -> tcpip_thread()->ethernet_input()/ip_input()

3.将接收到的数据包tcpip_msg结构体传递给tcpip线程(tcpip _thread )进行输入处理 ;根据数据包类型msg->type进行处理,用于进行ethernet_input()或ip_input()的输入处理;

网络接口netif inp->flags标志位判断是否包含以太网报头;若包含以太网报头,调用ethernet_input();若不包含以太网报头,调用ip_input();

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/599722.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号