From: RĂ©mi Denis-Courmont Date: Sun, 9 Sep 2007 19:20:39 +0000 (+0000) Subject: net_SetCSCov: sets checksum coverages of a socket X-Git-Tag: 0.9.0-test0~5722 X-Git-Url: https://git.sesse.net/?a=commitdiff_plain;h=27e278ee0e34434f8e0eec351101c1307639e848;p=vlc net_SetCSCov: sets checksum coverages of a socket --- diff --git a/include/vlc_network.h b/include/vlc_network.h index 020af68075..96bbe3c85c 100644 --- a/include/vlc_network.h +++ b/include/vlc_network.h @@ -116,6 +116,8 @@ VLC_EXPORT( void, net_ListenClose, ( int *fd ) ); int net_Subscribe (vlc_object_t *obj, int fd, const struct sockaddr *addr, socklen_t addrlen); +VLC_EXPORT( int, net_SetCSCov, ( int fd, int sendcov, int recvcov ) ); + /* Functions to read from or write to the networking layer */ struct virtual_socket_t { diff --git a/src/libvlc.sym b/src/libvlc.sym index 8586d75dbc..2a3959a0fa 100644 --- a/src/libvlc.sym +++ b/src/libvlc.sym @@ -22,6 +22,7 @@ vlc_b64_encode __net_Connect __net_ConnectDgram __net_OpenDgram +net_SetCSCov vlc_module_set vlc_submodule_create libvlc_InternalCleanup diff --git a/src/network/udp.c b/src/network/udp.c index 6874ee21d3..a7aa0b3e39 100644 --- a/src/network/udp.c +++ b/src/network/udp.c @@ -60,7 +60,34 @@ # define SOL_IPV6 IPPROTO_IPV6 #endif #ifndef IPPROTO_IPV6 -# define IPPROTO_IPV6 41 +# define IPPROTO_IPV6 41 /* IANA */ +#endif +#ifndef SOL_DCCP +# define SOL_DCCP IPPROTO_DCCP +#endif +#ifndef IPPROTO_DCCP +# define IPPROTO_DCCP 33 /* IANA */ +#endif +#ifndef SOL_UDPLITE +# define SOL_UDPLITE IPPROTO_UDPLITE +#endif +#ifndef IPPROTO_UDPLITE +# define IPPROTO_UDPLITE 136 /* IANA */ +#endif + +#ifdef __linux__ +# include +# ifndef SOCK_DCCP /* provisional API */ +# define SOCK_DCCP 6 +# endif +#endif + +#if defined (HAVE_NETINET_UDPLITE_H) +# include +#elif defined (__linux__) +/* still missing from glibc 2.6 */ +# define UDPLITE_SEND_CSCOV 10 +# define UDPLITE_RECV_CSCOV 11 #endif extern int net_Socket( vlc_object_t *p_this, int i_family, int i_socktype, @@ -802,3 +829,65 @@ int __net_OpenDgram( vlc_object_t *obj, const char *psz_bind, int i_bind, return val; } + +/** + * net_SetCSCov: + * Sets the send and receive checksum coverage of a socket: + * @param fd socket + * @param sendcov payload coverage of sent packets (bytes), -1 for full + * @param recvcov minimum payload coverage of received packets, -1 for full + */ +int net_SetCSCov (int fd, int sendcov, int recvcov) +{ + int type; + + if (getsockopt (fd, SOL_SOCKET, SO_TYPE, + &type, &(socklen_t){ sizeof (type) })) + return VLC_EGENERIC; + + switch (type) + { +#ifdef UDPLITE_RECV_CSCOV + case SOCK_DGRAM: /* UDP-Lite */ + if (sendcov == -1) + sendcov = 0; + else + sendcov += 8; /* partial */ + if (setsockopt (fd, SOL_UDPLITE, UDPLITE_SEND_CSCOV, &sendcov, + sizeof (sendcov))) + return VLC_EGENERIC; + + if (recvcov == -1) + recvcov = 0; + else + recvcov += 8; + if (setsockopt (fd, SOL_UDPLITE, UDPLITE_RECV_CSCOV, + &recvcov, sizeof (recvcov))) + return VLC_EGENERIC; + + return VLC_SUCCESS; +#endif +#ifdef DCCP_SOCKOPT_SEND_CSCOV + case SOCK_DCCP: /* DCCP and its ill-named socket type */ + if ((sendcov == -1) || (sendcov > 56)) + sendcov = 0; + else + sendcov = (sendcov + 3) / 4; + if (setsockopt (fd, SOL_DCCP, DCCP_SOCKOPT_SEND_CSCOV, + &sendcov, sizeof (sendcov))) + return VLC_EGENERIC; + + if ((sendcov == -1) || (sendcov > 56)) + sendcov = 0; + else + sendcov = (sendcov + 3) / 4; + if (setsockopt (fd, SOL_DCCP, DCCP_SOCKOPT_RECV_CSCOV, + &recvcov, sizeof (recvcov))) + return VLC_EGENERIC; + + return VLC_SUCCESS; +#endif + } + + return VLC_EGENERIC; +}