LWIP 使用流程

一、Lwip首先进行内存分配:

  • Mem_init()内存栈起止地址,空闲列表初始化;
  • Memp_init()内存池初始化。

两者的详细比较会在https://blog.youkuaiyun.com/weixin_41561640/article/details/113535282,进行了详细的说明

二、内存分配完之后,进行数据包管理:

pbuf_init();

三、LWIP的初始化:

sys_sem_t sem;

tcpip_init(TcpipInitDone, &sem);

四、进行网络配置,设置IP,默认子网掩码,网关等设置:

static struct netif _netif;                  (1)  //网卡芯片

struct ip_addr ipaddr, netmask, gw;           (2) //IP地址、子网掩码、网关地址

IP4_ADDR(&gw, 192,168,0,1);              (3)  设置IP

IP4_ADDR(&ipaddr, 192,168,0,60);           (4)  设置 网关

IP4_ADDR(&netmask, 255,255,255,0);        (5)  设置子网掩码

netif_add(&_netif, &ipaddr, &netmask, &gw, NULL, ethernetif_init, ethernet_input);   (6) 添加配置

netif_set_default(&_netif);          (7)  调用 netif_set_default 函数初始化缺省网络接口,默认网络接口

netif_set_up(&_netif);              (8)使能网络接口 

 

(6)ethernetif_init 网络配置:

err_t   ethernetif_init(struct netif *netif) 

{ 

     netif->name[0] = IFNAME0;     //初始化变量 enc28j60 的 name 字段

     netif->name[1] = IFNAME1;                                         

     netif->output = etharp_output;   //IP 层发送数据包函数

     netif->linkoutput = low_level_output;    //ARP 模块发送数据包函数

     low_level_init(netif);           //底层硬件初始化函数

    return ERR_OK; 

}

//接收底层数据的函数,进行分析判断是IP数据包或者ARP数据包进行上传,传到上层进行处理



void   ethernetif_input(void *arg)    //创建该进程时,要将某个网络接口结构的 netif 结构指

{                              //针作为参数传入

     struct eth_hdr *ethhdr; 

     struct pbuf *p; 

     struct netif *netif = (struct netif *)arg;  

     while (1) 

     { 

           p = low_level_input (netif);   // 接收一个数据包

           if (p == NULL)       //  如果数据包为空,

            continue;     //  则循环结束,启动下次接收过程

            ethhdr = p->payload;    //  取得数据包内数据

      switch (htons(ethhdr->type))   //  判断数据包类型 注意大小端

      {                       //  只对 IP 数据包和 ARP 数据包进行处理

          case ETHTYPE_IP:        //   IP 数据包

          case ETHTYPE_ARP:      //   ARP 数据包

           if (netif->input(p, netif)!=ERR_OK)   //  将数据包发送到上层应用函数

          {   

             pbuf_free(p); 

             p = NULL; 

          } 

            break; 

            default: 

            pbuf_free(p); 

            p = NULL; 

            break; 

        }    //switch 

    }    //while 

}    //ethernetif_input 函数

 

图片展示了LWIP启动时序,大部分函数都是LWIP自带的,主要的移植代码是eth_init()实现初始化以太网接口,启动程序会创建2个线程:tcpip_thread负责LWIP的绝大部分工作(主要是协议栈的解析和系统运行),ethernetif_thread负责从网口接收数据包再交付给tcpip_thread线程进行处理。

LWIP启动时序

 

本文章转载自 https://my.oschina.net/u/274829/blog/270817

参考文章https://blog.youkuaiyun.com/jiangjunjie_2005/article/details/26051399#t16(建议细看)

### LwIP 协议栈工作流程与架构 LwIP 是一种轻量级 TCP/IP 协议栈,专为资源受限的嵌入式系统设计。其核心目标是在保持低内存占用的同时支持完整的 TCP/IP 功能集。以下是关于 LwIP 的工作流程及其架构的关键点: #### 1. **LwIP 架构概述** LwIP 的整体架构分为多个层次,每一层负责特定的功能模块。主要组成部分包括链路层、网络层、传输层以及应用层。 - 链路层:处理底层硬件交互,例如以太网驱动程序[^2]。 - 网络层:实现 IP 地址分配、路由选择等功能。 - 传输层:提供 TCP 和 UDP 支持,用于可靠的数据传输和无连接的服务[^3]。 - 应用层:通过 API 提供高层服务接口,允许开发者编写应用程序逻辑。 #### 2. **LwIP 工作流程** ##### (1) 初始化阶段 在启动过程中,LwIP 进行必要的初始化操作,包括创建内存池(`memp_std.h` 中定义)、配置网络接口等[^1]。 ```c #include "lwip/init.h" void lwip_init(); ``` ##### (2) 数据接收过程 当接收到数据包时,LwIP 将按照以下顺序处理: - 调用 `ethernet_input()` 函数对接收的数据帧进行初步解析。 - 根据协议类型调用对应的处理函数(如 IPv4/IPv6 处理)。 - 如果是 TCP 或 UDP 报文,则进一步传递给相应协议栈处理。 ##### (3) 数据发送过程 对于需要发送的数据,LwIP 执行以下步骤: - 创建 PBUF 缓冲区存储待发送数据。 - 填充报头信息并封装成完整的数据包。 - 调用底层驱动完成实际的物理发送。 #### 3. **典型场景下的 LwIP 流程图描述** 虽然无法直接绘制图形化表示,但可以通过文字说明构建一个清晰的概念模型: - 用户发起请求 -> 调用 LwIP 接口函数 -> 内部调度线程或任务队列 -> 分配缓冲区 -> 经过各层协议处理 -> 发送至目标地址。 - 反向路径同样适用,即从外部接收数据 -> 解析逐层向上递交给用户空间。 --- ### 示例代码片段展示如何使用 LwIP 实现基本功能 下面是一个简单的例子演示如何利用 LwIP 完成一次 HTTP 请求: ```c #include "lwip/api.h" err_t http_get(const char *url) { struct tcp_pcb *pcb; err_t err; pcb = tcp_new(); // 创建新的 TCP 控制块 if (!pcb) return ERR_MEM; err = tcp_connect(pcb, &server_ip, server_port, connect_callback); // 建立连接 if (err != ERR_OK) { tcp_close(pcb); return err; } return ERR_OK; } ``` 上述代码展示了建立 TCP 连接的过程,并指定了回调函数来管理后续事件流。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值