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

📄 api_msg.c

📁 最新rtlinux内核源码
💻 C
📖 第 1 页 / 共 2 页
字号:
    /* FALLTHROUGH */  case NETCONN_UDPNOCHKSUM:    /* FALLTHROUGH */  case NETCONN_UDP:    msg->conn->err = udp_bind(msg->conn->pcb.udp, msg->msg.bc.ipaddr, msg->msg.bc.port);    break;#endif /* LWIP_UDP */#if LWIP_TCP  case NETCONN_TCP:    msg->conn->err = tcp_bind(msg->conn->pcb.tcp,			      msg->msg.bc.ipaddr, msg->msg.bc.port);#endif /* LWIP_TCP */  default:    break;  }  sys_mbox_post(msg->conn->mbox, NULL);}#if LWIP_TCP/*-----------------------------------------------------------------------------------*/static err_tdo_connected(void *arg, struct tcp_pcb *pcb, err_t err){  struct netconn *conn;  conn = arg;  if(conn == NULL) {    return ERR_VAL;  }    conn->err = err;  if(conn->type == NETCONN_TCP && err == ERR_OK) {    setup_tcp(conn);  }      sys_mbox_post(conn->mbox, NULL);  return ERR_OK;}#endif  /*-----------------------------------------------------------------------------------*/static voiddo_connect(struct api_msg_msg *msg){  if(msg->conn->pcb.tcp == NULL) {    switch(msg->conn->type) {#if LWIP_UDP    case NETCONN_UDPLITE:      msg->conn->pcb.udp = udp_new();      if(msg->conn->pcb.udp == NULL) {	msg->conn->err = ERR_MEM;	sys_mbox_post(msg->conn->mbox, NULL);	return;      }      udp_setflags(msg->conn->pcb.udp, UDP_FLAGS_UDPLITE);      udp_recv(msg->conn->pcb.udp, recv_udp, msg->conn);      break;    case NETCONN_UDPNOCHKSUM:      msg->conn->pcb.udp = udp_new();      if(msg->conn->pcb.udp == NULL) {	msg->conn->err = ERR_MEM;	sys_mbox_post(msg->conn->mbox, NULL);	return;      }      udp_setflags(msg->conn->pcb.udp, UDP_FLAGS_NOCHKSUM);      udp_recv(msg->conn->pcb.udp, recv_udp, msg->conn);      break;    case NETCONN_UDP:      msg->conn->pcb.udp = udp_new();      if(msg->conn->pcb.udp == NULL) {	msg->conn->err = ERR_MEM;	sys_mbox_post(msg->conn->mbox, NULL);	return;      }      udp_recv(msg->conn->pcb.udp, recv_udp, msg->conn);      break;#endif /* LWIP_UDP */#if LWIP_TCP          case NETCONN_TCP:      msg->conn->pcb.tcp = tcp_new();            if(msg->conn->pcb.tcp == NULL) {	msg->conn->err = ERR_MEM;	sys_mbox_post(msg->conn->mbox, NULL);	return;      }#endif    default:      break;    }  }  switch(msg->conn->type) {#if LWIP_UDP  case NETCONN_UDPLITE:    /* FALLTHROUGH */  case NETCONN_UDPNOCHKSUM:    /* FALLTHROUGH */  case NETCONN_UDP:    udp_connect(msg->conn->pcb.udp, msg->msg.bc.ipaddr, msg->msg.bc.port);    sys_mbox_post(msg->conn->mbox, NULL);    break;#endif #if LWIP_TCP        case NETCONN_TCP:    /*    tcp_arg(msg->conn->pcb.tcp, msg->conn);*/    setup_tcp(msg->conn);    tcp_connect(msg->conn->pcb.tcp, msg->msg.bc.ipaddr, msg->msg.bc.port,		do_connected);    /*tcp_output(msg->conn->pcb.tcp);*/#endif  default:    break;  }}static voiddo_disconnect(struct api_msg_msg *msg){  switch(msg->conn->type) {#if LWIP_UDP  case NETCONN_UDPLITE:    /* FALLTHROUGH */  case NETCONN_UDPNOCHKSUM:    /* FALLTHROUGH */  case NETCONN_UDP:    udp_disconnect(msg->conn->pcb.udp);    break;#endif   case NETCONN_TCP:    break;  }  sys_mbox_post(msg->conn->mbox, NULL);}/*-----------------------------------------------------------------------------------*/static voiddo_listen(struct api_msg_msg *msg){  if(msg->conn->pcb.tcp != NULL) {    switch(msg->conn->type) {#if LWIP_UDP    case NETCONN_UDPLITE:      /* FALLTHROUGH */    case NETCONN_UDPNOCHKSUM:      /* FALLTHROUGH */    case NETCONN_UDP:      DEBUGF(API_MSG_DEBUG, ("api_msg: listen UDP: cannot listen for UDP.\n"));      break;#endif /* LWIP_UDP */#if LWIP_TCP          case NETCONN_TCP:      msg->conn->pcb.tcp = tcp_listen(msg->conn->pcb.tcp);      if(msg->conn->pcb.tcp == NULL) {	msg->conn->err = ERR_MEM;      } else {	if(msg->conn->acceptmbox == SYS_MBOX_NULL) {	  msg->conn->acceptmbox = sys_mbox_new();	  if(msg->conn->acceptmbox == SYS_MBOX_NULL) {	    msg->conn->err = ERR_MEM;	    break;	  }	}	tcp_arg(msg->conn->pcb.tcp, msg->conn);	tcp_accept(msg->conn->pcb.tcp, accept_function);      }#endif    default:      break;    }  }  sys_mbox_post(msg->conn->mbox, NULL);}/*-----------------------------------------------------------------------------------*/static voiddo_accept(struct api_msg_msg *msg){  if(msg->conn->pcb.tcp != NULL) {    switch(msg->conn->type) {#if LWIP_UDP    case NETCONN_UDPLITE:      /* FALLTHROUGH */    case NETCONN_UDPNOCHKSUM:      /* FALLTHROUGH */    case NETCONN_UDP:          DEBUGF(API_MSG_DEBUG, ("api_msg: accept UDP: cannot accept for UDP.\n"));      break;#endif /* LWIP_UDP */    case NETCONN_TCP:      break;    }  }}/*-----------------------------------------------------------------------------------*/static voiddo_send(struct api_msg_msg *msg){  if(msg->conn->pcb.tcp != NULL) {    switch(msg->conn->type) {#if LWIP_UDP    case NETCONN_UDPLITE:      /* FALLTHROUGH */    case NETCONN_UDPNOCHKSUM:      /* FALLTHROUGH */    case NETCONN_UDP:      udp_send(msg->conn->pcb.udp, msg->msg.p);      break;#endif /* LWIP_UDP */    case NETCONN_TCP:      break;    }  }  sys_mbox_post(msg->conn->mbox, NULL);}/*-----------------------------------------------------------------------------------*/static voiddo_recv(struct api_msg_msg *msg){#if LWIP_TCP  if(msg->conn->pcb.tcp != NULL) {    if(msg->conn->type == NETCONN_TCP) {      tcp_recved(msg->conn->pcb.tcp, msg->msg.len);    }  }#endif    sys_mbox_post(msg->conn->mbox, NULL);}/*-----------------------------------------------------------------------------------*/static voiddo_write(struct api_msg_msg *msg){#if LWIP_TCP	  err_t err;#endif    if(msg->conn->pcb.tcp != NULL) {    switch(msg->conn->type) {#if LWIP_UDP     case NETCONN_UDPLITE:      /* FALLTHROUGH */    case NETCONN_UDPNOCHKSUM:      /* FALLTHROUGH */    case NETCONN_UDP:      msg->conn->err = ERR_VAL;      break;#endif /* LWIP_UDP */#if LWIP_TCP     case NETCONN_TCP:            err = tcp_write(msg->conn->pcb.tcp, msg->msg.w.dataptr,                      msg->msg.w.len, msg->msg.w.copy);      /* This is the Nagle algorithm: inhibit the sending of new TCP	 segments when new outgoing data arrives from the user if any	 previously transmitted data on the connection remains	 unacknowledged. */      if(err == ERR_OK && msg->conn->pcb.tcp->unacked == NULL) {	tcp_output(msg->conn->pcb.tcp);      }      msg->conn->err = err;      if (msg->conn->callback)          if (err == ERR_OK)          {              if (tcp_sndbuf(msg->conn->pcb.tcp) <= TCP_SNDLOWAT)                  (*msg->conn->callback)(msg->conn, NETCONN_EVT_SENDMINUS, msg->msg.w.len);          }#endif    default:      break;    }  }  sys_mbox_post(msg->conn->mbox, NULL);}/*-----------------------------------------------------------------------------------*/static voiddo_close(struct api_msg_msg *msg){  err_t err;  err = ERR_OK;  if(msg->conn->pcb.tcp != NULL) {    switch(msg->conn->type) {#if LWIP_UDP    case NETCONN_UDPLITE:      /* FALLTHROUGH */    case NETCONN_UDPNOCHKSUM:      /* FALLTHROUGH */    case NETCONN_UDP:      break;#endif /* LWIP_UDP */#if LWIP_TCP    case NETCONN_TCP:      if(msg->conn->pcb.tcp->state == LISTEN) {	err = tcp_close(msg->conn->pcb.tcp);      }      msg->conn->err = err;      #endif    default:            break;    }  }  sys_mbox_post(msg->conn->mbox, NULL);}/*-----------------------------------------------------------------------------------*/typedef void (* api_msg_decode)(struct api_msg_msg *msg);static api_msg_decode decode[API_MSG_MAX] = {  do_newconn,  do_delconn,  do_bind,  do_connect,  do_disconnect,  do_listen,  do_accept,  do_send,  do_recv,  do_write,  do_close  };voidapi_msg_input(struct api_msg *msg){    decode[msg->type](&(msg->msg));}/*-----------------------------------------------------------------------------------*/voidapi_msg_post(struct api_msg *msg){  tcpip_apimsg(msg);}/*-----------------------------------------------------------------------------------*/

⌨️ 快捷键说明

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