X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=blobdiff_plain;f=dccp_send.c;h=55f189ad4eb01632dbcd653e104ef7f0cfe54ff8;hp=bd6c0257e432161c3d468505ec275638c70f010e;hb=HEAD;hpb=b0ec08945c28e35558ed85691b57f314724f7613 diff --git a/dccp_send.c b/dccp_send.c index bd6c0257..6182c964 100644 --- a/dccp_send.c +++ b/dccp_send.c @@ -21,11 +21,11 @@ #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 "send.h" #include "vss.h" #include "fd.h" @@ -36,13 +36,19 @@ struct dccp_fec_client { struct fec_client *fc; }; -static void dccp_pre_select(int *max_fileno, fd_set *rfds, - __a_unused fd_set *wfds) +static void dccp_pre_monitor(struct sched *s) { - 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) + sched_monitor_readfd(dss->listen_fds[n], s); } +#ifndef DCCP_SOCKOPT_TX_CCID +#define DCCP_SOCKOPT_TX_CCID 14 /**< Set/get the TX CCID. */ +#endif + /** * Query the TX CCID used on the sender-client half connection. * \param sockfd Server socket descriptor to query (after accept(2)). @@ -80,6 +86,20 @@ static void dccp_shutdown_clients(void) dccp_shutdown_client(sc); } +static void dccp_shutdown(void) +{ + dccp_shutdown_clients(); + generic_acl_deplete(&dss->acl); + free_sender_status(dss); +} + +#ifndef DCCP_SOCKOPT_GET_CUR_MPS +#define DCCP_SOCKOPT_GET_CUR_MPS 5 /**< Max packet size, RFC 4340, 14. */ +#endif + +/** Estimated worst-case length of a DCCP header including options. */ +#define DCCP_MAX_HEADER 128 + /** * Obtain current MPS according to RFC 4340, sec. 14. */ static int dccp_init_fec(struct sender_client *sc) { @@ -109,14 +129,14 @@ static void dccp_send_fec(struct sender_client *sc, char *buf, size_t len) dccp_shutdown_client(sc); } -static void dccp_post_select(fd_set *rfds, __a_unused fd_set *wfds) +static void dccp_post_monitor(__a_unused struct sched *s) { struct sender_client *sc; struct dccp_fec_client *dfc; int tx_ccid; uint32_t k, n; - sc = accept_sender_client(dss, rfds); + sc = accept_sender_client(dss); if (!sc) return; @@ -138,7 +158,7 @@ static void dccp_post_select(fd_set *rfds, __a_unused fd_set *wfds) shutdown_client(sc, dss); return; } - dfc = para_calloc(sizeof(*dfc)); + dfc = zalloc(sizeof(*dfc)); sc->private_data = dfc; k = OPT_UINT32_VAL(DCCP_DATA_SLICES_PER_GROUP); n = OPT_UINT32_VAL(DCCP_SLICES_PER_GROUP); @@ -158,7 +178,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) @@ -217,14 +238,13 @@ static char *dccp_status(void) */ static void dccp_send_init(void) { - int ret; - 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)); + if (OPT_GIVEN(DCCP_NO_AUTOSTART)) + return; + generic_com_on(dss, IPPROTO_DCCP); } /** @@ -238,9 +258,9 @@ static void dccp_send_init(void) 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 = dccp_shutdown, + .pre_monitor = dccp_pre_monitor, + .post_monitor = dccp_post_monitor, .shutdown_clients = dccp_shutdown_clients, .client_cmds = { [SENDER_on] = dccp_com_on,