首页 > 其他分享 >LWIP 的ethernetif.c 学习

LWIP 的ethernetif.c 学习

时间:2022-12-08 17:38:27浏览次数:43  
标签:网卡 ethernetif LWIP struct 函数 学习 网络接口 数据包 netif


 《嵌入式网络那些事-LwIP协议深度剖析与实战演练》学习

 

ethernetif.c  netif.c 


在 LWIP 中,是通过一个叫做

结构体:
struct netif {
struct netif *next; // 指向下一个 netif 结构的指针
struct ip_addr ip_addr; // IP 地址相关配置
struct ip_addr netmask;
struct ip_addr gw;
err_t (* input)(struct pbuf *p, struct netif *inp); //调用这个函数可以从网卡上取得一个
// 数据包
err_t (* output)(struct netif *netif, struct pbuf *p, // IP 层调用这个函数可以向网卡发送
struct ip_addr *ipaddr); // 一个数据包
err_t (* linkoutput)(struct netif *netif, struct pbuf *p); // ARP 模块调用这个函数向网
// 卡发送一个数据包
void *state; // 用户可以独立发挥该指针,用于指向用户关心的网卡信息
u8_t hwaddr_len; // 硬件地址长度,对于以太网就是 MAC 地址长度,为 6 各字节
u8_t hwaddr[NETIF_MAX_HWADDR_LEN]; //MAC 地址
u16_t mtu; // 一次可以传送的最大字节数,对于以太网一般设为 1500
u8_t flags; // 网卡状态信息标志位
char name[2]; // 网络接口使用的设备驱动类型的种类
u8_t num; // 用来标示使用同种驱动类型的不同网络接口
};
next 字段是指向下一个 netif 结构的指针。我们的一个产品可能会有多个网卡芯片, LWIP 会把所有网卡芯片的结构体链成一个链表进行管理,有一个 netif_list 的全局变量指向该链表的头部。 next 字段就是用于链表用。
ip_addr、 netmask、 gw 三个字段用于发送和处理数据包用,分别表示 IP 地址、子网掩码和网关地址。前两个字段在数据包发送时有重要作用,第三个字段似乎没什么用。 IP 地址和网卡设备必须一一对应。
input 字段指向一个函数,这个函数将网卡设备接收到的数据包提交给 IP 层,使用时将input 指针指向该函数即可,后面将详细讨论这个问题。该函数的两个参数是 pbuf 类型和 netif类型的,返回参数是 err_t 类型。其中 pbuf 代表接收到的数据包。
output 字段向一个函数,这个函数和具体网络接口设备驱动密切相关,它用于 IP 层将一个数据包发送到网络接口上。用户需要根据实际网卡编写该函数,并将 output 字段指向
该函数。该函数的三个参数是 pbuf 类型、 netif 类型和 ip_addr 类型,返回参数是 err_t 类型。其中 pbuf 代表要发送的数据包。 ipaddr 代表网卡需要将该数据包发送到的地址,该地址应该是接收实际的链路层帧的主机的 IP 地址,而不一定为数据包最终需要到达的 IP 地址。例如,当要发送 IP 信息包到一个并不在ᴀ地网络里的主机上时,链路层帧会被发送到网络里的一个路由器上。在这种情况下,给 output 函数的 IP 地址将是这个路由器的地址。
linkoutput 字段和上面的 output 基ᴀ上是起相同的作用,但是这个函数是在 ARP 模块中被调用的,这里不赘述了。注意这个函数只有两个参数。实际上 output 字段函数的实现最终还是调用 linkoutput 字段函数将数据包发送出去的。
state 字段可以指向用户关心的关于设备的一些信息,用户可以自由发挥,也可以不用。
hwaddr_len 和 hwaddr[]表示 MAC 地址长度和 MAC 地址,一般 MAC 地址长度为 6。
mtu 字段表示该网络一次可以传送的最大字节数,对于以太网一般设为 1500,不多说。
flags 字段是网卡状态信息标志位,是很重要的控制字段,它包括网卡功能使能、广播
使能、 ARP 使能等等重要控制位。
name[]字段用于保存每一个网络网络接口的名字。用两个字符的名字来标识网络接口使用的设备驱动的种类,名字由设备驱动来设置并且应该反映通过网络接口表示的硬件的种类。比如蓝牙设备( bluetooth)的网络接口名字可以是 bt,而 IEEE 802.11b WLAN 设备的名字就可以是 wl,当然设置什么名字用户是可以自由发挥的,这并不影响用户对网络接口的使用。当然,如果两个网络接口具有相同的网络名字,我们就用

