mirror of
https://github.com/lwip-tcpip/lwip.git
synced 2024-11-04 14:29:39 +00:00
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).
This commit is contained in:
parent
6a2e323792
commit
9cf1390dc6
@ -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
|
||||
|
@ -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 */
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
@ -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 */
|
||||
|
@ -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 */
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
}
|
||||
|
@ -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
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user