物联网LWIP网络开发 TCP/IP设计原理12.2 lwIP核心业务逻辑

lwIP核心业务逻辑

核心业务流程

在这里插入图片描述

tcpip_msg(消息类型)

//枚举类型   有多少种类的消息  一共7种
enum tcpip_msg_type {
  TCPIP_MSG_API,//当我们用户调用应用层的接口时,就属于API消息类型
  TCPIP_MSG_API_CALL,//有些应用层API接口需要回传信息,比如说connect接口,回传(信号量)
  TCPIP_MSG_INPKT,//网络数据包消息---实际就是网卡上来数据了
  TCPIP_MSG_TIMEOUT,//创建超时定时器
  TCPIP_MSG_UNTIMEOUT,//删除超时定时器
  TCPIP_MSG_CALLBACK,//回调函数消息  ---  动态生成
  TCPIP_MSG_CALLBACK_STATIC	//回调函数消息 --- 静态生成
};
//消息内容 结构体封装
struct tcpip_msg {
  //消息类型
  enum tcpip_msg_type type;
  //消息内容
  union {
    struct {
      //回调函数
      tcpip_callback_fn function;
      //消息内容
      void* msg;
    } api_msg;
    struct {
      //回调函数
      tcpip_api_call_fn function;
      //函数参数
      struct tcpip_api_call_data *arg;
      //信号量
      sys_sem_t *sem;
    } api_call;
    struct {
      //pbuf数据包
      struct pbuf *p;
      //对应的网卡接口
      struct netif *netif;
      //网卡数据接收处理函数
      netif_input_fn input_fn;
    } inp;
    struct {
      //回调函数
      tcpip_callback_fn function;
      //回调函数参数
      void *ctx;
    } cb;
    struct {
      //超时时间
      u32_t msecs;
      //超时回调函数
      sys_timeout_handler h;
      //超时回调函数参数
      void *arg;
    } tmo;
  } msg;
};

tcpip_thread


static void tcpip_thread(void *arg)
{
  struct tcpip_msg *msg;
  LWIP_UNUSED_ARG(arg);
  //初始化完成后,需要执行的代码
  if (tcpip_init_done != NULL) {
    tcpip_init_done(tcpip_init_done_arg);
  }

  while (1) {                          /* MAIN Loop */
    /* wait for a message, timeouts are processed while waiting */
    //调用sys_timeouts_mbox_fetch
    TCPIP_MBOX_FETCH(&mbox, (void **)&msg);
    //判断消息是否正确,如果错误,继续等待消息邮箱
    if (msg == NULL) {
      LWIP_DEBUGF(TCPIP_DEBUG, ("tcpip_thread: invalid message: NULL\n"));
      LWIP_ASSERT("tcpip_thread: invalid message", 0);
      continue;
    }
    //根据消息类型进行遍历处理
    switch (msg->type) {
    case TCPIP_MSG_API:
      LWIP_DEBUGF(TCPIP_DEBUG, ("tcpip_thread: API message %p\n", (void *)msg));
      //根据API消息内容,进行消息解析处理
      msg->msg.api_msg.function(msg->msg.api_msg.msg);
      break;
    case TCPIP_MSG_API_CALL:
      LWIP_DEBUGF(TCPIP_DEBUG, ("tcpip_thread: API CALL message %p\n", (void *)msg));
      //传入API-CALL参数,并进行回调处理,同时读取返回值
      msg->msg.api_call.arg->err = msg->msg.api_call.function(msg->msg.api_call.arg);
      //释放信号量,让其他等待信号量的任务继续执行
      sys_sem_signal(msg->msg.api_call.sem);
      break;
    case TCPIP_MSG_INPKT:
      LWIP_DEBUGF(TCPIP_DEBUG, ("tcpip_thread: PACKET %p\n", (void *)msg));
      //传入pbuf netif 进行网络数据包处理(tcpip_input)
      msg->msg.inp.input_fn(msg->msg.inp.p, msg->msg.inp.netif);
      //消息处理完毕,释放消息占用的内存(内存池里)
      memp_free(MEMP_TCPIP_MSG_INPKT, msg);
      break;

    case TCPIP_MSG_TIMEOUT:
      LWIP_DEBUGF(TCPIP_DEBUG, ("tcpip_thread: TIMEOUT %p\n", (void *)msg));
      //创建超时定时器
      sys_timeout(msg->msg.tmo.msecs, msg->msg.tmo.h, msg->msg.tmo.arg);
      //释放消息内存
      memp_free(MEMP_TCPIP_MSG_API, msg);
      break;
    case TCPIP_MSG_UNTIMEOUT:
      LWIP_DEBUGF(TCPIP_DEBUG, ("tcpip_thread: UNTIMEOUT %p\n", (void *)msg));
      //删除超时定时器
      sys_untimeout(msg->msg.tmo.h, msg->msg.tmo.arg);
      //释放消息内存
      memp_free(MEMP_TCPIP_MSG_API, msg);
      break;
    case TCPIP_MSG_CALLBACK:
      LWIP_DEBUGF(TCPIP_DEBUG, ("tcpip_thread: CALLBACK %p\n", (void *)msg));
      //回调函数处理
      msg->msg.cb.function(msg->msg.cb.ctx);
      //释放内存
      memp_free(MEMP_TCPIP_MSG_API, msg);
      break;

    case TCPIP_MSG_CALLBACK_STATIC:
      LWIP_DEBUGF(TCPIP_DEBUG, ("tcpip_thread: CALLBACK_STATIC %p\n", (void *)msg));
      //回调函数处理
      msg->msg.cb.function(msg->msg.cb.ctx);
      break;

    default:
      LWIP_DEBUGF(TCPIP_DEBUG, ("tcpip_thread: invalid message: %d\n", msg->type));
      LWIP_ASSERT("tcpip_thread: invalid message", 0);
      break;
    }
  }
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值