]> rtime.felk.cvut.cz Git - pes-rpp/rpp-lwip.git/commitdiff
sockets.c, api_lib.c, api_msg.h, api_msg.c, netifapi.h, netifapi.c, tcpip.c: Include...
authorfbernon <fbernon>
Fri, 11 May 2007 08:58:23 +0000 (08:58 +0000)
committerfbernon <fbernon>
Fri, 11 May 2007 08:58:23 +0000 (08:58 +0000)
CHANGELOG
src/api/api_lib.c
src/api/api_msg.c
src/api/netifapi.c
src/api/sockets.c
src/api/tcpip.c
src/include/lwip/api_msg.h
src/include/lwip/netifapi.h

index e9f180f521ad6acc9329c829536c44f37f8e44b0..7d033743f1c4c9e4175bb240336a565e09d907ab 100644 (file)
--- 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
index 7916ae8407f893b8ddbf2e3a118867c9ee3d5c77..c4c2c8a2f25dcb221bf4d86d9ce3ba197ba699f2 100644 (file)
@@ -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 */
index 21d1aa12913a85aed99b55257be30aaf93f342a0..915d8dde04db62e3d7704bfffc476956940caf33 100644 (file)
@@ -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);
-}
-
index 8ca3d79ec59f20bb743ac6876cc918bf5f45b9e4..d069f59e6c41cb554dfed232b14bf5e4809caf23 100644 (file)
@@ -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 */
index f06715312b390bf3ff0286a3afaba090a81a281f..03bb7ebd310a2b1c3d9829d53c9f8716e5199a89 100644 (file)
@@ -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 */
index cf159ca5e300d51176170be55278500474a287ea..33af507c306c52b7c084ad854f4c7602a5235df3 100644 (file)
@@ -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      
index 70bb47d66b6e33a19909dc1771551afc1ebff7fb..3dd39e5f84e24c6e7a3b1f1ad702d4918f38a47e 100644 (file)
 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
 }
index 8eb575a1b667d2448920c7f5ed64911c2c9dbf6c..81cdc7edd134e7228b67639661dd475e85cd4af4 100644 (file)
@@ -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
 }