Skip to content
Snippets Groups Projects
Commit 948eff13 authored by Wesley W. Terpstra's avatar Wesley W. Terpstra
Browse files

Add an accept method for TCP support

parent 527abf52
Branches
Tags
No related merge requests found
...@@ -28,8 +28,6 @@ ...@@ -28,8 +28,6 @@
#ifndef EB_POSIX_IP_H #ifndef EB_POSIX_IP_H
#define EB_POSIX_IP_H #define EB_POSIX_IP_H
#include "../etherbone.h"
#ifdef __WIN32 #ifdef __WIN32
#define _WIN32_WINNT 0x0501 #define _WIN32_WINNT 0x0501
#include <winsock2.h> #include <winsock2.h>
...@@ -38,6 +36,7 @@ ...@@ -38,6 +36,7 @@
typedef int socklen_t; typedef int socklen_t;
typedef SOCKET eb_posix_sock_t; typedef SOCKET eb_posix_sock_t;
#else #else
#define _GNU_SOURCE
#include <sys/types.h> #include <sys/types.h>
#include <sys/socket.h> #include <sys/socket.h>
#include <sys/ioctl.h> #include <sys/ioctl.h>
...@@ -46,14 +45,19 @@ typedef SOCKET eb_posix_sock_t; ...@@ -46,14 +45,19 @@ typedef SOCKET eb_posix_sock_t;
#include <netinet/in.h> #include <netinet/in.h>
#include <netdb.h> #include <netdb.h>
#include <unistd.h> #include <unistd.h>
typedef eb_descriptor_t eb_posix_sock_t;
#endif #endif
#ifdef MSG_DONTWAIT #include "../etherbone.h"
typedef eb_descriptor_t eb_posix_sock_t;
#if defined(MSG_DONTWAIT) && defined(SOCK_NONBLOCK)
#define EB_POSIX_IP_NON_BLOCKING_NOOP #define EB_POSIX_IP_NON_BLOCKING_NOOP
#else #else
#ifndef MSG_DONTWAIT
#define MSG_DONTWAIT 0 #define MSG_DONTWAIT 0
#endif #endif
#endif
EB_PRIVATE void eb_posix_ip_close(eb_posix_sock_t sock); EB_PRIVATE void eb_posix_ip_close(eb_posix_sock_t sock);
EB_PRIVATE eb_posix_sock_t eb_posix_ip_open(int type, const char* port); EB_PRIVATE eb_posix_sock_t eb_posix_ip_open(int type, const char* port);
......
...@@ -45,6 +45,8 @@ eb_status_t eb_posix_tcp_open(struct eb_transport* transportp, const char* port) ...@@ -45,6 +45,8 @@ eb_status_t eb_posix_tcp_open(struct eb_transport* transportp, const char* port)
eb_posix_ip_close(sock); eb_posix_ip_close(sock);
return EB_ADDRESS; return EB_ADDRESS;
} }
eb_posix_ip_non_blocking(sock, 1);
transport = (struct eb_posix_tcp_transport*)transportp; transport = (struct eb_posix_tcp_transport*)transportp;
transport->port = sock; transport->port = sock;
...@@ -150,3 +152,31 @@ void eb_posix_tcp_send(struct eb_transport* transportp, struct eb_link* linkp, u ...@@ -150,3 +152,31 @@ void eb_posix_tcp_send(struct eb_transport* transportp, struct eb_link* linkp, u
send(link->socket, (const char*)buf, len, 0); send(link->socket, (const char*)buf, len, 0);
} }
int eb_posix_tcp_accept(struct eb_transport* transportp, struct eb_link* result_linkp) {
struct eb_posix_tcp_transport* transport;
struct eb_posix_tcp_link* result_link;
eb_posix_sock_t sock;
transport = (struct eb_posix_tcp_transport*)transportp;
#ifdef EB_POSIX_IP_NON_BLOCKING_NOOP
sock = accept4(transport->port, 0, 0, SOCK_NONBLOCK);
#else
sock = accept(transport->port, 0, 0);
#endif
if (sock == -1) {
if (errno != EAGAIN) return -1;
return 0;
}
if (result_linkp != 0) {
result_link = (struct eb_posix_tcp_link*)result_linkp;
result_link->socket = sock;
return 1;
} else {
eb_posix_ip_close(sock);
return 0;
}
}
...@@ -42,6 +42,7 @@ EB_PRIVATE eb_descriptor_t eb_posix_tcp_fdes(struct eb_transport*, struct eb_lin ...@@ -42,6 +42,7 @@ EB_PRIVATE eb_descriptor_t eb_posix_tcp_fdes(struct eb_transport*, struct eb_lin
EB_PRIVATE int eb_posix_tcp_poll(struct eb_transport* transportp, struct eb_link* linkp, uint8_t* buf, int len); EB_PRIVATE int eb_posix_tcp_poll(struct eb_transport* transportp, struct eb_link* linkp, uint8_t* buf, int len);
EB_PRIVATE int eb_posix_tcp_recv(struct eb_transport* transportp, struct eb_link* linkp, uint8_t* buf, int len); EB_PRIVATE int eb_posix_tcp_recv(struct eb_transport* transportp, struct eb_link* linkp, uint8_t* buf, int len);
EB_PRIVATE void eb_posix_tcp_send(struct eb_transport* transportp, struct eb_link* linkp, uint8_t* buf, int len); EB_PRIVATE void eb_posix_tcp_send(struct eb_transport* transportp, struct eb_link* linkp, uint8_t* buf, int len);
EB_PRIVATE int eb_posix_tcp_accept(struct eb_transport*, struct eb_link* result_link);
struct eb_posix_tcp_transport { struct eb_posix_tcp_transport {
/* Contents must fit in 9 bytes */ /* Contents must fit in 9 bytes */
......
...@@ -148,3 +148,8 @@ void eb_posix_udp_send(struct eb_transport* transportp, struct eb_link* linkp, u ...@@ -148,3 +148,8 @@ void eb_posix_udp_send(struct eb_transport* transportp, struct eb_link* linkp, u
else else
sendto(transport->socket, (const char*)buf, len, 0, (struct sockaddr*)link->sa, link->sa_len); sendto(transport->socket, (const char*)buf, len, 0, (struct sockaddr*)link->sa, link->sa_len);
} }
int eb_posix_udp_accept(struct eb_transport* transportp, struct eb_link* result_linkp) {
/* UDP does not make child connections */
return 0;
}
...@@ -42,6 +42,7 @@ EB_PRIVATE eb_descriptor_t eb_posix_udp_fdes(struct eb_transport*, struct eb_lin ...@@ -42,6 +42,7 @@ EB_PRIVATE eb_descriptor_t eb_posix_udp_fdes(struct eb_transport*, struct eb_lin
EB_PRIVATE int eb_posix_udp_poll(struct eb_transport* transportp, struct eb_link* linkp, uint8_t* buf, int len); EB_PRIVATE int eb_posix_udp_poll(struct eb_transport* transportp, struct eb_link* linkp, uint8_t* buf, int len);
EB_PRIVATE int eb_posix_udp_recv(struct eb_transport* transportp, struct eb_link* linkp, uint8_t* buf, int len); EB_PRIVATE int eb_posix_udp_recv(struct eb_transport* transportp, struct eb_link* linkp, uint8_t* buf, int len);
EB_PRIVATE void eb_posix_udp_send(struct eb_transport* transportp, struct eb_link* linkp, uint8_t* buf, int len); EB_PRIVATE void eb_posix_udp_send(struct eb_transport* transportp, struct eb_link* linkp, uint8_t* buf, int len);
EB_PRIVATE int eb_posix_udp_accept(struct eb_transport*, struct eb_link* result_link);
struct eb_posix_udp_transport { struct eb_posix_udp_transport {
/* Contents must fit in 9 bytes */ /* Contents must fit in 9 bytes */
......
...@@ -161,3 +161,8 @@ void eb_ssh_send(struct eb_transport* transportp, struct eb_link* linkp, uint8_t ...@@ -161,3 +161,8 @@ void eb_ssh_send(struct eb_transport* transportp, struct eb_link* linkp, uint8_t
send(link->socket, (const char*)buf, len, 0); send(link->socket, (const char*)buf, len, 0);
} }
int eb_ssh_accept(struct eb_transport* transportp, struct eb_link* result_linkp) {
/* SSH does not make child connections */
return 0;
}
...@@ -40,6 +40,7 @@ EB_PRIVATE eb_descriptor_t eb_ssh_fdes(struct eb_transport* transportp, struct e ...@@ -40,6 +40,7 @@ EB_PRIVATE eb_descriptor_t eb_ssh_fdes(struct eb_transport* transportp, struct e
EB_PRIVATE int eb_ssh_poll(struct eb_transport* transportp, struct eb_link* linkp, uint8_t* buf, int len); EB_PRIVATE int eb_ssh_poll(struct eb_transport* transportp, struct eb_link* linkp, uint8_t* buf, int len);
EB_PRIVATE int eb_ssh_recv(struct eb_transport* transportp, struct eb_link* linkp, uint8_t* buf, int len); EB_PRIVATE int eb_ssh_recv(struct eb_transport* transportp, struct eb_link* linkp, uint8_t* buf, int len);
EB_PRIVATE void eb_ssh_send(struct eb_transport* transportp, struct eb_link* linkp, uint8_t* buf, int len); EB_PRIVATE void eb_ssh_send(struct eb_transport* transportp, struct eb_link* linkp, uint8_t* buf, int len);
EB_PRIVATE int eb_ssh_accept(struct eb_transport*, struct eb_link* result_link);
struct eb_ssh_transport { struct eb_ssh_transport {
}; };
......
...@@ -61,9 +61,11 @@ struct eb_transport_ops { ...@@ -61,9 +61,11 @@ struct eb_transport_ops {
eb_descriptor_t (*fdes)(struct eb_transport*, struct eb_link* link); eb_descriptor_t (*fdes)(struct eb_transport*, struct eb_link* link);
/* IO functions. -1 means close link. 0 means no data at the moment. */ /* IO functions. -1 means close link. 0 means no data at the moment. */
int (*poll)(struct eb_transport*, struct eb_link* link, uint8_t* buf, int len); /* !!! somehow create device */ int (*poll)(struct eb_transport*, struct eb_link* link, uint8_t* buf, int len);
int (*recv)(struct eb_transport*, struct eb_link* link, uint8_t* buf, int len); int (*recv)(struct eb_transport*, struct eb_link* link, uint8_t* buf, int len);
void (*send)(struct eb_transport*, struct eb_link* link, uint8_t* buf, int len); void (*send)(struct eb_transport*, struct eb_link* link, uint8_t* buf, int len);
int (*accept)(struct eb_transport*, struct eb_link* result_link);
}; };
/* The table of all supported transports */ /* The table of all supported transports */
......
...@@ -42,7 +42,8 @@ struct eb_transport_ops eb_transports[] = { ...@@ -42,7 +42,8 @@ struct eb_transport_ops eb_transports[] = {
eb_posix_udp_fdes, eb_posix_udp_fdes,
eb_posix_udp_poll, eb_posix_udp_poll,
eb_posix_udp_recv, eb_posix_udp_recv,
eb_posix_udp_send eb_posix_udp_send,
eb_posix_udp_accept
}, },
{ {
EB_POSIX_TCP_MTU, EB_POSIX_TCP_MTU,
...@@ -53,7 +54,8 @@ struct eb_transport_ops eb_transports[] = { ...@@ -53,7 +54,8 @@ struct eb_transport_ops eb_transports[] = {
eb_posix_tcp_fdes, eb_posix_tcp_fdes,
eb_posix_tcp_poll, eb_posix_tcp_poll,
eb_posix_tcp_recv, eb_posix_tcp_recv,
eb_posix_tcp_send eb_posix_tcp_send,
eb_posix_tcp_accept
}, },
{ {
EB_SSH_MTU, EB_SSH_MTU,
...@@ -64,7 +66,8 @@ struct eb_transport_ops eb_transports[] = { ...@@ -64,7 +66,8 @@ struct eb_transport_ops eb_transports[] = {
eb_ssh_fdes, eb_ssh_fdes,
eb_ssh_poll, eb_ssh_poll,
eb_ssh_recv, eb_ssh_recv,
eb_ssh_send eb_ssh_send,
eb_ssh_accept
} }
}; };
......
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