Renamed socket API

This commit is contained in:
Daniele Lacamera 2024-10-29 07:46:40 +01:00
parent 1829548cd5
commit fe8a25b446
3 changed files with 49 additions and 41 deletions

View file

@ -54,16 +54,16 @@ typedef uint32_t socklen_t;
#endif #endif
#endif #endif
int posix_socket(struct ipstack *s, int domain, int type, int protocol); int ft_socket(struct ipstack *s, int domain, int type, int protocol);
int posix_bind(struct ipstack *s, int sockfd, const struct ipstack_sockaddr *addr, socklen_t addrlen); int ft_bind(struct ipstack *s, int sockfd, const struct ipstack_sockaddr *addr, socklen_t addrlen);
int posix_listen(struct ipstack *s, int sockfd, int backlog); int ft_listen(struct ipstack *s, int sockfd, int backlog);
int posix_accept(struct ipstack *s, int sockfd, struct ipstack_sockaddr *addr, socklen_t *addrlen); int ft_accept(struct ipstack *s, int sockfd, struct ipstack_sockaddr *addr, socklen_t *addrlen);
int posix_connect(struct ipstack *s, int sockfd, const struct ipstack_sockaddr *addr, socklen_t addrlen); int ft_connect(struct ipstack *s, int sockfd, const struct ipstack_sockaddr *addr, socklen_t addrlen);
int posix_sendto(struct ipstack *s, int sockfd, const void *buf, size_t len, int flags, const struct ipstack_sockaddr *dest_addr, socklen_t addrlen); int ft_sendto(struct ipstack *s, int sockfd, const void *buf, size_t len, int flags, const struct ipstack_sockaddr *dest_addr, socklen_t addrlen);
int posix_recvfrom(struct ipstack *s, int sockfd, void *buf, size_t len, int flags, struct ipstack_sockaddr *src_addr, socklen_t *addrlen); int ft_recvfrom(struct ipstack *s, int sockfd, void *buf, size_t len, int flags, struct ipstack_sockaddr *src_addr, socklen_t *addrlen);
int posix_close(struct ipstack *s, int sockfd); int ft_close(struct ipstack *s, int sockfd);
int posix_getpeername(struct ipstack *s, int sockfd, struct ipstack_sockaddr *addr, socklen_t *addrlen); int ft_getpeername(struct ipstack *s, int sockfd, struct ipstack_sockaddr *addr, socklen_t *addrlen);
int posix_getsockname(struct ipstack *s, int sockfd, struct ipstack_sockaddr *addr, socklen_t *addrlen); int ft_getsockname(struct ipstack *s, int sockfd, struct ipstack_sockaddr *addr, socklen_t *addrlen);
int dhcp_client_init(struct ipstack *s); int dhcp_client_init(struct ipstack *s);
int dhcp_bound(struct ipstack *s); int dhcp_bound(struct ipstack *s);

View file

