Make libswift compilable after moving to MPTP sockets.
authorAdrian Bondrescu <adi.bondrescu@gmail.com>
Sun, 24 Jun 2012 09:17:34 +0000 (12:17 +0300)
committerAdrian Bondrescu <adi.bondrescu@gmail.com>
Sun, 24 Jun 2012 09:17:34 +0000 (12:17 +0300)
src/libswift/channel.cpp
src/libswift/cmdgw.cpp
src/libswift/ext/simple_selector.cpp
src/libswift/swift.h

index 35f4435..ddb8411 100644 (file)
@@ -13,6 +13,7 @@
 #include "compat.h"
 //#include <glog/logging.h>
 #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];
     }
 }
 
index 841bd25..675c3da 100644 (file)
@@ -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,
index 6431c47..024072f 100644 (file)
@@ -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;
index 00275a1..dfe85f1 100644 (file)
@@ -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.