#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>
/* 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)
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);
}
/* 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)
{
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;
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");
+}