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

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

1. 初始化

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

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    // 初始化内存池和堆内存
    lwip_init();
    // → mem_init() // 内存堆初始化
    // → memp_init() // 内存池初始化
    // → pbuf_init()
    // → netif_init() // 网络接口初始化
    // → ip_init() // IP协议初始化
    // → etharp_init() // ARP协议初始化
    // → udp_init() // UDP初始化
    // → tcp_init() // TCP初始化
    // → 其他协议初始化
  2. 网络接口的添加与配置

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    // 配置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. 回调函数注册

    1
    2
    3
    // 注册回调函数
    netif_set_link_callback(netif, callback);
    netif_set_status_callback(netif, callback);

2. 网络接口结构netif

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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日
许可协议