@ -603,7 +603,7 @@ static struct ipstack_timer timers_binheap_pop(struct timers_binheap *heap)
heap->timers[j] = tmp; heap->timers[j] = tmp;
i = j; i = j;
} }
} while (tmr.expires == 0); } while ((tmr.expires == 0) && (heap->size > 0));
return tmr; return tmr;
} }
@ -1173,7 +1173,7 @@ static void close_socket(struct tsocket *ts)
} }
int posix_socket(struct ipstack *s, int domain, int type, int protocol) int ft_socket(struct ipstack *s, int domain, int type, int protocol)
{ {
struct tsocket *ts; struct tsocket *ts;
if (domain != AF_INET) if (domain != AF_INET)
@ -1193,7 +1193,7 @@ int posix_socket(struct ipstack *s, int domain, int type, int protocol)
return -1; return -1;
} }
int posix_connect(struct ipstack *s, int sockfd, const struct ipstack_sockaddr *addr, socklen_t addrlen) int ft_connect(struct ipstack *s, int sockfd, const struct ipstack_sockaddr *addr, socklen_t addrlen)
{ {
struct tsocket *ts; struct tsocket *ts;
struct ipstack_sockaddr_in *sin = (struct ipstack_sockaddr_in *)addr; struct ipstack_sockaddr_in *sin = (struct ipstack_sockaddr_in *)addr;
@ -1231,7 +1231,7 @@ int posix_connect(struct ipstack *s, int sockfd, const struct ipstack_sockaddr *
return -2; return -2;
} }
int posix_accept(struct ipstack *s, int sockfd, struct ipstack_sockaddr *addr, socklen_t *addrlen) int ft_accept(struct ipstack *s, int sockfd, struct ipstack_sockaddr *addr, socklen_t *addrlen)
{ {
struct tsocket *ts; struct tsocket *ts;
struct ipstack_sockaddr_in *sin = (struct ipstack_sockaddr_in *)addr; struct ipstack_sockaddr_in *sin = (struct ipstack_sockaddr_in *)addr;
@ -1276,7 +1276,7 @@ int posix_accept(struct ipstack *s, int sockfd, struct ipstack_sockaddr *addr, s
return -1;; return -1;;
} }
int posix_sendto(struct ipstack *s, int sockfd, const void *buf, size_t len, int flags, int ft_sendto(struct ipstack *s, int sockfd, const void *buf, size_t len, int flags,
const struct ipstack_sockaddr *dest_addr, socklen_t addrlen) const struct ipstack_sockaddr *dest_addr, socklen_t addrlen)
{ {
uint8_t frame[LINK_MTU]; uint8_t frame[LINK_MTU];
@ -1359,7 +1359,7 @@ int posix_sendto(struct ipstack *s, int sockfd, const void *buf, size_t len, int
} else return -1; } else return -1;
} }
int posix_recvfrom(struct ipstack *s, int sockfd, void *buf, size_t len, int flags, int ft_recvfrom(struct ipstack *s, int sockfd, void *buf, size_t len, int flags,
struct ipstack_sockaddr *src_addr, socklen_t *addrlen) struct ipstack_sockaddr *src_addr, socklen_t *addrlen)
{ {
uint32_t seg_len; uint32_t seg_len;
@ -1405,7 +1405,7 @@ int posix_recvfrom(struct ipstack *s, int sockfd, void *buf, size_t len, int fla
} else return -1; } else return -1;
} }
int posix_close(struct ipstack *s, int sockfd) int ft_close(struct ipstack *s, int sockfd)
{ {
if (sockfd & MARK_TCP_SOCKET) { if (sockfd & MARK_TCP_SOCKET) {
struct tsocket *ts = &s->tcpsockets[sockfd & ~MARK_TCP_SOCKET]; struct tsocket *ts = &s->tcpsockets[sockfd & ~MARK_TCP_SOCKET];
@ -1439,7 +1439,7 @@ int posix_close(struct ipstack *s, int sockfd)
return 0; return 0;
} }
int posix_getsockname(struct ipstack *s, int sockfd, struct ipstack_sockaddr *addr, socklen_t *addrlen) int ft_getsockname(struct ipstack *s, int sockfd, struct ipstack_sockaddr *addr, socklen_t *addrlen)
{ {
struct tsocket *ts = &s->tcpsockets[sockfd]; struct tsocket *ts = &s->tcpsockets[sockfd];
struct ipstack_sockaddr_in *sin = (struct ipstack_sockaddr_in *)addr; struct ipstack_sockaddr_in *sin = (struct ipstack_sockaddr_in *)addr;
@ -1451,7 +1451,7 @@ int posix_getsockname(struct ipstack *s, int sockfd, struct ipstack_sockaddr *ad
return 0; return 0;
} }
int posix_bind(struct ipstack *s, int sockfd, const struct ipstack_sockaddr *addr, socklen_t addrlen) int ft_bind(struct ipstack *s, int sockfd, const struct ipstack_sockaddr *addr, socklen_t addrlen)
{ {
struct tsocket *ts; struct tsocket *ts;
struct ipstack_sockaddr_in *sin = (struct ipstack_sockaddr_in *)addr; struct ipstack_sockaddr_in *sin = (struct ipstack_sockaddr_in *)addr;
@ -1479,7 +1479,7 @@ int posix_bind(struct ipstack *s, int sockfd, const struct ipstack_sockaddr *add
} }
int posix_listen(struct ipstack *s, int sockfd, int backlog) int ft_listen(struct ipstack *s, int sockfd, int backlog)
{ {
struct tsocket *ts; struct tsocket *ts;
(void)backlog; (void)backlog;
@ -1492,7 +1492,7 @@ int posix_listen(struct ipstack *s, int sockfd, int backlog)
return 0; return 0;
} }
int posix_getpeername(struct ipstack *s, int sockfd, struct ipstack_sockaddr *addr, socklen_t *addrlen) int ft_getpeername(struct ipstack *s, int sockfd, struct ipstack_sockaddr *addr, socklen_t *addrlen)
{ {
struct tsocket *ts = &s->tcpsockets[sockfd]; struct tsocket *ts = &s->tcpsockets[sockfd];
struct ipstack_sockaddr_in *sin = (struct ipstack_sockaddr_in *)addr; struct ipstack_sockaddr_in *sin = (struct ipstack_sockaddr_in *)addr;
@ -1646,7 +1646,7 @@ static int dhcp_poll(struct ipstack *s)
struct dhcp_msg msg; struct dhcp_msg msg;
int len; int len;
memset(&msg, 0xBB, sizeof(msg)); memset(&msg, 0xBB, sizeof(msg));
len = posix_recvfrom(s, s->dhcp_udp_sd, &msg, sizeof(struct dhcp_msg), 0, (struct ipstack_sockaddr *)&sin, &sl); len = ft_recvfrom(s, s->dhcp_udp_sd, &msg, sizeof(struct dhcp_msg), 0, (struct ipstack_sockaddr *)&sin, &sl);
if (len < 0) if (len < 0)
return -1; return -1;
if ((s->dhcp_state == DHCP_DISCOVER_SENT) && (dhcp_parse_offer(s, &msg) == 0)) if ((s->dhcp_state == DHCP_DISCOVER_SENT) && (dhcp_parse_offer(s, &msg) == 0))
@ -1708,7 +1708,7 @@ static int dhcp_send_request(struct ipstack *s)
sin.sin_port = ee16(DHCP_SERVER_PORT); sin.sin_port = ee16(DHCP_SERVER_PORT);
sin.sin_addr.s_addr = ee32(0xFFFFFFFF); /* Broadcast */ sin.sin_addr.s_addr = ee32(0xFFFFFFFF); /* Broadcast */
sin.sin_family = AF_INET; sin.sin_family = AF_INET;
posix_sendto(s, s->dhcp_udp_sd, &req, DHCP_HEADER_LEN + opt_sz, 0, ft_sendto(s, s->dhcp_udp_sd, &req, DHCP_HEADER_LEN + opt_sz, 0,
(struct ipstack_sockaddr *)&sin, sizeof(struct ipstack_sockaddr_in)); (struct ipstack_sockaddr *)&sin, sizeof(struct ipstack_sockaddr_in));
tmr.expires = s->last_tick + DHCP_REQUEST_TIMEOUT + (ipstack_getrandom() % 200); tmr.expires = s->last_tick + DHCP_REQUEST_TIMEOUT + (ipstack_getrandom() % 200);
tmr.arg = s; tmr.arg = s;
@ -1752,7 +1752,7 @@ static int dhcp_send_discover(struct ipstack *s)
sin.sin_port = ee16(DHCP_SERVER_PORT); sin.sin_port = ee16(DHCP_SERVER_PORT);
sin.sin_addr.s_addr = ee32(0xFFFFFFFF); /* Broadcast */ sin.sin_addr.s_addr = ee32(0xFFFFFFFF); /* Broadcast */
sin.sin_family = AF_INET; sin.sin_family = AF_INET;
posix_sendto(s, s->dhcp_udp_sd, &disc, DHCP_HEADER_LEN + opt_sz, 0, ft_sendto(s, s->dhcp_udp_sd, &disc, DHCP_HEADER_LEN + opt_sz, 0,
(struct ipstack_sockaddr *)&sin, sizeof(struct ipstack_sockaddr_in)); (struct ipstack_sockaddr *)&sin, sizeof(struct ipstack_sockaddr_in));
tmr.expires = s->last_tick + DHCP_DISCOVER_TIMEOUT + (ipstack_getrandom() % 200); tmr.expires = s->last_tick + DHCP_DISCOVER_TIMEOUT + (ipstack_getrandom() % 200);
tmr.arg = s; tmr.arg = s;
@ -1776,10 +1776,10 @@ int dhcp_client_init(struct ipstack *s)
s->dhcp_xid = ipstack_getrandom(); s->dhcp_xid = ipstack_getrandom();
if (s->dhcp_udp_sd > 0) { if (s->dhcp_udp_sd > 0) {
posix_close(s, s->dhcp_udp_sd); ft_close(s, s->dhcp_udp_sd);
} }
s->dhcp_udp_sd = posix_socket(s, AF_INET, IPSTACK_SOCK_DGRAM, IPPROTO_UDP); s->dhcp_udp_sd = ft_socket(s, AF_INET, IPSTACK_SOCK_DGRAM, IPPROTO_UDP);
if (s->dhcp_udp_sd < 0) { if (s->dhcp_udp_sd < 0) {
s->dhcp_state = DHCP_OFF; s->dhcp_state = DHCP_OFF;
return -1; return -1;
@ -1787,7 +1787,7 @@ int dhcp_client_init(struct ipstack *s)
memset(&sin, 0, sizeof(struct ipstack_sockaddr_in)); memset(&sin, 0, sizeof(struct ipstack_sockaddr_in));
sin.sin_family = AF_INET; sin.sin_family = AF_INET;
sin.sin_port = ee16(DHCP_CLIENT_PORT); sin.sin_port = ee16(DHCP_CLIENT_PORT);
if (posix_bind(s, s->dhcp_udp_sd, (struct ipstack_sockaddr *)&sin, sizeof(struct ipstack_sockaddr_in)) < 0) { if (ft_bind(s, s->dhcp_udp_sd, (struct ipstack_sockaddr *)&sin, sizeof(struct ipstack_sockaddr_in)) < 0) {
s->dhcp_state = DHCP_OFF; s->dhcp_state = DHCP_OFF;
return -1; return -1;
} }

View file

@ -145,7 +145,7 @@ uint32_t ipstack_getrandom(void)
return ret; return ret;
} }
#define BUFFER_SIZE TEST_SIZE #define BUFFER_SIZE TEST_SIZE
static int test_echoserver_closewait(struct ipstack *s) static int test_echoserver(struct ipstack *s, int active_close)
{ {
int fd, ret; int fd, ret;
int client_fd = -1; int client_fd = -1;
@ -156,11 +156,11 @@ static int test_echoserver_closewait(struct ipstack *s)
.sin_port = ee16(8), /* Echo */ .sin_port = ee16(8), /* Echo */
.sin_addr.s_addr = 0 .sin_addr.s_addr = 0
}; };
fd = posix_socket(s, AF_INET, IPSTACK_SOCK_STREAM, 0); fd = ft_socket(s, AF_INET, IPSTACK_SOCK_STREAM, 0);
printf("socket: %04x\n", fd); printf("socket: %04x\n", fd);
ret = posix_bind(s, fd, (struct ipstack_sockaddr *)&local_sock, sizeof(local_sock)); ret = ft_bind(s, fd, (struct ipstack_sockaddr *)&local_sock, sizeof(local_sock));
printf("bind: %d\n", ret); printf("bind: %d\n", ret);
ret = posix_listen(s, fd, 1); ret = ft_listen(s, fd, 1);
printf("listen: %d\n", ret); printf("listen: %d\n", ret);
while(1) { while(1) {
@ -176,22 +176,22 @@ static int test_echoserver_closewait(struct ipstack *s)
else break; else break;
} }
if (client_fd < 0) { if (client_fd < 0) {
client_fd = posix_accept(s, fd, NULL, NULL); client_fd = ft_accept(s, fd, NULL, NULL);
if (client_fd > 0) { if (client_fd > 0) {
printf("accept: %04x\n", client_fd); printf("accept: %04x\n", client_fd);
} }
} else { } else {
if (ret <= 0) { if (ret <= 0) {
ret = posix_recvfrom(s, client_fd, buf, sizeof(buf), 0, NULL, NULL); ret = ft_recvfrom(s, client_fd, buf, sizeof(buf), 0, NULL, NULL);
if (ret == -11) if (ret == -11)
continue; /* Call again */ continue; /* Call again */
if (ret < 0) { if (ret < 0) {
printf("Recv error: %d\n", ret); printf("Recv error: %d\n", ret);
posix_close(s, client_fd); ft_close(s, client_fd);
return -1; return -1;
} else if (ret == 0) { } else if (ret == 0) {
printf("Client side closed the connection.\n"); printf("Client side closed the connection.\n");
posix_close(s, client_fd); ft_close(s, client_fd);
client_fd = -1; client_fd = -1;
printf("Server: Exiting.\n"); printf("Server: Exiting.\n");
exit_ok = 1; exit_ok = 1;
@ -202,12 +202,12 @@ static int test_echoserver_closewait(struct ipstack *s)
} }
if (ret > 0) { if (ret > 0) {
int snd_ret; int snd_ret;
snd_ret = posix_sendto(s, client_fd, buf + tot_sent, ret - tot_sent, 0, NULL, 0); snd_ret = ft_sendto(s, client_fd, buf + tot_sent, ret - tot_sent, 0, NULL, 0);
if (snd_ret == -11) if (snd_ret == -11)
continue; /* Call again */ continue; /* Call again */
if (snd_ret < 0) { if (snd_ret < 0) {
printf("Send error: %d\n", snd_ret); printf("Send error: %d\n", snd_ret);
posix_close(s, client_fd); ft_close(s, client_fd);
return 0; return 0;
} }
@ -219,11 +219,18 @@ static int test_echoserver_closewait(struct ipstack *s)
} }
} }
} }
if ((tot_sent >= 8192) && active_close) {
ft_close(s, client_fd);
client_fd = -1;
printf("Server: Exiting.\n");
exit_ok = 1;
continue;
}
} }
return 0; return 0;
} }
static void *pt_echoclient_closing(void *arg) void *pt_echoclient_closing(void *arg)
{ {
int fd, ret; int fd, ret;
unsigned total_r = 0; unsigned total_r = 0;
@ -292,13 +299,15 @@ int main(int argc, char **argv)
ip4 ip = 0, nm = 0, gw = 0; ip4 ip = 0, nm = 0, gw = 0;
uint32_t srv_ip; uint32_t srv_ip;
int ret, test_ret; int ret, test_ret = 0;
(void)argc; (void)argc;
(void)argv; (void)argv;
(void)ip; (void)ip;
(void)nm; (void)nm;
(void)gw; (void)gw;
(void)tv; (void)tv;
(void)pt;
(void)srv_ip;
ipstack_init_static(&s); ipstack_init_static(&s);
tapdev = ipstack_getdev(s); tapdev = ipstack_getdev(s);
if (!tapdev) if (!tapdev)
@ -311,7 +320,6 @@ int main(int argc, char **argv)
} }
system("tcpdump -i femt0 -w test.pcap &"); system("tcpdump -i femt0 -w test.pcap &");
sleep(1);
#ifdef DHCP #ifdef DHCP
gettimeofday(&tv, NULL); gettimeofday(&tv, NULL);
@ -336,7 +344,7 @@ int main(int argc, char **argv)
pthread_create(&pt, NULL, pt_echoclient_closing, &srv_ip); pthread_create(&pt, NULL, pt_echoclient_closing, &srv_ip);
printf("Starting test: echo server close-wait\n"); printf("Starting test: echo server close-wait\n");
ret = test_echoserver_closewait(s); ret = test_echoserver(s, 0);
pthread_join(pt, (void **)&test_ret); pthread_join(pt, (void **)&test_ret);
printf("Test echo server close-wait: %d\n", ret); printf("Test echo server close-wait: %d\n", ret);
printf("Test linux client: %d\n", test_ret); printf("Test linux client: %d\n", test_ret);