- int ret;
- struct addrinfo *ai;
- char *tmp;
-
- rn->buf = para_calloc(DCCP_BUFSIZE);
- rn->private_data = para_calloc(sizeof(struct private_dccp_recv_data));
- pdd = rn->private_data;
- ret = dccp_get_socket();
- if (ret < 0)
- goto err_out;
- pdd->fd = ret;
-
- tmp = make_message("%d", conf->port_arg);
- ret = getaddrinfo(conf->host_arg, tmp, NULL, &ai);
- free(tmp);
- if (ret) {
- ret = -E_ADDR_INFO;
- goto err_out;
+ struct flowopts *fo = NULL;
+ uint8_t *ccids = NULL;
+ int fd, ret, i;
+
+ /* Copy CCID preference list (u8 array required) */
+ if (conf->ccid_given) {
+ ccids = para_malloc(conf->ccid_given);
+ fo = flowopt_new();
+
+ for (i = 0; i < conf->ccid_given; i++)
+ ccids[i] = conf->ccid_arg[i];
+
+ OPT_ADD(fo, SOL_DCCP, DCCP_SOCKOPT_CCID, ccids, i);
+ }
+
+ fd = makesock(IPPROTO_DCCP, 0, conf->host_arg, conf->port_arg, fo);
+ flowopt_cleanup(fo);
+ free(ccids);
+ if (fd < 0)
+ return fd;
+ /*
+ * 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;