📄 api_msg.c
字号:
udp_recv(msg->conn->pcb.udp, recv_udp, msg->conn); break; case NETCONN_UDPNOCHKSUM: msg->conn->pcb.udp = udp_new(); 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(); 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(); setup_tcp(msg->conn);#endif /* LWIP_TCP */ default: break; } } switch (msg->conn->type) {#if LWIP_RAW case NETCONN_RAW: msg->conn->err = raw_bind(msg->conn->pcb.raw,msg->msg.bc.ipaddr); break;#endif#if LWIP_UDP case NETCONN_UDPLITE: /* 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_TCPstatic 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_RAW case NETCONN_RAW: msg->conn->pcb.raw = raw_new(msg->msg.bc.port); /* misusing the port field as protocol */ raw_recv(msg->conn->pcb.raw, recv_raw, msg->conn); break;#endif#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_RAW case NETCONN_RAW: raw_connect(msg->conn->pcb.raw, msg->msg.bc.ipaddr); sys_mbox_post(msg->conn->mbox, NULL); break;#endif#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_RAW case NETCONN_RAW: /* Do nothing as connecting is only a helper for upper lwip layers */ break;#endif#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_RAW case NETCONN_RAW: LWIP_DEBUGF(API_MSG_DEBUG, ("api_msg: listen RAW: cannot listen for RAW.\n")); break;#endif#if LWIP_UDP case NETCONN_UDPLITE: /* FALLTHROUGH */ case NETCONN_UDPNOCHKSUM: /* FALLTHROUGH */ case NETCONN_UDP: LWIP_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_RAW case NETCONN_RAW: LWIP_DEBUGF(API_MSG_DEBUG, ("api_msg: accept RAW: cannot accept for RAW.\n")); break;#endif#if LWIP_UDP case NETCONN_UDPLITE: /* FALLTHROUGH */ case NETCONN_UDPNOCHKSUM: /* FALLTHROUGH */ case NETCONN_UDP: LWIP_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_RAW case NETCONN_RAW: raw_send(msg->conn->pcb.raw, msg->msg.p); break;#endif#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_RAW case NETCONN_RAW: msg->conn->err = ERR_VAL; break;#endif#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 || (msg->conn->pcb.tcp->flags & TF_NODELAY) || (msg->conn->pcb.tcp->snd_queuelen) > 1)) { 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_RAW case NETCONN_RAW: break;#endif#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); } else if (msg->conn->pcb.tcp->state == CLOSE_WAIT) { err = tcp_output(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 + -