aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorsharath <sharathkumarboyanapally@gmail.com>2018-09-04 10:35:46 +0530
committersharath <sharathkumarboyanapally@gmail.com>2018-09-25 19:43:02 +0530
commitc3607894647a6f5b28656d01db0ce2b7a473543b (patch)
tree75366d840c3d13285e0e89353cef5cfc13fa0f24
parent9f683fadb09aaea5a07f4673f8bbc3a7ddd38afc (diff)
Fix: Enhance select to support LWIP
Change-Id: I5a23bfea6dae6eade0a276c59c444a44fcb7558e Signed-off-by: sharath <sharathkumarboyanapally@gmail.com>
-rw-r--r--stacks/lwip_stack/lwip_src/socket/stackx_event.c117
-rw-r--r--stacks/lwip_stack/src/sbr/sbr_protocol_api.h2
-rw-r--r--stacks/lwip_stack/src/sbr/sbr_socket.c2
3 files changed, 111 insertions, 10 deletions
diff --git a/stacks/lwip_stack/lwip_src/socket/stackx_event.c b/stacks/lwip_stack/lwip_src/socket/stackx_event.c
index 93e47a3..1967ecc 100644
--- a/stacks/lwip_stack/lwip_src/socket/stackx_event.c
+++ b/stacks/lwip_stack/lwip_src/socket/stackx_event.c
@@ -17,13 +17,112 @@
#include "stackx_spl_share.h"
#include "common_pal_bitwide_adjust.h"
#include "stackx_event.h"
-#include <netinet/in.h>
-
-#define FREE_FD_SET(readfd, writefd, exceptfd) {\
- if(readfd)\
- free(readfd);\
- if(writefd)\
- free(writefd);\
- if(exceptfd)\
- free(exceptfd);\
+
+#define FREE_FD_SET(readfd, writefd, exceptfd) {\
+if(readfd)\
+free(readfd);\
+if(writefd)\
+free(writefd);\
+if(exceptfd)\
+free(exceptfd);\
+}
+
+int
+lwip_try_select (int fdsize, fd_set * fdread, fd_set * fdwrite,
+ fd_set * fderr, struct timeval *timeout)
+{
+ int i;
+ int nready = 0;
+ nstack_fd_set *read_out;
+ nstack_fd_set *write_out;
+ nstack_fd_set *err_out;
+ nstack_fd_set *readfd = (nstack_fd_set *) fdread;
+ nstack_fd_set *writefd = (nstack_fd_set *) fdwrite;
+ nstack_fd_set *exceptfd = (nstack_fd_set *) fderr;
+ sbr_socket_t *sock;
+ spl_netconn_t *conn;
+
+ if ((fdsize >= NSTACK_SETSIZE) || (fdsize < 0))
+ {
+ return 0;
+ }
+ read_out = malloc (sizeof (nstack_fd_set));
+ write_out = malloc (sizeof (nstack_fd_set));
+ err_out = malloc (sizeof (nstack_fd_set));
+ if ((!read_out) || (!write_out) || (!err_out))
+ {
+ NSPOL_LOGERR ("malloc nstack_fd_set fail");
+ FREE_FD_SET (read_out, write_out, err_out);
+ return -1;
+ }
+ int ret = NSTACK_FD_ZERO (read_out);
+ int ret1 = NSTACK_FD_ZERO (write_out);
+ int ret2 = NSTACK_FD_ZERO (err_out);
+
+ if ((EOK != ret) || (EOK != ret1) || (EOK != ret2))
+ {
+ NSPOL_LOGERR ("NSTACK_FD_ZERO fail");
+ FREE_FD_SET (read_out, write_out, err_out);
+ return -1;
+ }
+
+ for (i = 0; i < fdsize; i++)
+ {
+ if (!((readfd && NSTACK_FD_ISSET (i, readfd))
+ || (writefd && NSTACK_FD_ISSET (i, writefd))
+ || (exceptfd && NSTACK_FD_ISSET (i, exceptfd))))
+ {
+ continue;
+ }
+ sock = sbr_lookup_sk (i);
+ if (sock == NULL)
+ {
+ errno = EBADF;
+ FREE_FD_SET (read_out, write_out, err_out);
+ return -1;
+ }
+ conn = sbr_get_conn (sock);
+ if (!conn)
+ {
+ errno = EBADF;
+ FREE_FD_SET (read_out, write_out, err_out);
+ return -1;
+ }
+ if (readfd && NSTACK_FD_ISSET (i, readfd) &&
+ ((sbr_get_fd_share (sock)->lastdata != NULL)
+ || (conn->rcvevent > 0)))
+ {
+ NSTACK_FD_SET (i, read_out);
+ nready++;
+ }
+ if (writefd && NSTACK_FD_ISSET (i, writefd) && (conn->sendevent != 0))
+ {
+ NSTACK_FD_SET (i, write_out);
+ nready++;
+ }
+ if (exceptfd && NSTACK_FD_ISSET (i, exceptfd) && (conn->errevent != 0))
+ {
+ NSTACK_FD_SET (i, write_out);
+ nready++;
+ }
+ }
+
+ //TODO: need to handle fd_set and nstack_fd_set memory issue
+ if (readfd)
+ {
+ *readfd = *read_out;
+ }
+
+ if (writefd)
+ {
+ *writefd = *write_out;
+ }
+
+ if (exceptfd)
+ {
+ *exceptfd = *err_out;
+ }
+
+ FREE_FD_SET (read_out, write_out, err_out);
+ return nready;
}
diff --git a/stacks/lwip_stack/src/sbr/sbr_protocol_api.h b/stacks/lwip_stack/src/sbr/sbr_protocol_api.h
index 1c0fb1e..f4e5070 100644
--- a/stacks/lwip_stack/src/sbr/sbr_protocol_api.h
+++ b/stacks/lwip_stack/src/sbr/sbr_protocol_api.h
@@ -89,6 +89,8 @@ int sbr_init_protocol ();
sbr_fdopt *sbr_get_fdopt (int domain, int type, int protocol);
void sbr_app_touch_in (void); /*app send its version info to nStackMain */
+int lwip_try_select (int fdsize, fd_set * fdread, fd_set * fdwrite,
+ fd_set * fderr, struct timeval *timeout);
#ifdef __cplusplus
/* *INDENT-OFF* */
diff --git a/stacks/lwip_stack/src/sbr/sbr_socket.c b/stacks/lwip_stack/src/sbr/sbr_socket.c
index 47aefda..e335d6c 100644
--- a/stacks/lwip_stack/src/sbr/sbr_socket.c
+++ b/stacks/lwip_stack/src/sbr/sbr_socket.c
@@ -1065,7 +1065,7 @@ SBR_INTERCEPT (int, select,
(int nfds, fd_set * readfd, fd_set * writefd,
fd_set * exceptfd, struct timeval * timeout))
{
- return -1;
+ return lwip_try_select (nfds, readfd, writefd, exceptfd, timeout);
}
SBR_INTERCEPT (unsigned int, ep_getevt,