diff --git a/libtransmission/Makefile.am b/libtransmission/Makefile.am index fd4c5c446..418417d0c 100644 --- a/libtransmission/Makefile.am +++ b/libtransmission/Makefile.am @@ -56,6 +56,7 @@ libtransmission_a_SOURCES = \ tr-dht.c \ tr-lpd.c \ tr-udp.c \ + tr-utp.c \ tr-getopt.c \ trevent.c \ upnp.c \ @@ -108,6 +109,7 @@ noinst_HEADERS = \ transmission.h \ tr-dht.h \ tr-udp.h \ + tr-utp.h \ tr-lpd.h \ trevent.h \ upnp.h \ diff --git a/libtransmission/tr-udp.c b/libtransmission/tr-udp.c index e6cb2f308..082e54489 100644 --- a/libtransmission/tr-udp.c +++ b/libtransmission/tr-udp.c @@ -30,6 +30,7 @@ THE SOFTWARE. #include "net.h" #include "session.h" #include "tr-dht.h" +#include "tr-utp.h" #include "tr-udp.h" /* BEP-32 has a rather nice explanation of why we need to bind to one @@ -139,8 +140,9 @@ event_callback(int s, short type UNUSED, void *sv) buf[rc] = '\0'; tr_dhtCallback(buf, rc, (struct sockaddr*)&from, fromlen, sv); } else { - /* Probably a UTP packet. */ - /* Nothing yet. */ + rc = tr_utpPacket(buf, rc, (struct sockaddr*)&from, fromlen, ss); + if(!rc) + tr_ndbg("UDP", "Unexpected UDP packet"); } free(buf); diff --git a/libtransmission/tr-utp.c b/libtransmission/tr-utp.c new file mode 100644 index 000000000..e13f51477 --- /dev/null +++ b/libtransmission/tr-utp.c @@ -0,0 +1,79 @@ +/* +Copyright (c) 2010 by Juliusz Chroboczek + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +*/ + +#include + +#include +#include "utp.h" + +#include "transmission.h" +#include "net.h" +#include "session.h" +#include "crypto.h" +#include "tr-utp.h" + +static struct event *utp_timer = NULL; + +static void +incoming(void *closure UNUSED, struct UTPSocket *s) +{ + UTP_Close(s); +} + +static void +send_to(void *closure, const unsigned char *buf, size_t buflen, + const struct sockaddr *to, socklen_t tolen) +{ + tr_session *ss = (tr_session*)closure; + + if(to->sa_family == AF_INET && ss->udp_socket) + sendto(ss->udp_socket, buf, buflen, 0, to, tolen); + else if(to->sa_family == AF_INET6 && ss->udp_socket) + sendto(ss->udp6_socket, buf, buflen, 0, to, tolen); +} + +static void +timer_callback(int s UNUSED, short type UNUSED, void *closure UNUSED) +{ + UTP_CheckTimeouts(); + tr_timerAdd(utp_timer, 0, tr_cryptoWeakRandInt(2000000)); +} + +int +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 = tr_new0(struct event, 1); + if(utp_timer == NULL) + return -1; + evtimer_set(utp_timer, timer_callback, NULL); + tr_timerAdd(utp_timer, 0, tr_cryptoWeakRandInt(2000000)); + } + + return UTP_IsIncomingUTP(incoming, send_to, ss, + buf, buflen, from, fromlen); +} + + diff --git a/libtransmission/tr-utp.h b/libtransmission/tr-utp.h new file mode 100644 index 000000000..dfa70ec1b --- /dev/null +++ b/libtransmission/tr-utp.h @@ -0,0 +1,26 @@ +/* +Copyright (c) 2010 by Juliusz Chroboczek + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +*/ + +int tr_utpPacket(const unsigned char *buf, size_t buflen, + const struct sockaddr *from, socklen_t fromlen, + tr_session *ss);