/*
- * Copyright (C) 2006-2007 Andre Noll <maan@systemlinux.org>
+ * Copyright (C) 2006-2008 Andre Noll <maan@systemlinux.org>
*
* Licensed under the GPL v2. For licencing details see COPYING.
*/
{
struct private_dccp_recv_data *pdd;
struct dccp_recv_args_info *conf = rn->conf;
- int ret = makesock(AF_UNSPEC, IPPROTO_DCCP, 0, conf->host_arg, conf->port_arg);
+ int fd, ret = makesock(AF_UNSPEC, IPPROTO_DCCP, 0, conf->host_arg,
+ conf->port_arg);
if (ret < 0)
return ret;
-
+ fd = ret;
+ /*
+ * Disable unused CCIDs: the receiver does not send any application
+ * data to the server. By shutting down this unused path we reduce
+ * internal processing costs, as the unused CCIDs (in the kernel) are
+ * then bypassed.
+ */
+ if (shutdown(fd, SHUT_WR) < 0) {
+ ret = -ERRNO_TO_PARA_ERROR(errno);
+ goto err;
+ }
+ ret = mark_fd_nonblocking(fd);
+ if (ret < 0)
+ goto err;
rn->buf = para_calloc(DCCP_BUFSIZE);
rn->private_data = pdd = para_calloc(sizeof(struct private_dccp_recv_data));
-
- pdd->fd = ret;
- mark_fd_nonblocking(pdd->fd);
+ pdd->fd = fd;
return 1;
+err:
+ close(fd);
+ return ret;
}
static void dccp_shutdown(void)