⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tcpip.c

📁 freescale k40/k60 freertos-lwip例程
💻 C
📖 第 1 页 / 共 2 页
字号:
      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;    default:      break;    }  }}/** * Pass a received packet to tcpip_thread for input processing * * @param p the received packet, p->payload pointing to the Ethernet header or *          to an IP header (if netif doesn't got NETIF_FLAG_ETHARP flag) * @param inp the network interface on which the packet was received */err_ttcpip_input(struct pbuf *p, struct netif *inp){  struct tcpip_msg *msg;  if (mbox != SYS_MBOX_NULL) {    msg = memp_malloc(MEMP_TCPIP_MSG_INPKT);    if (msg == NULL) {      return ERR_MEM;    }    msg->type = TCPIP_MSG_INPKT;    msg->msg.inp.p = p;    msg->msg.inp.netif = inp;    if (sys_mbox_trypost(mbox, msg) != ERR_OK) {      memp_free(MEMP_TCPIP_MSG_INPKT, msg);      return ERR_MEM;    }    return ERR_OK;  }  return ERR_VAL;}/** * Call a specific function in the thread context of * tcpip_thread for easy access synchronization. * A function called in that way may access lwIP core code * without fearing concurrent access. * * @param f the function to call * @param ctx parameter passed to f * @param block 1 to block until the request is posted, 0 to non-blocking mode * @return ERR_OK if the function was called, another err_t if not */err_ttcpip_callback_with_block(void (*f)(void *ctx), void *ctx, u8_t block){  struct tcpip_msg *msg;  if (mbox != SYS_MBOX_NULL) {    msg = memp_malloc(MEMP_TCPIP_MSG_API);    if (msg == NULL) {      return ERR_MEM;    }    msg->type = TCPIP_MSG_CALLBACK;    msg->msg.cb.f = f;    msg->msg.cb.ctx = ctx;    if (block) {      sys_mbox_post(mbox, msg);    } else {      if (sys_mbox_trypost(mbox, msg) != ERR_OK) {        memp_free(MEMP_TCPIP_MSG_API, msg);        return ERR_MEM;      }    }    return ERR_OK;  }  return ERR_VAL;}/** * call sys_timeout in tcpip_thread * * @param msec time in miliseconds for timeout * @param h function to be called on timeout * @param arg argument to pass to timeout function h * @return ERR_MEM on memory error, ERR_OK otherwise */err_ttcpip_timeout(u32_t msecs, sys_timeout_handler h, void *arg){  struct tcpip_msg *msg;  if (mbox != SYS_MBOX_NULL) {    msg = memp_malloc(MEMP_TCPIP_MSG_API);    if (msg == NULL) {      return ERR_MEM;    }    msg->type = TCPIP_MSG_TIMEOUT;    msg->msg.tmo.msecs = msecs;    msg->msg.tmo.h = h;    msg->msg.tmo.arg = arg;    sys_mbox_post(mbox, msg);    return ERR_OK;  }  return ERR_VAL;}/** * call sys_untimeout in tcpip_thread * * @param msec time in miliseconds for timeout * @param h function to be called on timeout * @param arg argument to pass to timeout function h * @return ERR_MEM on memory error, ERR_OK otherwise */err_ttcpip_untimeout(sys_timeout_handler h, void *arg){  struct tcpip_msg *msg;  if (mbox != SYS_MBOX_NULL) {    msg = memp_malloc(MEMP_TCPIP_MSG_API);    if (msg == NULL) {      return ERR_MEM;    }    msg->type = TCPIP_MSG_UNTIMEOUT;    msg->msg.tmo.h = h;    msg->msg.tmo.arg = arg;    sys_mbox_post(mbox, msg);    return ERR_OK;  }  return ERR_VAL;}#if LWIP_NETCONN/** * Call the lower part of a netconn_* function * This function is then running in the thread context * of tcpip_thread and has exclusive access to lwIP core code. * * @param apimsg a struct containing the function to call and its parameters * @return ERR_OK if the function was called, another err_t if not */err_ttcpip_apimsg(struct api_msg *apimsg){  struct tcpip_msg msg;    if (mbox != SYS_MBOX_NULL) {    msg.type = TCPIP_MSG_API;    msg.msg.apimsg = apimsg;    sys_mbox_post(mbox, &msg);    sys_arch_sem_wait(apimsg->msg.conn->op_completed, 0);    return ERR_OK;  }  return ERR_VAL;}#if LWIP_TCPIP_CORE_LOCKING/** * Call the lower part of a netconn_* function * This function has exclusive access to lwIP core code by locking it * before the function is called. * * @param apimsg a struct containing the function to call and its parameters * @return ERR_OK (only for compatibility fo tcpip_apimsg()) */err_ttcpip_apimsg_lock(struct api_msg *apimsg){  LOCK_TCPIP_CORE();  apimsg->function(&(apimsg->msg));  UNLOCK_TCPIP_CORE();  return ERR_OK;}#endif /* LWIP_TCPIP_CORE_LOCKING */#endif /* LWIP_NETCONN */#if LWIP_NETIF_API#if !LWIP_TCPIP_CORE_LOCKING/** * Much like tcpip_apimsg, but calls the lower part of a netifapi_* * function. * * @param netifapimsg a struct containing the function to call and its parameters * @return error code given back by the function that was called */err_ttcpip_netifapi(struct netifapi_msg* netifapimsg){  struct tcpip_msg msg;    if (mbox != SYS_MBOX_NULL) {    netifapimsg->msg.sem = sys_sem_new(0);    if (netifapimsg->msg.sem == SYS_SEM_NULL) {      netifapimsg->msg.err = ERR_MEM;      return netifapimsg->msg.err;    }        msg.type = TCPIP_MSG_NETIFAPI;    msg.msg.netifapimsg = netifapimsg;    sys_mbox_post(mbox, &msg);    sys_sem_wait(netifapimsg->msg.sem);    sys_sem_free(netifapimsg->msg.sem);    return netifapimsg->msg.err;  }  return ERR_VAL;}#else /* !LWIP_TCPIP_CORE_LOCKING *//** * Call the lower part of a netifapi_* function * This function has exclusive access to lwIP core code by locking it * before the function is called. * * @param netifapimsg a struct containing the function to call and its parameters * @return ERR_OK (only for compatibility fo tcpip_netifapi()) */err_ttcpip_netifapi_lock(struct netifapi_msg* netifapimsg){  LOCK_TCPIP_CORE();    netifapimsg->function(&(netifapimsg->msg));  UNLOCK_TCPIP_CORE();  return netifapimsg->msg.err;}#endif /* !LWIP_TCPIP_CORE_LOCKING */#endif /* LWIP_NETIF_API *//** * Initialize this module: * - initialize all sub modules * - start the tcpip_thread * * @param initfunc a function to call when tcpip_thread is running and finished initializing * @param arg argument to pass to initfunc */voidtcpip_init(void (* initfunc)(void *), void *arg){  lwip_init();  tcpip_init_done = initfunc;  tcpip_init_done_arg = arg;  mbox = sys_mbox_new(TCPIP_MBOX_SIZE);#if LWIP_TCPIP_CORE_LOCKING  lock_tcpip_core = sys_sem_new(1);#endif /* LWIP_TCPIP_CORE_LOCKING */  sys_thread_new(TCPIP_THREAD_NAME, tcpip_thread, NULL, TCPIP_THREAD_STACKSIZE, TCPIP_THREAD_PRIO);}/** * Simple callback function used with tcpip_callback to free a pbuf * (pbuf_free has a wrong signature for tcpip_callback) * * @param p The pbuf (chain) to be dereferenced. */static voidpbuf_free_int(void *p){  struct pbuf *q = p;  pbuf_free(q);}/** * A simple wrapper function that allows you to free a pbuf from interrupt context. * * @param p The pbuf (chain) to be dereferenced. * @return ERR_OK if callback could be enqueued, an err_t if not */err_tpbuf_free_callback(struct pbuf *p){  return tcpip_callback_with_block(pbuf_free_int, p, 0);}/** * A simple wrapper function that allows you to free heap memory from * interrupt context. * * @param m the heap memory to free * @return ERR_OK if callback could be enqueued, an err_t if not */err_tmem_free_callback(void *m){  return tcpip_callback_with_block(mem_free, m, 0);}#endif /* !NO_SYS */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -