X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=blobdiff_plain;f=dccp_send.c;h=77bee09783ad2cd46b7a55a70722b2dc5ffc4c93;hp=0657d11cbe00b55184fa2e612e2f5ffa24acbdae;hb=1fa9dbea57d2dbc5d9b728a83a583c3a8f675410;hpb=666243e5776fd4609ef81ec6781f9eb9d9999700;ds=sidebyside diff --git a/dccp_send.c b/dccp_send.c index 0657d11c..77bee097 100644 --- a/dccp_send.c +++ b/dccp_send.c @@ -32,9 +32,6 @@ #include "server.cmdline.h" #include "acl.h" -/** Do not write more than that many bytes at once. */ -#define DCCP_MAX_BYTES_PER_WRITE 1024 - static struct sender_status dccp_sender_status, *dss = &dccp_sender_status; struct dccp_fec_client { @@ -86,9 +83,26 @@ static void dccp_shutdown_clients(void) dccp_shutdown_client(sc); } +/** * Obtain current MPS according to RFC 4340, sec. 14. */ +static int dccp_init_fec(struct sender_client *sc) +{ + int mps, ret; + socklen_t ml = sizeof(mps); + + /* If call fails, return some sensible minimum value */ + ret = getsockopt(sc->fd, SOL_DCCP, DCCP_SOCKOPT_GET_CUR_MPS, &mps, &ml); + if (ret < 0) { + PARA_NOTICE_LOG("can not determine MPS: %s\n", strerror(errno)); + mps = generic_max_transport_msg_size(sc->fd) - DCCP_MAX_HEADER; + } + PARA_INFO_LOG("current MPS = %d bytes\n", mps); + assert(mps > 0); + return mps; +} + static int dccp_send_fec(struct sender_client *sc, char *buf, size_t len) { - int ret = write_nonblock(sc->fd, buf, len, DCCP_MAX_BYTES_PER_WRITE); + int ret = write_nonblock(sc->fd, buf, len, 0); if (ret < 0) dccp_shutdown_client(sc); @@ -127,8 +141,7 @@ static void dccp_post_select(fd_set *rfds, __a_unused fd_set *wfds) sc->private_data = dfc; dfc->fcp.slices_per_group = 4; dfc->fcp.data_slices_per_group = 3; - dfc->fcp.max_slice_bytes = DCCP_MAX_BYTES_PER_WRITE; /* FIXME */ - dfc->fcp.init_fec = NULL; /* FIXME */ + dfc->fcp.init_fec = dccp_init_fec; dfc->fcp.send_fec = dccp_send_fec; dfc->fc = vss_add_fec_client(sc, &dfc->fcp); }