#include "compat.h"
//#include <glog/logging.h>
#include "swift.h"
+#include "../kernel/mptp.h"
using namespace std;
using namespace swift;
// 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,
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
}
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");
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];
}
}
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,
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;
#include "hashtree.h"
#include "avgspeed.h"
#include "availability.h"
-
+#include "../kernel/mptp.h"
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;
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();
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.