LwIP应用笔记(二):无操作系统支持下的RAW API移植

写在前面

由于从这篇博客开始要涉及代码编写了,为此笔者自行画板搭建了一个实验平台,以后的所有代码与步骤都会在此实验平台上验证,目前所有的硬件与软件文件都在gitee上开源了,地址:https://gitee.com/water_zhang/enc28j60_arduino_shield_board。这块实验板兼容Arduino UNO R3接口,只要提供此接口的开发板都可以使用。笔者目前是将其与自己的stm32f412g_discovery开发板搭配使用,所以如果你手头也有这块开发板,项目中提供的代码可以直接编译后使用。不过编译环境估计就要费事点了,笔者使用的是arm-nono-eabi-gcc+make进行编译。

一、网络接口与网络数据包

1、网络接口结构体netif

LwIP作为一个TCP/IP协议栈的轻量级实现,其负责的范围,其实只到网络互联层,那么要怎么解决与下层(也就是数据链路层往下)的连接问题呢?为此LwIP提供了网络接口用于与下层网络进行对接。网络接口的主要实现位于netif文件夹中,LwiP对多种不同的底层网络接口提供支持, 当然这里我们重点关注的是需要移植的以太网(Ethernet)接口
LwIP支持同时添加多个网络接口,其将这些网络接口串联成一个链表以方便管理,每个链表项代表一个网络接口,由一个名叫struct netif的结构体对网络接口进行描述,由于笔者只关注以太网接口与IPv4,这里只保留了与之相关的结构体成员,如下图所示:
在这里插入图片描述

要真正理解LwIP的网络接口,我们需要理解LwIP是如何通过网络接口与底层网络进行交互的。主要来说LwIP在与底层网络交互中,它主要需要关心两件事:如何将数据包下发到底层网络以及底层网络收到的数据包如何上传给LwIP。对于以太网来说,当LwIP希望下发数据包时,其会在网络接口链表中寻找最合适的那个,通过其结构体中的output与linkoutput函数指针指向的函数将数据包发送到底层网络;当底层网络接收到数据包时,其会通过调用自己对应网络接口结构体中的input函数指针将数据包上传给LwIP处理,具体的交互流程,如下图所示:
在这里插入图片描述

2、网络数据包pbuf

不同的网络接口其收发的数据包格式可能是不一的,为了统一数据包格式,LwIP要求所有接收的数据包均需要封装于pbuf结构中,同时交付给底层网络接口的报文数据也是封装于pbuf结构中。除了收发的数据外,pbuf结构体中还包含很多其他成员变量,用于指示数据包的一些信息。下图说明了pbuf结构体中各个成员的作用,为了方便对照,笔者翻译了中文注释同时保留了英文注释。
在这里插入图片描述pbuf的结构体中包括了指向同样数据类型的next指针,说明有时一个数据包可能是存储在多个pbuf组成的链表里的,之所以要这样,是考虑到有时数据包的数据在内存中可能并不是处于连续地址上的(比如由于没有足够大的完整的内存空间,动态内存分配时使用两块不连续的内存空间存储一个数据包;也可能由于IP协议的分片机制,一个大数据包被切割成多个小数据包交付到协议栈,这时需要先存在pbuf链表中,等所有数据接收完成后再排序拼接)。同时payload这个指针指向实际的数据空间,这个空间LwIP在分配pbuf时可以一同分配,这时payload指向的空间在内存中紧跟着pbuf,当然其也可以指向任何可以访问的地址的其他数据,这些数据可能在RAM中,也可能在ROM中,甚至有可能在可寻址的外部SPI FLASH中。根据payload指向的数据所在的位置不同,pbuf被分为不同的类型,由其成员变量type_internal指示,pbuf_type这个枚举类用于枚举不同的pbuf类型,如下图所示:
在这里插入图片描述

可以看出,LwIP在设计p

评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值