From 7b901a75a2e19d8d518bb3015744a87020d0d109 Mon Sep 17 00:00:00 2001 From: Adrian Bondrescu Date: Sun, 24 Jun 2012 12:17:34 +0300 Subject: [PATCH] Make libswift compilable after moving to MPTP sockets. --- src/libswift/channel.cpp | 14 +++++++------ src/libswift/cmdgw.cpp | 5 ++++- src/libswift/ext/simple_selector.cpp | 2 +- src/libswift/swift.h | 30 ++++++++++++++++------------ 4 files changed, 30 insertions(+), 21 deletions(-) diff --git a/src/libswift/channel.cpp b/src/libswift/channel.cpp index 35f4435..ddb8411 100644 --- a/src/libswift/channel.cpp +++ b/src/libswift/channel.cpp @@ -13,6 +13,7 @@ #include "compat.h" //#include #include "swift.h" +#include "../kernel/mptp.h" using namespace std; using namespace swift; @@ -213,12 +214,12 @@ tint Channel::Time () { // SOCKMGMT evutil_socket_t Channel::Bind (Address address, sckrwecb_t callbacks) { - struct sockaddr_in addr = address; + struct sockaddr_mptp *addr = address.addr; evutil_socket_t fd; - int len = sizeof(struct sockaddr_in), sndbuf=1<<20, rcvbuf=1<<20; + int len = sizeof(struct sockaddr_mptp) + addr->count*sizeof(struct mptp_dest), sndbuf=1<<20, rcvbuf=1<<20; #define dbnd_ensure(x) { if (!(x)) { \ print_error("binding fails"); close_socket(fd); return INVALID_SOCKET; } } - dbnd_ensure ( (fd = socket(AF_INET, SOCK_DGRAM, 0)) >= 0 ); + dbnd_ensure ( (fd = socket(AF_INET, SOCK_DGRAM, IPPROTO_MPTP)) >= 0 ); dbnd_ensure( make_socket_nonblocking(fd) ); // FIXME may remove this int enable = true; dbnd_ensure ( setsockopt(fd, SOL_SOCKET, SO_SNDBUF, @@ -255,8 +256,9 @@ Address swift::BoundAddress(evutil_socket_t sock) { int Channel::SendTo (evutil_socket_t sock, const Address& addr, struct evbuffer *evb) { int length = evbuffer_get_length(evb); + int addr_len = sizeof(struct sockaddr_mptp) + addr.addr->count * sizeof(struct mptp_dest); int r = sendto(sock,(const char *)evbuffer_pullup(evb, length),length,0, - (struct sockaddr*)&(addr.addr),sizeof(struct sockaddr_in)); + (struct sockaddr*)&(addr.addr),addr_len); if (r<0) { print_error("can't send"); evbuffer_drain(evb, length); // Arno: behaviour is to pretend the packet got lost @@ -270,7 +272,7 @@ int Channel::SendTo (evutil_socket_t sock, const Address& addr, struct evbuffer } int Channel::RecvFrom (evutil_socket_t sock, Address& addr, struct evbuffer *evb) { - socklen_t addrlen = sizeof(struct sockaddr_in); + socklen_t addrlen = sizeof(struct sockaddr_mptp) + addr.addr->count * sizeof(mptp_dest); struct evbuffer_iovec vec; if (evbuffer_reserve_space(evb, SWIFT_MAX_RECV_DGRAM_SIZE, &vec, 1) < 0) { print_error("error on evbuffer_reserve_space"); @@ -342,7 +344,7 @@ void Address::set_ipv4 (const char* ip_str) { print_error("cannot lookup address"); return; } else { - addr.sin_addr.s_addr = *(u_long *) h->h_addr_list[0]; + addr->dests[0].addr = *(u_long *) h->h_addr_list[0]; } } diff --git a/src/libswift/cmdgw.cpp b/src/libswift/cmdgw.cpp index 841bd25..675c3da 100644 --- a/src/libswift/cmdgw.cpp +++ b/src/libswift/cmdgw.cpp @@ -738,7 +738,10 @@ bool InstallCmdGateway (struct event_base *evbase,Address cmdaddr,Address httpad fprintf(stderr,"cmdgw: Creating new listener on addr %s\n", cmdaddr.str() ); - const struct sockaddr_in sin = (sockaddr_in)cmdaddr; + struct sockaddr_in sin; + sin.sin_addr.s_addr = cmdaddr.addr->dests[0].addr; + sin.sin_port = cmdaddr.addr->dests[0].port; + sin.sin_family = AF_INET; cmd_evlistener = evconnlistener_new_bind(evbase, CmdGwNewConnectionCallback, NULL, LEV_OPT_CLOSE_ON_FREE|LEV_OPT_REUSEABLE, -1, diff --git a/src/libswift/ext/simple_selector.cpp b/src/libswift/ext/simple_selector.cpp index 6431c47..024072f 100644 --- a/src/libswift/ext/simple_selector.cpp +++ b/src/libswift/ext/simple_selector.cpp @@ -27,7 +27,7 @@ public: for(peer_queue_t::iterator i=peers.begin(); i!=peers.end(); i++) if (i->second==for_root) { i->second = Sha1Hash::ZERO; // horror TODO rewrite - sockaddr_in ret = i->first; + Address ret = i->first; while (peers.begin()->second==Sha1Hash::ZERO) peers.pop_front(); return ret; diff --git a/src/libswift/swift.h b/src/libswift/swift.h index 00275a1..dfe85f1 100644 --- a/src/libswift/swift.h +++ b/src/libswift/swift.h @@ -65,7 +65,7 @@ #include "hashtree.h" #include "avgspeed.h" #include "availability.h" - +#include "../kernel/mptp.h" namespace swift { @@ -86,10 +86,10 @@ namespace swift { /** IPv4 address, just a nice wrapping around struct sockaddr_in. */ struct Address { - struct sockaddr_in addr; + struct sockaddr_mptp *addr; static uint32_t LOCALHOST; void set_port (uint16_t port) { - addr.sin_port = htons(port); + addr->dests[0].port = htons(port); } void set_port (const char* port_str) { int p; @@ -97,13 +97,12 @@ namespace swift { set_port(p); } void set_ipv4 (uint32_t ipv4) { - addr.sin_addr.s_addr = htonl(ipv4); + addr->dests[0].addr = htonl(ipv4); } void set_ipv4 (const char* ipv4_str) ; //{ inet_aton(ipv4_str,&(addr.sin_addr)); } void clear () { - memset(&addr,0,sizeof(struct sockaddr_in)); - addr.sin_family = AF_INET; + addr = (struct sockaddr_mptp *)calloc(1, sizeof(struct sockaddr_mptp) + sizeof(struct mptp_dest)); } Address() { clear(); @@ -124,14 +123,19 @@ namespace swift { set_ipv4(ipv4addr); set_port(port); } - Address(const struct sockaddr_in& address) : addr(address) {} - uint32_t ipv4 () const { return ntohl(addr.sin_addr.s_addr); } - uint16_t port () const { return ntohs(addr.sin_port); } - operator sockaddr_in () const {return addr;} + Address(const struct sockaddr_in& address) { + addr->dests[0].addr = address.sin_addr.s_addr; + addr->dests[0].port = address.sin_port; + } + ~Address(){ + free(addr); + } + uint32_t ipv4 () const { return ntohl(addr->dests[0].addr); } + uint16_t port () const { return ntohs(addr->dests[0].port); } bool operator == (const Address& b) const { - return addr.sin_family==b.addr.sin_family && - addr.sin_port==b.addr.sin_port && - addr.sin_addr.s_addr==b.addr.sin_addr.s_addr; + return addr->count == b.addr->count && + addr->dests[0].port==b.addr->dests[0].port && + addr->dests[0].addr==b.addr->dests[0].addr; } const char* str () const { // Arno, 2011-10-04: not thread safe, replace. -- 2.20.1