前言
本文对lwip中TCPIP_MSG_INPKT类型消息的处理过程进行分析。
正文
在 【LwIP源码学习4】主线程tcpip_thread一文中提到。lwip主线程tcpip_thread
会先从邮箱tcpip_mbox
中取出消息,然后调用tcpip_thread_handle_msg
函数根据消息类型对消息进行处理。
static void
tcpip_thread_handle_msg(struct tcpip_msg *msg)
{
switch (msg->type) {
......
case TCPIP_MSG_INPKT:
LWIP_DEBUGF(TCPIP_DEBUG, ("tcpip_thread: PACKET %p\n", (void *)msg));
if (msg->msg.inp.input_fn(msg->msg.inp.p, msg->msg.inp.netif) != ERR_OK) {
pbuf_free(msg->msg.inp.p);
}
memp_free(MEMP_TCPIP_MSG_INPKT, msg);
break;
......
}
}
在判断到消息类型msg->type
为TCPIP_MSG_INPKT
时,会执行这个消息对应的msg->msg.inp.input_fn
函数,并传入参数msg->msg.inp.p
和msg->msg.inp.netif
。
TCPIP_MSG_INPKT
类型的消息是在tcpip_inpkt
函数中被创建的。
err_t
tcpip_inpkt(struct pbuf *p, struct netif *inp, netif_input_fn input_fn)
{
...