X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=blobdiff_plain;f=dccp_send.c;h=496895a509f15466e7430af454c784a09bc3ce7e;hp=61d42126f95ffc98cf10b33c3c286f7082d44692;hb=4643fd6eeee81acc0e82e47e7895a3111775bbba;hpb=8d106ca317a2c42f35a86ba244f843688f6939e6 diff --git a/dccp_send.c b/dccp_send.c index 61d42126..496895a5 100644 --- a/dccp_send.c +++ b/dccp_send.c @@ -1,8 +1,4 @@ -/* - * Copyright (C) 2006 Andre Noll - * - * Licensed under the GPL v2. For licencing details see COPYING. - */ +/* Copyright (C) 2006 Andre Noll , see file COPYING. */ /** \file dccp_send.c Paraslash's dccp sender. */ @@ -25,16 +21,13 @@ #include "error.h" #include "string.h" #include "afh.h" -#include "server.h" #include "net.h" +#include "server.h" #include "list.h" #include "send.h" #include "sched.h" #include "vss.h" #include "fd.h" -#include "close_on_fork.h" -#include "chunk_queue.h" -#include "acl.h" static struct sender_status dccp_sender_status, *dss = &dccp_sender_status; @@ -46,8 +39,11 @@ struct dccp_fec_client { static void dccp_pre_select(int *max_fileno, fd_set *rfds, __a_unused fd_set *wfds) { - if (dss->listen_fd >= 0) - para_fd_set(dss->listen_fd, rfds, max_fileno); + unsigned n; + + FOR_EACH_LISTEN_FD(n, dss) + if (dss->listen_fds[n] >= 0) + para_fd_set(dss->listen_fds[n], rfds, max_fileno); } /** @@ -87,6 +83,12 @@ static void dccp_shutdown_clients(void) dccp_shutdown_client(sc); } +static void dccp_shutdown(void) +{ + dccp_shutdown_clients(); + generic_acl_deplete(&dss->acl); +} + /** * Obtain current MPS according to RFC 4340, sec. 14. */ static int dccp_init_fec(struct sender_client *sc) { @@ -138,7 +140,7 @@ static void dccp_post_select(fd_set *rfds, __a_unused fd_set *wfds) /* * Bypass unused CCID paths: the sender does not receive application data * from the client; by shutting down this unused communication path we can - * reduce processing costs a bit. See analogous comment in dccp_recv.c. + * reduce processing costs a bit. See analogous comment in \ref dccp_recv.c. */ if (shutdown(sc->fd, SHUT_RD) < 0) { PARA_WARNING_LOG("%s\n", strerror(errno)); @@ -165,7 +167,8 @@ static void dccp_post_select(fd_set *rfds, __a_unused fd_set *wfds) static int dccp_com_on(__a_unused struct sender_command_data *scd) { - return generic_com_on(dss, IPPROTO_DCCP); + generic_com_on(dss, IPPROTO_DCCP); + return 1; } static int dccp_com_off(__a_unused struct sender_command_data *scd) @@ -218,36 +221,40 @@ static char *dccp_status(void) return result; } -/** - * The init function of the dccp sender. - * - * \param s pointer to the dccp sender struct. - * - * It initializes all function pointers of \a s and starts - * listening on the given port. +/* + * Initialize the client list and the access control list and listen on the + * dccp port. */ -void dccp_send_init(struct sender *s) +static void dccp_send_init(void) { - int ret; - - s->status = dccp_status; - s->send = NULL; - s->pre_select = dccp_pre_select; - s->post_select = dccp_post_select; - s->shutdown_clients = dccp_shutdown_clients; - s->resolve_target = NULL; - s->help = generic_sender_help; - s->client_cmds[SENDER_on] = dccp_com_on; - s->client_cmds[SENDER_off] = dccp_com_off; - s->client_cmds[SENDER_deny] = dccp_com_deny; - s->client_cmds[SENDER_allow] = dccp_com_allow; - s->client_cmds[SENDER_add] = NULL; - s->client_cmds[SENDER_delete] = NULL; - init_sender_status(dss, OPT_RESULT(DCCP_ACCESS), + OPT_RESULT(DCCP_LISTEN_ADDRESS), OPT_UINT32_VAL(DCCP_PORT), OPT_UINT32_VAL(DCCP_MAX_CLIENTS), OPT_GIVEN(DCCP_DEFAULT_DENY)); - ret = generic_com_on(dss, IPPROTO_DCCP); - if (ret < 0) - PARA_ERROR_LOG("%s\n", para_strerror(-ret)); + generic_com_on(dss, IPPROTO_DCCP); } + +/** + * The DCCP sender. + * + * This sender offers congestion control not available in plain TCP. Most + * methods of the sender structure are implemented as simple wrappers for the + * generic functions defined in \ref send_common.c. Like UDP streams, DCCP + * streams are sent FEC-encoded. + */ +const struct sender dccp_sender = { + .name = "dccp", + .init = dccp_send_init, + .shutdown = dccp_shutdown, + .pre_select = dccp_pre_select, + .post_select = dccp_post_select, + .shutdown_clients = dccp_shutdown_clients, + .client_cmds = { + [SENDER_on] = dccp_com_on, + [SENDER_off] = dccp_com_off, + [SENDER_deny] = dccp_com_deny, + [SENDER_allow] = dccp_com_allow, + }, + .help = generic_sender_help, + .status = dccp_status, +};