Commit cfee5c4f authored by Deomid Ryabkov's avatar Deomid Ryabkov Committed by Marko Mikulicic

Mongoose TCP listener for ESP LWIP

    PUBLISHED_FROM=e88b17d21ee78a4c2c1c4832db322e19b314206d
parent e4618506
...@@ -2272,39 +2272,29 @@ static int mg_ssl_err(struct mg_connection *conn, int res) { ...@@ -2272,39 +2272,29 @@ static int mg_ssl_err(struct mg_connection *conn, int res) {
} }
#endif /* MG_ENABLE_SSL */ #endif /* MG_ENABLE_SSL */
int mg_if_accept_tcp_cb(struct mg_connection *lc, sock_t sock, struct mg_connection *mg_if_accept_tcp_cb(struct mg_connection *lc,
union socket_address *sa, size_t sa_len) { union socket_address *sa,
size_t sa_len) {
struct mg_add_sock_opts opts; struct mg_add_sock_opts opts;
struct mg_connection *nc; struct mg_connection *nc;
(void) sa_len; (void) sa_len;
memset(&opts, 0, sizeof(opts)); memset(&opts, 0, sizeof(opts));
nc = mg_create_connection(lc->mgr, lc->handler, opts); nc = mg_create_connection(lc->mgr, lc->handler, opts);
if (nc == NULL) { if (nc == NULL) return NULL;
return -ENOMEM;
}
nc->listener = lc; nc->listener = lc;
nc->proto_data = lc->proto_data; nc->proto_data = lc->proto_data;
nc->proto_handler = lc->proto_handler; nc->proto_handler = lc->proto_handler;
nc->user_data = lc->user_data; nc->user_data = lc->user_data;
nc->recv_mbuf_limit = lc->recv_mbuf_limit; nc->recv_mbuf_limit = lc->recv_mbuf_limit;
nc->sa = *sa; nc->sa = *sa;
mg_if_set_sock(nc, sock); /* XXX */
mg_add_conn(nc->mgr, nc); mg_add_conn(nc->mgr, nc);
#ifdef MG_ENABLE_SSL if (nc->ssl == NULL) {
if (lc->ssl_ctx != NULL) { /* For non-SSL connections deliver MG_EV_ACCEPT right away. */
nc->ssl = SSL_new(lc->ssl_ctx);
if (nc->ssl == NULL || SSL_set_fd(nc->ssl, sock) != 1) {
DBG(("SSL error"));
mg_close_conn(nc);
}
} else
#endif
{
mg_call(nc, MG_EV_ACCEPT, &nc->sa); mg_call(nc, MG_EV_ACCEPT, &nc->sa);
} }
DBG(("%p %p %d %d, %p %p", lc, nc, nc->sock, (int) nc->flags, lc->ssl_ctx, DBG(("%p %p %d %d, %p %p", lc, nc, nc->sock, (int) nc->flags, lc->ssl_ctx,
nc->ssl)); nc->ssl));
return 0; return nc;
} }
static size_t recv_avail_size(struct mg_connection *conn, size_t max) { static size_t recv_avail_size(struct mg_connection *conn, size_t max) {
...@@ -2701,6 +2691,7 @@ void mg_forward(struct mg_connection *from, struct mg_connection *to) { ...@@ -2701,6 +2691,7 @@ void mg_forward(struct mg_connection *from, struct mg_connection *to) {
#define MG_UDP_RECV_BUFFER_SIZE 1500 #define MG_UDP_RECV_BUFFER_SIZE 1500
static sock_t mg_open_listening_socket(union socket_address *sa, int proto); static sock_t mg_open_listening_socket(union socket_address *sa, int proto);
static void mg_sock_set(struct mg_connection *nc, sock_t sock);
void mg_set_non_blocking_mode(sock_t sock) { void mg_set_non_blocking_mode(sock_t sock) {
#ifdef _WIN32 #ifdef _WIN32
...@@ -2761,14 +2752,14 @@ void mg_if_connect_udp(struct mg_connection *nc) { ...@@ -2761,14 +2752,14 @@ void mg_if_connect_udp(struct mg_connection *nc) {
int mg_if_listen_tcp(struct mg_connection *nc, union socket_address *sa) { int mg_if_listen_tcp(struct mg_connection *nc, union socket_address *sa) {
sock_t sock = mg_open_listening_socket(sa, SOCK_STREAM); sock_t sock = mg_open_listening_socket(sa, SOCK_STREAM);
if (sock < 0) return (errno ? errno : 1); if (sock < 0) return (errno ? errno : 1);
mg_if_set_sock(nc, sock); mg_sock_set(nc, sock);
return 0; return 0;
} }
int mg_if_listen_udp(struct mg_connection *nc, union socket_address *sa) { int mg_if_listen_udp(struct mg_connection *nc, union socket_address *sa) {
sock_t sock = mg_open_listening_socket(sa, SOCK_DGRAM); sock_t sock = mg_open_listening_socket(sa, SOCK_DGRAM);
if (sock < 0) return (errno ? errno : 1); if (sock < 0) return (errno ? errno : 1);
mg_if_set_sock(nc, sock); mg_sock_set(nc, sock);
return 0; return 0;
} }
...@@ -2809,6 +2800,7 @@ void mg_if_destroy_conn(struct mg_connection *nc) { ...@@ -2809,6 +2800,7 @@ void mg_if_destroy_conn(struct mg_connection *nc) {
} }
static void mg_accept_conn(struct mg_connection *lc) { static void mg_accept_conn(struct mg_connection *lc) {
struct mg_connection *nc;
union socket_address sa; union socket_address sa;
socklen_t sa_len = sizeof(sa); socklen_t sa_len = sizeof(sa);
/* NOTE(lsm): on Windows, sock is always > FD_SETSIZE */ /* NOTE(lsm): on Windows, sock is always > FD_SETSIZE */
...@@ -2817,9 +2809,21 @@ static void mg_accept_conn(struct mg_connection *lc) { ...@@ -2817,9 +2809,21 @@ static void mg_accept_conn(struct mg_connection *lc) {
DBG(("%p: failed to accept: %d", lc, errno)); DBG(("%p: failed to accept: %d", lc, errno));
return; return;
} }
if (mg_if_accept_tcp_cb(lc, sock, &sa, sa_len) != 0) { nc = mg_if_accept_tcp_cb(lc, &sa, sa_len);
if (nc == NULL) {
closesocket(sock); closesocket(sock);
return;
}
mg_sock_set(nc, sock);
#ifdef MG_ENABLE_SSL
if (lc->ssl_ctx != NULL) {
nc->ssl = SSL_new(lc->ssl_ctx);
if (nc->ssl == NULL || SSL_set_fd(nc->ssl, sock) != 1) {
DBG(("SSL error"));
mg_close_conn(nc);
}
} }
#endif
} }
/* 'sa' must be an initialized address to bind to */ /* 'sa' must be an initialized address to bind to */
...@@ -3089,14 +3093,14 @@ struct mg_connection *mg_add_sock_opt(struct mg_mgr *s, sock_t sock, ...@@ -3089,14 +3093,14 @@ struct mg_connection *mg_add_sock_opt(struct mg_mgr *s, sock_t sock,
struct mg_add_sock_opts opts) { struct mg_add_sock_opts opts) {
struct mg_connection *nc = mg_create_connection(s, callback, opts); struct mg_connection *nc = mg_create_connection(s, callback, opts);
if (nc != NULL) { if (nc != NULL) {
mg_if_set_sock(nc, sock); mg_sock_set(nc, sock);
mg_add_conn(nc->mgr, nc); mg_add_conn(nc->mgr, nc);
} }
return nc; return nc;
} }
/* Associate a socket to a connection. */ /* Associate a socket to a connection. */
void mg_if_set_sock(struct mg_connection *nc, sock_t sock) { static void mg_sock_set(struct mg_connection *nc, sock_t sock) {
mg_set_non_blocking_mode(sock); mg_set_non_blocking_mode(sock);
mg_set_close_on_exec(sock); mg_set_close_on_exec(sock);
nc->sock = sock; nc->sock = sock;
......
...@@ -1044,10 +1044,11 @@ void mg_if_connect_cb(struct mg_connection *nc, int err); ...@@ -1044,10 +1044,11 @@ void mg_if_connect_cb(struct mg_connection *nc, int err);
/* Set up a listening TCP socket on a given address. rv = 0 -> ok. */ /* Set up a listening TCP socket on a given address. rv = 0 -> ok. */
int mg_if_listen_tcp(struct mg_connection *nc, union socket_address *sa); int mg_if_listen_tcp(struct mg_connection *nc, union socket_address *sa);
/* Deliver a new TCP connection. Returns != 0 in case on error (unable to /* Deliver a new TCP connection. Returns NULL in case on error (unable to
* create connection, in which case interface state should be removed. */ * create connection, in which case interface state should be discarded. */
int mg_if_accept_tcp_cb(struct mg_connection *lc, sock_t sock, struct mg_connection *mg_if_accept_tcp_cb(struct mg_connection *lc,
union socket_address *sa, size_t sa_len); union socket_address *sa,
size_t sa_len);
/* Request that a "listening" UDP socket be created. */ /* Request that a "listening" UDP socket be created. */
int mg_if_listen_udp(struct mg_connection *nc, union socket_address *sa); int mg_if_listen_udp(struct mg_connection *nc, union socket_address *sa);
...@@ -1075,8 +1076,6 @@ void mg_if_poll(struct mg_connection *nc, time_t now); ...@@ -1075,8 +1076,6 @@ void mg_if_poll(struct mg_connection *nc, time_t now);
/* Perform interface-related cleanup on connection before destruction. */ /* Perform interface-related cleanup on connection before destruction. */
void mg_if_destroy_conn(struct mg_connection *nc); void mg_if_destroy_conn(struct mg_connection *nc);
void mg_if_set_sock(struct mg_connection *nc, sock_t sock);
void mg_close_conn(struct mg_connection *nc); void mg_close_conn(struct mg_connection *nc);
#endif /* MG_NET_IF_HEADER_INCLUDED */ #endif /* MG_NET_IF_HEADER_INCLUDED */
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment