From 9cf1390dc6df738e56c0ec0ff50385351399db4a Mon Sep 17 00:00:00 2001 From: fbernon Date: Fri, 11 May 2007 08:58:23 +0000 Subject: [PATCH] sockets.c, api_lib.c, api_msg.h, api_msg.c, netifapi.h, netifapi.c, tcpip.c: Include a function pointer instead of a table index in the message to reduce footprint. Disable some part of lwip_send and lwip_sendto if some options are not set (LWIP_TCP, LWIP_UDP, LWIP_RAW). --- CHANGELOG | 7 +++++ src/api/api_lib.c | 45 ++++++++++++++++--------------- src/api/api_msg.c | 53 ++++++++----------------------------- src/api/netifapi.c | 13 +++------ src/api/sockets.c | 18 ++++++++++--- src/api/tcpip.c | 2 +- src/include/lwip/api_msg.h | 40 ++++++++++------------------ src/include/lwip/netifapi.h | 1 - 8 files changed, 74 insertions(+), 105 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index e9f180f5..7d033743 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -22,6 +22,13 @@ HISTORY * [Enter new changes just after this line - do not remove this line] ++ New features: + + 2007-05-11 Frédéric Bernon + * sockets.c, api_lib.c, api_msg.h, api_msg.c, netifapi.h, netifapi.c, tcpip.c: + Include a function pointer instead of a table index in the message to reduce + footprint. Disable some part of lwip_send and lwip_sendto if some options are + not set (LWIP_TCP, LWIP_UDP, LWIP_RAW). + 2007-05-10 Simon Goldschmidt * *.h (except netif/ppp/*.h): Included patch #5448: include '#ifdef __cplusplus \ extern "C" {' in all header files. Now you can write your application using diff --git a/src/api/api_lib.c b/src/api/api_lib.c index 7916ae84..c4c2c8a2 100644 --- a/src/api/api_lib.c +++ b/src/api/api_lib.c @@ -37,6 +37,7 @@ #include "lwip/opt.h" #include "lwip/api.h" #include "lwip/api_msg.h" +#include "lwip/tcpip.h" #include "lwip/memp.h" @@ -215,10 +216,10 @@ netconn *netconn_new_with_proto_and_callback(enum netconn_type t, u16_t proto, conn->recv_timeout = 0; #endif /* LWIP_SO_RCVTIMEO */ - msg.type = API_MSG_NEWCONN; + msg.function = do_newconn; msg.msg.msg.bc.port = proto; /* misusing the port field */ msg.msg.conn = conn; - api_msg_post(&msg); + tcpip_apimsg(&msg); if ( conn->err != ERR_OK ) { sys_sem_free(conn->sem); @@ -253,9 +254,9 @@ netconn_delete(struct netconn *conn) return ERR_OK; } - msg.type = API_MSG_DELCONN; + msg.function = do_delconn; msg.msg.conn = conn; - api_msg_post(&msg); + tcpip_apimsg(&msg); /* Drain the recvmbox. */ if (conn->recvmbox != SYS_MBOX_NULL) { @@ -363,11 +364,11 @@ netconn_bind(struct netconn *conn, struct ip_addr *addr, u16_t port) } } - msg.type = API_MSG_BIND; + msg.function = do_bind; msg.msg.conn = conn; msg.msg.msg.bc.ipaddr = addr; msg.msg.msg.bc.port = port; - api_msg_post(&msg); + tcpip_apimsg(&msg); return conn->err; } @@ -387,11 +388,11 @@ netconn_connect(struct netconn *conn, struct ip_addr *addr, u16_t port) } } - msg.type = API_MSG_CONNECT; + msg.function = do_connect; msg.msg.conn = conn; msg.msg.msg.bc.ipaddr = addr; msg.msg.msg.bc.port = port; - api_msg_post(&msg); + tcpip_apimsg(&msg); return conn->err; } @@ -404,9 +405,9 @@ netconn_disconnect(struct netconn *conn) return ERR_VAL; } - msg.type = API_MSG_DISCONNECT; + msg.function = do_disconnect; msg.msg.conn = conn; - api_msg_post(&msg); + tcpip_apimsg(&msg); return conn->err; } @@ -426,9 +427,9 @@ netconn_listen(struct netconn *conn) } } - msg.type = API_MSG_LISTEN; + msg.function = do_listen; msg.msg.conn = conn; - api_msg_post(&msg); + tcpip_apimsg(&msg); return conn->err; } @@ -514,14 +515,14 @@ netconn_recv(struct netconn *conn) buf->addr = NULL; /* Let the stack know that we have taken the data. */ - msg.type = API_MSG_RECV; + msg.function = do_recv; msg.msg.conn = conn; if (buf != NULL) { msg.msg.msg.len = buf->p->tot_len; } else { msg.msg.msg.len = 1; } - api_msg_post(&msg); + tcpip_apimsg(&msg); } else { #if LWIP_SO_RCVTIMEO sys_mbox_fetch_timeout(conn->recvmbox, (void *)&buf, conn->recv_timeout); @@ -565,10 +566,10 @@ netconn_send(struct netconn *conn, struct netbuf *buf) } LWIP_DEBUGF(API_LIB_DEBUG, ("netconn_send: sending %d bytes\n", buf->p->tot_len)); - msg.type = API_MSG_SEND; + msg.function = do_send; msg.msg.conn = conn; msg.msg.msg.b = buf; - api_msg_post(&msg); + tcpip_apimsg(&msg); return conn->err; } @@ -586,7 +587,7 @@ netconn_write(struct netconn *conn, const void *dataptr, u16_t size, u8_t copy) return conn->err; } - msg.type = API_MSG_WRITE; + msg.function = do_write; msg.msg.conn = conn; conn->state = NETCONN_WRITE; @@ -613,7 +614,7 @@ netconn_write(struct netconn *conn, const void *dataptr, u16_t size, u8_t copy) LWIP_DEBUGF(API_LIB_DEBUG, ("netconn_write: writing %d bytes (%d)\n", len, copy)); msg.msg.msg.w.len = len; - api_msg_post(&msg); + tcpip_apimsg(&msg); if (conn->err == ERR_OK) { dataptr = (void *)((u8_t *)dataptr + len); size -= len; @@ -641,9 +642,9 @@ netconn_close(struct netconn *conn) conn->state = NETCONN_CLOSE; again: - msg.type = API_MSG_CLOSE; + msg.function = do_close; msg.msg.conn = conn; - api_msg_post(&msg); + tcpip_apimsg(&msg); if (conn->err == ERR_MEM && conn->sem != SYS_SEM_NULL) { sys_sem_wait(conn->sem); goto again; @@ -673,11 +674,11 @@ netconn_join_leave_group (struct netconn *conn, ipaddr[0] = multiaddr; ipaddr[1] = interface; - msg.type = API_MSG_JOIN_LEAVE; + msg.function = do_join_leave_group; msg.msg.conn = conn; msg.msg.msg.bc.ipaddr = (struct ip_addr *)ipaddr; msg.msg.msg.bc.port = join_or_leave; - api_msg_post(&msg); + tcpip_apimsg(&msg); return conn->err; } #endif /* LWIP_IGMP */ diff --git a/src/api/api_msg.c b/src/api/api_msg.c index 21d1aa12..915d8dde 100644 --- a/src/api/api_msg.c +++ b/src/api/api_msg.c @@ -342,7 +342,7 @@ pcb_new(struct api_msg_msg *msg) return msg->conn->err; } -static void +void do_newconn(struct api_msg_msg *msg) { if(msg->conn->pcb.tcp == NULL) { @@ -355,7 +355,7 @@ do_newconn(struct api_msg_msg *msg) sys_mbox_post(msg->conn->mbox, NULL); } -static void +void do_delconn(struct api_msg_msg *msg) { if (msg->conn->pcb.tcp != NULL) { @@ -407,7 +407,7 @@ do_delconn(struct api_msg_msg *msg) } } -static void +void do_bind(struct api_msg_msg *msg) { if (msg->conn->pcb.tcp == NULL) { @@ -465,7 +465,7 @@ do_connected(void *arg, struct tcp_pcb *pcb, err_t err) } #endif /* LWIP_TCP */ -static void +void do_connect(struct api_msg_msg *msg) { if (msg->conn->pcb.tcp == NULL) { @@ -505,7 +505,7 @@ do_connect(struct api_msg_msg *msg) } } -static void +void do_disconnect(struct api_msg_msg *msg) { switch (msg->conn->type) { @@ -530,7 +530,7 @@ do_disconnect(struct api_msg_msg *msg) } -static void +void do_listen(struct api_msg_msg *msg) { if (msg->conn->pcb.tcp != NULL) { @@ -572,7 +572,7 @@ do_listen(struct api_msg_msg *msg) sys_mbox_post(msg->conn->mbox, NULL); } -static void +void do_send(struct api_msg_msg *msg) { @@ -609,7 +609,7 @@ do_send(struct api_msg_msg *msg) sys_mbox_post(msg->conn->mbox, NULL); } -static void +void do_recv(struct api_msg_msg *msg) { #if LWIP_TCP @@ -622,7 +622,7 @@ do_recv(struct api_msg_msg *msg) sys_mbox_post(msg->conn->mbox, NULL); } -static void +void do_write(struct api_msg_msg *msg) { #if LWIP_TCP @@ -673,7 +673,7 @@ do_write(struct api_msg_msg *msg) sys_mbox_post(msg->conn->mbox, NULL); } -static void +void do_close(struct api_msg_msg *msg) { err_t err; @@ -711,7 +711,7 @@ do_close(struct api_msg_msg *msg) } #if LWIP_IGMP -static void +void do_join_leave_group(struct api_msg_msg *msg) { err_t err = ERR_OK; @@ -746,34 +746,3 @@ do_join_leave_group(struct api_msg_msg *msg) sys_mbox_post(msg->conn->mbox, NULL); } #endif /* LWIP_IGMP */ - -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_send, - do_recv, - do_write, - do_close, -#if LWIP_IGMP - do_join_leave_group -#endif /* LWIP_IGMP */ -}; - -void -api_msg_input(struct api_msg *msg) -{ struct api_msg_msg msg_copy; - msg_copy=msg->msg; - decode[msg->type](&msg_copy); -} - -err_t -api_msg_post(struct api_msg *msg) -{ - return tcpip_apimsg(msg); -} - diff --git a/src/api/netifapi.c b/src/api/netifapi.c index 8ca3d79e..d069f59e 100644 --- a/src/api/netifapi.c +++ b/src/api/netifapi.c @@ -49,7 +49,7 @@ netifapi_netif_add( struct netif *netif, msg.msg.add.state = state; msg.msg.add.init = init; msg.msg.add.input = input; - netifapi_msg_post(&msg); + tcpip_apimsg(&msg); return msg.err; } @@ -58,7 +58,7 @@ netifapi_netif_remove( struct netif *netif) { struct netifapi_msg msg; msg.type = NETIFAPI_MSG_NETIF_REMOVE; msg.netif = netif; - netifapi_msg_post(&msg); + tcpip_apimsg(&msg); return msg.err; } @@ -67,7 +67,7 @@ netifapi_dhcp_start( struct netif *netif) { struct netifapi_msg msg; msg.type = NETIFAPI_MSG_DHCP_START; msg.netif = netif; - netifapi_msg_post(&msg); + tcpip_apimsg(&msg); return msg.err; } @@ -76,7 +76,7 @@ netifapi_dhcp_stop( struct netif *netif) { struct netifapi_msg msg; msg.type = NETIFAPI_MSG_DHCP_STOP; msg.netif = netif; - netifapi_msg_post(&msg); + tcpip_apimsg(&msg); return msg.err; } @@ -110,9 +110,4 @@ netifapi_msg_input( struct netifapi_msg *msg) sys_sem_signal(msg->sem); } -err_t -netifapi_msg_post( struct netifapi_msg *msg) -{ return tcpip_netifapi(msg); -} - #endif /* LWIP_NETIF_API */ diff --git a/src/api/sockets.c b/src/api/sockets.c index f0671531..03bb7ebd 100644 --- a/src/api/sockets.c +++ b/src/api/sockets.c @@ -469,11 +469,16 @@ lwip_send(int s, const void *data, int size, unsigned int flags) if (!sock) return -1; - if (sock->conn->type!=NETCONN_TCP) + if (sock->conn->type!=NETCONN_TCP) +#if (LWIP_UDP || LWIP_RAW) return lwip_sendto( s, data, size, flags, NULL, 0); - +#else + sock_set_errno(sock, err_to_errno(ERR_ARG)); + return -1; +#endif + err = netconn_write( sock->conn, data, size, NETCONN_COPY); - + LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_send(%d) err=%d size=%d\n", s, err, size)); sock_set_errno(sock, err_to_errno(err)); return (err==ERR_OK?size:-1); @@ -494,8 +499,13 @@ lwip_sendto(int s, const void *data, int size, unsigned int flags, return -1; if (sock->conn->type==NETCONN_TCP) +#if LWIP_TCP return lwip_send( s, data, size, flags); - +#else + sock_set_errno(sock, err_to_errno(ERR_ARG)); + return -1; +#endif /* LWIP_TCP */ + LWIP_ASSERT("lwip_sendto: invalid address", (((to==NULL) && (tolen==0)) || ((tolen == sizeof(struct sockaddr_in)) && ((((struct sockaddr_in *)to)->sin_family) == AF_INET))) ); /* initialize a buffer */ diff --git a/src/api/tcpip.c b/src/api/tcpip.c index cf159ca5..33af507c 100644 --- a/src/api/tcpip.c +++ b/src/api/tcpip.c @@ -196,7 +196,7 @@ tcpip_thread(void *arg) switch (msg->type) { case TCPIP_MSG_API: LWIP_DEBUGF(TCPIP_DEBUG, ("tcpip_thread: API message %p\n", (void *)msg)); - api_msg_input(msg->msg.apimsg); + msg->msg.apimsg->function(&(msg->msg.apimsg->msg)); break; #if ETHARP_TCPIP_INPUT diff --git a/src/include/lwip/api_msg.h b/src/include/lwip/api_msg.h index 70bb47d6..3dd39e5f 100644 --- a/src/include/lwip/api_msg.h +++ b/src/include/lwip/api_msg.h @@ -47,29 +47,6 @@ extern "C" { #endif -enum api_msg_type { - API_MSG_NEWCONN, - API_MSG_DELCONN, - - API_MSG_BIND, - API_MSG_CONNECT, - API_MSG_DISCONNECT, - - API_MSG_LISTEN, - - API_MSG_SEND, - API_MSG_RECV, - API_MSG_WRITE, - - API_MSG_CLOSE, - -#if LWIP_IGMP - API_MSG_JOIN_LEAVE, -#endif /* LWIP_IGMP */ - - API_MSG_MAX -}; - struct api_msg_msg { struct netconn *conn; enum netconn_type conntype; @@ -91,12 +68,23 @@ struct api_msg_msg { }; struct api_msg { - enum api_msg_type type; + void (* function)(struct api_msg_msg *msg); struct api_msg_msg msg; }; -void api_msg_input(struct api_msg *msg); -err_t api_msg_post(struct api_msg *msg); +void do_newconn ( struct api_msg_msg *msg); +void do_delconn ( struct api_msg_msg *msg); +void do_bind ( struct api_msg_msg *msg); +void do_connect ( struct api_msg_msg *msg); +void do_disconnect ( struct api_msg_msg *msg); +void do_listen ( struct api_msg_msg *msg); +void do_send ( struct api_msg_msg *msg); +void do_recv ( struct api_msg_msg *msg); +void do_write ( struct api_msg_msg *msg); +void do_close ( struct api_msg_msg *msg); +#if LWIP_IGMP +void do_join_leave_group( struct api_msg_msg *msg); +#endif /* LWIP_IGMP */ #ifdef __cplusplus } diff --git a/src/include/lwip/netifapi.h b/src/include/lwip/netifapi.h index 8eb575a1..81cdc7ed 100644 --- a/src/include/lwip/netifapi.h +++ b/src/include/lwip/netifapi.h @@ -84,7 +84,6 @@ err_t netifapi_dhcp_stop ( struct netif *netif); /* API for tcpip_thread */ void netifapi_msg_input(struct netifapi_msg *msg); -err_t netifapi_msg_post (struct netifapi_msg *msg); #ifdef __cplusplus }