lwIP入门 - 初始化与启动流程

lwIP入门 - 初始化与启动流程

1. 初始化

Snipaste 2025 12 23 10 08 07
  1. 系统初始化

    c
    // 初始化内存池和堆内存
    lwip_init();
    // → mem_init()         // 内存堆初始化
    // → memp_init()        // 内存池初始化
    // → pbuf_init()
    // → netif_init()       // 网络接口初始化
    // → ip_init()          // IP协议初始化
    // → etharp_init()      // ARP协议初始化
    // → udp_init()         // UDP初始化
    // → tcp_init()         // TCP初始化
    // → 其他协议初始化
  2. 网络接口的添加与配置

    c
    // 配置ip地址, 使用静态地址或者DHCP
    #if USE_DHCP
        ip_addr_set_zero(&ipaddr);
        ip_addr_set_zero(&netmask);
        ip_addr_set_zero(&gw);
    #else
        IP4_ADDR(&ipaddr, 192, 168, 1, 100);
        IP4_ADDR(&netmask, 255, 255, 255, 0);
        IP4_ADDR(&gw, 192, 168, 1, 1);
    #endif
    
    // @brief 添加网络接口
    // @param netif: 网络接口
    // @param ip_addr: IP地址
    // @param netmask: 子网掩码
    // @param gateway: 网关
    // @param ethernetif_init 硬件初始化
    // @param ethernet_input 网络输入
    netif_add(netif, ip_addr, netmask, gateway, NULL, &ethernetif_init, &ethernet_input);
    
    // 设置默认网络接口
    netif_set_default(netif);
    
    // 设置网络接口为UP状态
    netif_set_up(netif);
    
    // 启动DHCP或者其他的一些服务
    #if USE_DHCP
        dhcp_start(netif);
    #endif
  3. 回调函数注册

    c
    // 注册回调函数
    netif_set_link_callback(netif, callback);
    netif_set_status_callback(netif, callback);

2. 网络接口结构netif

每一个netif结构体是对一个网卡进行抽象,包含了该网卡的收发函数、状态等信息。

c
struct netif {
    struct netif *next;                  // 指向下一个netif结构的指针
    ip_addr_t ip_addr;                   // IP地址
    ip_addr_t netmask;                   // 子网掩码
    ip_addr_t gw;                        // 网关地址
    netif_input_fn input;                // 向IP层输入数据包
    netif_output_fn output;              // 发送IP包
    netif_linkoutput_fn linkoutput;      // 实现底层数据包发送
    void *state;                         // 用户可以自由设置,例如用于指向一些底层设备相关的信息
    void* client_data[LWIP_NETIF_CLIENT_DATA_INDEX_MAX +
    LWIP_NUM_NETIF_CLIENT_DATA];         // 客户端数据
    u16_t mtu;                           // 该接口允许的最大数据包长度
    u8_t hwaddr_len;                     // 该接口物理地址长度
    u8_t hwaddr[NETIF_MAX_HWADDR_LEN];   // 该接口的物理地址
    u8_t flags;                          // 该接口的状态、属性字段
    char name[2];                        // 该接口的名字
    u8_t num;                            // 接口的编号
    u8_t rs_count;                       // 需要发送的路由器请求消息的数量
};

lwIP入门 - 初始化与启动流程
https://simonkimi.githubio.io/2025/12/22/lwIP入门-初始化与启动流程/
作者
simonkimi
发布于
2025年12月22日
许可协议