X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=blobdiff_plain;f=dccp_send.c;h=92dd933347d2c48d857355da34c13673da54968b;hp=77bee09783ad2cd46b7a55a70722b2dc5ffc4c93;hb=5e8d8a8eea6de9459ebdf4498f9f061c84bfa63a;hpb=1fa9dbea57d2dbc5d9b728a83a583c3a8f675410 diff --git a/dccp_send.c b/dccp_send.c index 77bee097..92dd9333 100644 --- a/dccp_send.c +++ b/dccp_send.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2006-2010 Andre Noll + * Copyright (C) 2006 Andre Noll * * Licensed under the GPL v2. For licencing details see COPYING. */ @@ -11,20 +11,23 @@ * (C) 2005 Ian McDonald */ +#include +#include #include #include -#include -#include +#include +#include +#include #include "para.h" #include "error.h" #include "string.h" #include "afh.h" -#include "afs.h" #include "server.h" #include "net.h" #include "list.h" #include "send.h" +#include "sched.h" #include "vss.h" #include "fd.h" #include "close_on_fork.h" @@ -97,16 +100,17 @@ 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); return mps; } -static int dccp_send_fec(struct sender_client *sc, char *buf, size_t len) +static void dccp_send_fec(struct sender_client *sc, char *buf, size_t len) { - int ret = write_nonblock(sc->fd, buf, len, 0); + int ret = xwrite(sc->fd, buf, len); if (ret < 0) dccp_shutdown_client(sc); - return ret; } static void dccp_post_select(fd_set *rfds, __a_unused fd_set *wfds) @@ -139,10 +143,11 @@ static void dccp_post_select(fd_set *rfds, __a_unused fd_set *wfds) } dfc = para_calloc(sizeof(*dfc)); sc->private_data = dfc; - dfc->fcp.slices_per_group = 4; - dfc->fcp.data_slices_per_group = 3; + dfc->fcp.data_slices_per_group = conf.dccp_data_slices_per_group_arg; + dfc->fcp.slices_per_group = conf.dccp_slices_per_group_arg; dfc->fcp.init_fec = dccp_init_fec; dfc->fcp.send_fec = dccp_send_fec; + dfc->fcp.need_periodic_header = false; dfc->fc = vss_add_fec_client(sc, &dfc->fcp); } @@ -153,6 +158,7 @@ static int dccp_com_on(__a_unused struct sender_command_data *scd) static int dccp_com_off(__a_unused struct sender_command_data *scd) { + dccp_shutdown_clients(); generic_com_off(dss); return 1; } @@ -191,13 +197,13 @@ 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; } /** @@ -210,20 +216,30 @@ static char *dccp_info(void) */ void dccp_send_init(struct sender *s) { - int ret; + int ret, k, n; - s->info = dccp_info; + 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; + 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; + } init_sender_status(dss, conf.dccp_access_arg, conf.dccp_access_given, conf.dccp_port_arg, conf.dccp_max_clients_arg,