Add server tcp api.
[bertos.git] / bertos / net / tcp_socket.c
index 030f55f3351e50a7cb11ce0bb16bf3d50c03ddc2..65db328fb99c7b06c856b7359f49546450b75b7d 100644 (file)
 
 #include "tcp_socket.h"
 
-#define LOG_LEVEL   LOG_LVL_INFO
-#define LOG_FORMAT  LOG_FMT_TERSE
+#include "cfg/cfg_tcpsocket.h"
+
+#define LOG_LEVEL   TCPSOCKET_LOG_LEVEL
+#define LOG_FORMAT  TCPSOCKET_LOG_FORMAT
 #include <cfg/log.h>
 #include <cpu/byteorder.h>
 
@@ -83,6 +85,11 @@ static bool tcpsocket_reconnect(TcpSocket *socket)
        /* Close socket if was opened */
        close_socket(socket);
 
+       /* If we are in server mode we do nothing */
+       if (socket->handler)
+               return true;
+
+
        /* Start with new connection */
        socket->sock = netconn_new(NETCONN_TCP);
        if(!socket->sock)
@@ -130,6 +137,15 @@ static KFile *tcpsocket_reopen(KFile *fd)
        return NULL;
 }
 
+/*
+ * Read data from socket.
+ *
+ * The read return the bytes that had been received if they are less than we request too.
+ * Otherwise if the byte that we want read are less that the received bytes, we return only
+ * the requested bytes. To get the remaning bytes we need to make an others read, until the
+ * buffer is empty.
+ * When there are not any more bytes, a new read takes data from remote socket.
+ */
 static size_t tcpsocket_read(KFile *fd, void *buf, size_t len)
 {
        TcpSocket *socket = TCPSOCKET_CAST(fd);
@@ -173,10 +189,8 @@ static size_t tcpsocket_read(KFile *fd, void *buf, size_t len)
        }
 
        /* Try reconnecting if our socket isn't valid */
-       LOG_INFO("sock[%s]\n", socket->sock ? "valido":"nullo");
        if (!socket->sock && !tcpsocket_reconnect(socket))
                return 0;
-       LOG_INFO("sock1[%s]\n", socket->sock ? "valido":"nullo");
 
        while (len)
        {
@@ -252,9 +266,27 @@ static void tcpsocket_clearerr(KFile *fd)
        socket->error = 0;
 }
 
+void tcpsocket_serverPoll(KFile *fd)
+{
+       TcpSocket *socket = TCPSOCKET_CAST(fd);
+
+
+       if (!socket->sock)
+               socket->sock = netconn_accept(socket->server_sock);
+
+       if (!socket->sock)
+       {
+               LOG_ERR("Unable to connect with client\n");
+               return;
+       }
+
+       socket->handler(fd);
+}
+
 void tcpsocket_init(TcpSocket *socket, struct ip_addr *local_addr, struct ip_addr *remote_addr, uint16_t port)
 {
-       socket->sock = NULL;
+       memset(socket, 0, sizeof(TcpSocket));
+
        socket->local_addr = local_addr;
        socket->remote_addr = remote_addr;
        socket->port = port;
@@ -268,3 +300,15 @@ void tcpsocket_init(TcpSocket *socket, struct ip_addr *local_addr, struct ip_add
        socket->fd.reopen = tcpsocket_reopen;
 
 }
+
+void tcpsocket_serverInit(TcpSocket *socket, struct ip_addr *local_addr, struct ip_addr *listen_addr, uint16_t port, tcphandler_t handler)
+{
+       tcpsocket_init(socket, local_addr, listen_addr, port);
+       socket->handler = handler;
+
+       socket->server_sock = netconn_new(NETCONN_TCP);
+       socket->error = netconn_bind(socket->server_sock, listen_addr, port);
+       socket->error = netconn_listen(socket->server_sock);
+       if(socket->error != ERR_OK)
+               LOG_ERR("Init server\n");
+}