以太网LWip_初始化过程
其他
2018-07-27 12:09:50
阅读次数: 0
首先应该看下源码包中的doc/rawapi.txt,这篇文档中介绍了初始化流程。
初始化过程的前半部分主要针对lwip的内存管理和各个协议层,在src/core/init.c中有一个lwip_init()函数已经为我们做好了,直接调用即可;
初始化过程的后半部分初始化网络接口,依次调用以下函数:
netif_add(如果有多个接口则需多次调用)
netif_set_default
netif_set_up
dhcp_start
调用netif_add函数时我们需要提供一个init函数指针,这个指针指向我们自己的硬件接口初始化函数,一般来说就是ethernetif.c中的ethernetif_init()。
static struct netif enc28j60; (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_set_default(&enc28j60); (7) 调用 netif_set_default 函数初始化缺省网络接口,默认网络接口
netif_set_up(&enc28j60); (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数据包进行上传,传到上层进行处理
{ //针作为参数传入
struct eth_hdr *ethhdr;
struct pbuf *p;
struct netif *netif = (struct netif *)arg;
while (1)
{
if (p == NULL) // 如果数据包为空,
continue; // 则循环结束,启动下次接收过程
ethhdr = p->payload; // 取得数据包内数据
switch (htons(ethhdr->type)) // 判断数据包类型 注意大小端
{ // 只对 IP 数据包和 ARP 数据包进行处理
case ETHTYPE_IP: // IP 数据包
case ETHTYPE_ARP: // ARP 数据包
{
pbuf_free(p);
p = NULL;
}
break;
default:
pbuf_free(p);
p = NULL;
break;
} //switch
} //while
首先应该看下源码包中的doc/rawapi.txt,这篇文档中介绍了初始化流程。
初始化过程的前半部分主要针对lwip的内存管理和各个协议层,在src/core/init.c中有一个lwip_init()函数已经为我们做好了,直接调用即可;
初始化过程的后半部分初始化网络接口,依次调用以下函数:
netif_add(如果有多个接口则需多次调用)
netif_set_default
netif_set_up
dhcp_start
调用netif_add函数时我们需要提供一个init函数指针,这个指针指向我们自己的硬件接口初始化函数,一般来说就是ethernetif.c中的ethernetif_init()。
static struct netif enc28j60; (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_set_default(&enc28j60); (7) 调用 netif_set_default 函数初始化缺省网络接口,默认网络接口
netif_set_up(&enc28j60); (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数据包进行上传,传到上层进行处理
{ //针作为参数传入
struct eth_hdr *ethhdr;
struct pbuf *p;
struct netif *netif = (struct netif *)arg;
while (1)
{
if (p == NULL) // 如果数据包为空,
continue; // 则循环结束,启动下次接收过程
ethhdr = p->payload; // 取得数据包内数据
switch (htons(ethhdr->type)) // 判断数据包类型 注意大小端
{ // 只对 IP 数据包和 ARP 数据包进行处理
case ETHTYPE_IP: // IP 数据包
case ETHTYPE_ARP: // ARP 数据包
{
pbuf_free(p);
p = NULL;
}
break;
default:
pbuf_free(p);
p = NULL;
break;
} //switch
} //while
转载自blog.csdn.net/zhipao6108/article/details/81232902