X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=blobdiff_plain;f=dccp_send.c;h=2821b21ca8b96bc4e0d596689473d6e7e7bfcf7d;hp=ed03b6140d3854710b85355f68165f6316f878ce;hb=ac4e01ba1a2f302bf31dd511a7aff8da78660b15;hpb=36ec2a43a7d9c085f16544e282a439cdbaec1e00 diff --git a/dccp_send.c b/dccp_send.c index ed03b614..2821b21c 100644 --- a/dccp_send.c +++ b/dccp_send.c @@ -1,8 +1,4 @@ -/* - * Copyright (C) 2006-2014 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. */ @@ -15,16 +11,16 @@ #include #include #include -#include #include #include #include +#include +#include "server.lsg.h" #include "para.h" #include "error.h" #include "string.h" #include "afh.h" -#include "afs.h" #include "server.h" #include "net.h" #include "list.h" @@ -34,7 +30,6 @@ #include "fd.h" #include "close_on_fork.h" #include "chunk_queue.h" -#include "server.cmdline.h" #include "acl.h" static struct sender_status dccp_sender_status, *dss = &dccp_sender_status; @@ -93,6 +88,7 @@ static int dccp_init_fec(struct sender_client *sc) { int mps, ret; socklen_t ml = sizeof(mps); + uint32_t mss; /* max slize size */ /* If call fails, return some sensible minimum value */ ret = getsockopt(sc->fd, SOL_DCCP, DCCP_SOCKOPT_GET_CUR_MPS, &mps, &ml); @@ -102,8 +98,9 @@ static int dccp_init_fec(struct sender_client *sc) } PARA_INFO_LOG("current MPS = %d bytes\n", mps); assert(mps > 0); - if (conf.dccp_max_slice_size_arg > 0) - mps = PARA_MIN(mps, conf.dccp_max_slice_size_arg); + mss = OPT_UINT32_VAL(DCCP_MAX_SLICE_SIZE); + if (mss > 0 && mss <= INT_MAX) + mps = PARA_MIN(mps, (int)mss); return mps; } @@ -120,6 +117,7 @@ static void dccp_post_select(fd_set *rfds, __a_unused fd_set *wfds) struct sender_client *sc; struct dccp_fec_client *dfc; int tx_ccid; + uint32_t k, n; sc = accept_sender_client(dss, rfds); if (!sc) @@ -136,7 +134,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)); @@ -145,8 +143,16 @@ static void dccp_post_select(fd_set *rfds, __a_unused fd_set *wfds) } dfc = para_calloc(sizeof(*dfc)); sc->private_data = dfc; - dfc->fcp.data_slices_per_group = conf.dccp_data_slices_per_group_arg; - dfc->fcp.slices_per_group = conf.dccp_slices_per_group_arg; + k = OPT_UINT32_VAL(DCCP_DATA_SLICES_PER_GROUP); + n = OPT_UINT32_VAL(DCCP_SLICES_PER_GROUP); + if (k == 0 || n == 0 || k >= n) { + PARA_WARNING_LOG("invalid FEC parameters, using defaults\n"); + dfc->fcp.data_slices_per_group = 3; + dfc->fcp.slices_per_group = 4; + } else { + dfc->fcp.data_slices_per_group = k; + dfc->fcp.slices_per_group = n; + } dfc->fcp.init_fec = dccp_init_fec; dfc->fcp.send_fec = dccp_send_fec; dfc->fcp.need_periodic_header = false; @@ -199,54 +205,52 @@ static const char *dccp_list_available_ccids(void) return list; } -static char *dccp_info(void) +static char *dccp_status(void) { - char *info = get_sender_info(dss, "dccp"); - char *ret = make_message("%s" "\tsupported ccids: %s\n", - info, dccp_list_available_ccids()); - free(info); - return ret; + char *status = generic_sender_status(dss, "dccp"); + char *result = make_message("%ssupported ccids: %s\n", status, + dccp_list_available_ccids()); + free(status); + 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, k, n; - - s->info = dccp_info; - 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; - - k = conf.dccp_data_slices_per_group_arg; - n = conf.dccp_slices_per_group_arg; - - if (k <= 0 || n <= 0 || k >= n) { - PARA_WARNING_LOG("invalid FEC parameters, using defaults\n"); - conf.dccp_data_slices_per_group_arg = 3; - conf.dccp_slices_per_group_arg = 4; - } + int ret; - init_sender_status(dss, conf.dccp_access_arg, conf.dccp_access_given, - conf.dccp_port_arg, conf.dccp_max_clients_arg, - conf.dccp_default_deny_given); + init_sender_status(dss, OPT_RESULT(DCCP_ACCESS), + 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)); } + +/** + * 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_clients, + .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, +};