(trunk libT) add C and RPC API for getting/setting uTP enabled flag

This commit is contained in:
Jordan Lee 2011-02-18 00:33:11 +00:00
parent 3a7806a7cc
commit c4b1d1e6c5
8 changed files with 79 additions and 10 deletions

View File

@ -443,6 +443,7 @@
"start-added-torrents" | boolean | true means added torrents will be started right away
"trash-original-torrent-files" | boolean | true means the .torrent file of added torrents will be deleted
"units" | object | see below
"utp-enabled" | boolean | true means allow utp
"version" | string | long version string "$version ($revision)"
---------------------------------+------------+-----------------------------+
units | object containing: |

View File

@ -1472,6 +1472,8 @@ sessionSet( tr_session * session,
tr_sessionSetPexEnabled( session, boolVal );
if( tr_bencDictFindBool( args_in, TR_PREFS_KEY_DHT_ENABLED, &boolVal ) )
tr_sessionSetDHTEnabled( session, boolVal );
if( tr_bencDictFindBool( args_in, TR_PREFS_KEY_UTP_ENABLED, &boolVal ) )
tr_sessionSetUTPEnabled( session, boolVal );
if( tr_bencDictFindBool( args_in, TR_PREFS_KEY_LPD_ENABLED, &boolVal ) )
tr_sessionSetLPDEnabled( session, boolVal );
if( tr_bencDictFindBool( args_in, TR_PREFS_KEY_PEER_PORT_RANDOM_ON_START, &boolVal ) )
@ -1596,6 +1598,7 @@ sessionGet( tr_session * s,
tr_bencDictAddStr ( d, TR_PREFS_KEY_INCOMPLETE_DIR, tr_sessionGetIncompleteDir( s ) );
tr_bencDictAddBool( d, TR_PREFS_KEY_INCOMPLETE_DIR_ENABLED, tr_sessionIsIncompleteDirEnabled( s ) );
tr_bencDictAddBool( d, TR_PREFS_KEY_PEX_ENABLED, tr_sessionIsPexEnabled( s ) );
tr_bencDictAddBool( d, TR_PREFS_KEY_UTP_ENABLED, tr_sessionIsUTPEnabled( s ) );
tr_bencDictAddBool( d, TR_PREFS_KEY_DHT_ENABLED, tr_sessionIsDHTEnabled( s ) );
tr_bencDictAddBool( d, TR_PREFS_KEY_LPD_ENABLED, tr_sessionIsLPDEnabled( s ) );
tr_bencDictAddInt ( d, TR_PREFS_KEY_PEER_PORT, tr_sessionGetPeerPort( s ) );

View File

@ -44,6 +44,7 @@
#include "stats.h"
#include "torrent.h"
#include "tr-udp.h"
#include "tr-utp.h"
#include "tr-lpd.h"
#include "trevent.h"
#include "utils.h"
@ -314,6 +315,7 @@ tr_sessionGetDefaultSettings( const char * configDir UNUSED, tr_benc * d )
tr_bencDictAddStr ( d, TR_PREFS_KEY_BLOCKLIST_URL, "http://www.example.com/blocklist" );
tr_bencDictAddInt ( d, TR_PREFS_KEY_MAX_CACHE_SIZE_MB, DEFAULT_CACHE_SIZE_MB );
tr_bencDictAddBool( d, TR_PREFS_KEY_DHT_ENABLED, TRUE );
tr_bencDictAddBool( d, TR_PREFS_KEY_UTP_ENABLED, FALSE );
tr_bencDictAddBool( d, TR_PREFS_KEY_LPD_ENABLED, FALSE );
tr_bencDictAddStr ( d, TR_PREFS_KEY_DOWNLOAD_DIR, tr_getDefaultDownloadDir( ) );
tr_bencDictAddInt ( d, TR_PREFS_KEY_DSPEED_KBps, 100 );
@ -378,6 +380,7 @@ tr_sessionGetSettings( tr_session * s, struct tr_benc * d )
tr_bencDictAddStr ( d, TR_PREFS_KEY_BLOCKLIST_URL, tr_blocklistGetURL( s ) );
tr_bencDictAddInt ( d, TR_PREFS_KEY_MAX_CACHE_SIZE_MB, tr_sessionGetCacheLimit_MB( s ) );
tr_bencDictAddBool( d, TR_PREFS_KEY_DHT_ENABLED, s->isDHTEnabled );
tr_bencDictAddBool( d, TR_PREFS_KEY_UTP_ENABLED, s->isUTPEnabled );
tr_bencDictAddBool( d, TR_PREFS_KEY_LPD_ENABLED, s->isLPDEnabled );
tr_bencDictAddStr ( d, TR_PREFS_KEY_DOWNLOAD_DIR, s->downloadDir );
tr_bencDictAddInt ( d, TR_PREFS_KEY_DSPEED_KBps, tr_sessionGetSpeedLimit_KBps( s, TR_DOWN ) );
@ -763,6 +766,8 @@ sessionSetImpl( void * vdata )
tr_sessionSetPexEnabled( session, boolVal );
if( tr_bencDictFindBool( settings, TR_PREFS_KEY_DHT_ENABLED, &boolVal ) )
tr_sessionSetDHTEnabled( session, boolVal );
if( tr_bencDictFindBool( settings, TR_PREFS_KEY_UTP_ENABLED, &boolVal ) )
tr_sessionSetUTPEnabled( session, boolVal );
if( tr_bencDictFindBool( settings, TR_PREFS_KEY_LPD_ENABLED, &boolVal ) )
tr_sessionSetLPDEnabled( session, boolVal );
if( tr_bencDictFindInt( settings, TR_PREFS_KEY_ENCRYPTION, &i ) )
@ -1734,6 +1739,7 @@ sessionCloseImpl( void * vsession )
if( session->isLPDEnabled )
tr_lpdUninit( session );
tr_utpClose( session );
tr_udpUninit( session );
event_free( session->saveTimer );
@ -1964,6 +1970,44 @@ tr_sessionSetDHTEnabled( tr_session * session, tr_bool enabled )
tr_runInEventThread( session, toggleDHTImpl, session );
}
/***
****
***/
tr_bool
tr_sessionIsUTPEnabled( const tr_session * session )
{
assert( tr_isSession( session ) );
return session->isUTPEnabled;
}
static void
toggle_utp( void * data )
{
tr_session * session = data;
assert( tr_isSession( session ) );
session->isUTPEnabled = !session->isUTPEnabled;
if( !session->isUTPEnabled )
tr_utpClose( session );
}
void
tr_sessionSetUTPEnabled( tr_session * session, tr_bool enabled )
{
assert( tr_isSession( session ) );
assert( tr_isBool( enabled ) );
if( ( enabled != 0 ) != ( session->isUTPEnabled != 0 ) )
tr_runInEventThread( session, toggle_utp, session );
}
/***
****
***/
static void
toggleLPDImpl( void * data )
{

View File

@ -89,6 +89,7 @@ struct tr_session
tr_bool isPortRandom;
tr_bool isPexEnabled;
tr_bool isDHTEnabled;
tr_bool isUTPEnabled;
tr_bool isLPDEnabled;
tr_bool isBlocklistEnabled;
tr_bool isPrefetchEnabled;

View File

@ -135,11 +135,11 @@ event_callback(int s, short type UNUSED, void *sv)
if(rc <= 0)
return;
if(buf[0] == 'd') {
if((buf[0] == 'd') && tr_sessionIsDHTEnabled(ss)) {
/* DHT packet. */
buf[rc] = '\0';
tr_dhtCallback(buf, rc, (struct sockaddr*)&from, fromlen, sv);
} else {
} else if(tr_sessionIsDHTEnabled(ss)){
rc = tr_utpPacket(buf, rc, (struct sockaddr*)&from, fromlen, ss);
if(!rc)
tr_ndbg("UDP", "Unexpected UDP packet");

View File

@ -82,12 +82,19 @@ send_to(void *closure, const unsigned char *buf, size_t buflen,
sendto(ss->udp6_socket, buf, buflen, 0, to, tolen);
}
static void
reset_timer( void )
{
int sec = 0;
int usec = UTP_INTERVAL_US / 2 + tr_cryptoWeakRandInt(UTP_INTERVAL_US);
tr_timerAdd( utp_timer, sec, usec );
}
static void
timer_callback(int s UNUSED, short type UNUSED, void *closure UNUSED)
{
UTP_CheckTimeouts();
tr_timerAdd(utp_timer, 0,
UTP_INTERVAL_US / 2 + tr_cryptoWeakRandInt(UTP_INTERVAL_US));
reset_timer();
}
int
@ -95,17 +102,24 @@ tr_utpPacket(const unsigned char *buf, size_t buflen,
const struct sockaddr *from, socklen_t fromlen,
tr_session *ss)
{
if(utp_timer == NULL) {
utp_timer = evtimer_new( ss->event_base, timer_callback, NULL);
if(utp_timer == NULL)
{
utp_timer = evtimer_new( ss->event_base, timer_callback, NULL );
if(utp_timer == NULL)
return -1;
tr_timerAdd(utp_timer, 0,
UTP_INTERVAL_US / 2 +
tr_cryptoWeakRandInt(UTP_INTERVAL_US));
reset_timer();
}
return UTP_IsIncomingUTP(incoming, send_to, ss,
buf, buflen, from, fromlen);
}
void
tr_utpClose( tr_session * session )
{
if( utp_timer )
{
evtimer_del( utp_timer );
utp_timer = NULL;
}
}

View File

@ -24,3 +24,5 @@ THE SOFTWARE.
int tr_utpPacket(const unsigned char *buf, size_t buflen,
const struct sockaddr *from, socklen_t fromlen,
tr_session *ss);
void tr_utpClose( tr_session * );

View File

@ -161,6 +161,7 @@ const char* tr_getDefaultDownloadDir( void );
#define TR_PREFS_KEY_BLOCKLIST_URL "blocklist-url"
#define TR_PREFS_KEY_MAX_CACHE_SIZE_MB "cache-size-mb"
#define TR_PREFS_KEY_DHT_ENABLED "dht-enabled"
#define TR_PREFS_KEY_UTP_ENABLED "utp-enabled"
#define TR_PREFS_KEY_LPD_ENABLED "lpd-enabled"
#define TR_PREFS_KEY_PREFETCH_ENABLED "prefetch-enabled"
#define TR_PREFS_KEY_DOWNLOAD_DIR "download-dir"
@ -572,6 +573,9 @@ tr_bool tr_sessionIsPexEnabled( const tr_session * session );
tr_bool tr_sessionIsDHTEnabled( const tr_session * session );
void tr_sessionSetDHTEnabled( tr_session * session, tr_bool );
tr_bool tr_sessionIsUTPEnabled( const tr_session * session );
void tr_sessionSetUTPEnabled( tr_session * session, tr_bool );
tr_bool tr_sessionIsLPDEnabled( const tr_session * session );
void tr_sessionSetLPDEnabled( tr_session * session, tr_bool enabled );