* [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
#include "lwip/opt.h"
#include "lwip/api.h"
#include "lwip/api_msg.h"
+#include "lwip/tcpip.h"
#include "lwip/memp.h"
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);
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) {
}
}
- 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;
}
}
}
- 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;
}
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;
}
}
}
- msg.type = API_MSG_LISTEN;
+ msg.function = do_listen;
msg.msg.conn = conn;
- api_msg_post(&msg);
+ tcpip_apimsg(&msg);
return conn->err;
}
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);
}
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;
}
return conn->err;
}
- msg.type = API_MSG_WRITE;
+ msg.function = do_write;
msg.msg.conn = conn;
conn->state = NETCONN_WRITE;
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;
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;
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 */
return msg->conn->err;
}
-static void
+void
do_newconn(struct api_msg_msg *msg)
{
if(msg->conn->pcb.tcp == NULL) {
sys_mbox_post(msg->conn->mbox, NULL);
}
-static void
+void
do_delconn(struct api_msg_msg *msg)
{
if (msg->conn->pcb.tcp != NULL) {
}
}
-static void
+void
do_bind(struct api_msg_msg *msg)
{
if (msg->conn->pcb.tcp == NULL) {
}
#endif /* LWIP_TCP */
-static void
+void
do_connect(struct api_msg_msg *msg)
{
if (msg->conn->pcb.tcp == NULL) {
}
}
-static void
+void
do_disconnect(struct api_msg_msg *msg)
{
switch (msg->conn->type) {
}
-static void
+void
do_listen(struct api_msg_msg *msg)
{
if (msg->conn->pcb.tcp != NULL) {
sys_mbox_post(msg->conn->mbox, NULL);
}
-static void
+void
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
sys_mbox_post(msg->conn->mbox, NULL);
}
-static void
+void
do_write(struct api_msg_msg *msg)
{
#if LWIP_TCP
sys_mbox_post(msg->conn->mbox, NULL);
}
-static void
+void
do_close(struct api_msg_msg *msg)
{
err_t err;
}
#if LWIP_IGMP
-static void
+void
do_join_leave_group(struct api_msg_msg *msg)
{
err_t err = ERR_OK;
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);
-}
-
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;
}
{ struct netifapi_msg msg;
msg.type = NETIFAPI_MSG_NETIF_REMOVE;
msg.netif = netif;
- netifapi_msg_post(&msg);
+ tcpip_apimsg(&msg);
return msg.err;
}
{ struct netifapi_msg msg;
msg.type = NETIFAPI_MSG_DHCP_START;
msg.netif = netif;
- netifapi_msg_post(&msg);
+ tcpip_apimsg(&msg);
return msg.err;
}
{ struct netifapi_msg msg;
msg.type = NETIFAPI_MSG_DHCP_STOP;
msg.netif = netif;
- netifapi_msg_post(&msg);
+ tcpip_apimsg(&msg);
return msg.err;
}
sys_sem_signal(msg->sem);
}
-err_t
-netifapi_msg_post( struct netifapi_msg *msg)
-{ return tcpip_netifapi(msg);
-}
-
#endif /* LWIP_NETIF_API */
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);
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 */
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
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;
};
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
}
/* API for tcpip_thread */
void netifapi_msg_input(struct netifapi_msg *msg);
-err_t netifapi_msg_post (struct netifapi_msg *msg);
#ifdef __cplusplus
}