#include <forb/config.h>
#include "discovery.h"
#include <stdlib.h>
+#include <netinet/tcp.h>
#include "iop.h" /* FIXME: Sending hello should be handled in IOP layer */
/**
return ret;
}
-int setnonblocking(int fd);
+static int
+setnonblocking(int fd);
+
+static int
+setnodelay(int fd)
+{
+ int ret = 0;
+#if 0 /* For nice graphs in benchmarks */
+ int yes = 1;
+ ret = setsockopt(fd, IPPROTO_TCP, TCP_NODELAY, &yes, sizeof(yes));
+ if (ret < 0) {
+ ul_logerr("setsockopt(TCP_NODELAY): %s\n", strerror(errno));
+ }
+#endif
+ return ret;
+
+}
static int
inet_connect(forb_peer_t *peer)
sa.sin_family = AF_INET;
sa.sin_port = addr->port;
sa.sin_addr = addr->addr;
- ul_logdeb("connect to %s:%u\n", inet_ntoa(sa.sin_addr), ntohs(sa.sin_port));
+ ul_logtrash("connect to %s:%u\n", inet_ntoa(sa.sin_addr), ntohs(sa.sin_port));
ret = connect(ipeer->socket, (struct sockaddr*)&sa, sizeof(sa));
if (ret) {
ul_logerr("connect error: %s\n", strerror(errno));
}
setnonblocking(ipeer->socket);
+ setnodelay(ipeer->socket);
struct epoll_event ev;
struct inet_port *p = peer->port->desc.proto_priv;
}
sent = 0;
- ul_logdeb("send fd=%d len=%d\n", ipeer->socket, len);
+ ul_logtrash("send fd=%d len=%zu\n", ipeer->socket, len);
do {
ret = send(ipeer->socket, buf, len, 0);
if (ret < 0) {
close(client);
return -1;
}
+ setnodelay(client);
peer = forb_peer_new();
if (peer) {
if (ipeer->socket == iport->last_recv_fd) {
inet_port_new_peer_delete(iport, peer);
- if (port->new_peer) forb_peer_put(peer);
+ if (port->new_peer)
+ forb_peer_put(port->new_peer);
/* Let the upper layer assign forb ID
* to this peer according to the request*/
forb_peer_put(peer);
port->new_peer = NULL;
}
- ul_logdeb("recv fd=%d disconnect\n", iport->last_recv_fd);
+ ul_logtrash("recv fd=%d disconnect\n", iport->last_recv_fd);
ul_list_for_each(forb_port_peer, port, peer) {
struct inet_peer *ipeer = peer->proto_priv;
if (ipeer && ipeer->socket == iport->last_recv_fd) {
iport->last_recv_fd = -1;
continue;
}
- ul_logdeb("recv fd=%d len=%d\n", iport->last_recv_fd, ret);
+ ul_logtrash("recv fd=%d len=%zd\n", iport->last_recv_fd, ret);
return ret;
}
#else
inet_port_destroy(forb_port_t * port)
{
struct inet_port *pd = port->desc.proto_priv;
+ forb_peer_t *peer;
close(pd->epoll_fd);
close(pd->udp_socket);
close(pd->listen_socket);
+ ul_list_for_each_cut(inet_port_new_peer, pd, peer) {
+ forb_peer_put(peer);
+ }
forb_free(pd);
return 0;
}
+#ifndef CONFIG_FORB_PROTO_INET_DEFAULT
static ssize_t
inet_broadcast(forb_port_t *port, const void *buf, size_t len)
{
(struct sockaddr*)&addr, sizeof(addr));
return ret;
}
+#endif
static void
inet_peer_destroy(forb_peer_t *peer)
struct inet_peer *ipeer = peer->proto_priv;
if (ipeer) {
peer->proto_priv = NULL;
- ul_logdeb("destroying peer fd=%d\n", ipeer->socket);
+ ul_logtrash("destroying peer fd=%d (orb_id=%s)\n",
+ ipeer->socket, peer->orb_id);
close(ipeer->socket);
free(ipeer);
}
.peer_destroy = inet_peer_destroy,
.send = inet_send,
.recv = inet_recv,
+#ifndef CONFIG_FORB_PROTO_INET_DEFAULT
.broadcast = inet_broadcast,
+#endif
.serialize_addr = inet_serialize_addr,
.deserialize_addr = inet_deserialize_addr,
.addr2str = inet_addr2str,