Ethernetif.c文件ethernetif_init中初始使用。

这是官方移植的接收函数,不过是有缺陷的。

void ethernetif_input( void * pvParameters )

{

  struct pbuf *p;

  for( ;; )

  {

    if (xSemaphoreTake( s_xSemaphore, emacBLOCK_TIME_WAITING_FOR_INPUT)==pdTRUE)

    {

      p = low_level_input( s_pxNetIf );

      if (ERR_OK != s_pxNetIf->input( p, s_pxNetIf))

      {

        pbuf_free(p);

        p=NULL;

      }

    }

  }

}  

    

标签:网卡,ethernetif,LWIP,struct,函数,学习,网络接口,数据包,netif
From: https://blog.51cto.com/u_6958388/5922943

相关文章

  • JSON学习
     作者:MiloYip1、 JSON是什么JSON(JavaScriptObjectNotation)是一个用于数据交换的文本格式,现时的标准为ECMA-404。虽然JSON源至于JavaScript语言,但它只是一种数据......
  • 自动化测试高手课-学习笔记
    课程链接github链接Job框架1自动化测试我对自动化测试架构师的定义是,不仅仅是写代码让自动化测试跑起来,而且能够超脱于工具框架的层面,对测试需求和自动化ROI一起抽......
  • 【机器学习】回归的原理学习与葡萄酒数据集的最小二乘法线性回归实例
    一,回归1.1回归分析的基本概念回归分析(regressionanalysis)指的是确定两种或两种以上变量间相互依赖的定量关系的一种统计分析方法。确定变量之间是否存在相关关系,若存......
  • LINQ学习
     varrest=frommastinmasterwheremast.level>6selectmast; //from后面设置查询的集合、where后面跟查询条件、表示mast的结果集合返回多条件:wheremast.......
  • gin源码学习-路由注册(2)
    gin框架主要是在标准库net/http的基础上对路由进行改写,本文将从net/http与gin的路由注册分享路由方面的一些理解。1.net/http的路由注册1.1路由注册首先来个demo:pack......
  • 深度学习炼丹-不平衡样本的处理
    前言一,数据层面处理方法1.1,数据扩充1.2,数据(重)采样数据采样方法总结1.3,类别平衡采样二,算法(损失函数)层面处理方法2.1,FocalLoss2.2,损失函数加权参考资料......
  • 强化学习——QLearning和Sarsa算法及其Python实现
    主要是强化学习的课程,作业中涉及到了QLearning和Sarsa算法,特此记录。宝藏博主的强化学习专栏中包含了这两个算法的讲解,极为清晰,非常推荐。链接:机器学习+深度学习+强化学......
  • Linux下学习FPGA
    声明(叠甲):鄙人水平有限,本文章仅供参考。1.环境推荐使用Ubuntu20.04这是我使用多个版本中最好用的一个,相关安装教程可以自行上网搜索这不再赘述,但要补充的一点的是......
  • junit 4学习
    JUNIT4中,有几个地方要注意一下的,归纳之1@Test(expected=ArithmeticException.class) public void3,Math.divide(9,3));      Math.di......
  • 黑马程序员3天玩转Python深度学习tensorflow(第1天)
    文章目录​​一、深度学习的介绍​​​​1.1深度学习与机器学习的区别​​​​1.1.1特征提取方面​​​​1.1.2数据量和计算性能要求​​​​1.1.3算法代表​​​​1.2......