#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));
+ addr->count = 1;
}
Address() {
clear();
}
+ Address(const Address &b) {
+ clear();
+ addr->dests[0].addr = b.addr->dests[0].addr;
+ addr->dests[0].port = b.addr->dests[0].port;
+ }
Address(const char* ip, uint16_t port) {
clear();
set_ipv4(ip);
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) {
+ clear();
+ 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); }
+ Address& operator = (const Address& b) {
+ if (this != &b) {
+ free(addr);
+ clear();
+ addr->dests[0].addr = b.addr->dests[0].addr;
+ addr->dests[0].port = b.addr->dests[0].port;
+ }
+ return *this;
+ }
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.
static void LibeventSendCallback(int fd, short event, void *arg);
static void LibeventReceiveCallback(int fd, short event, void *arg);
static void RecvDatagram (evutil_socket_t socket); // Called by LibeventReceiveCallback
- static int RecvFrom(evutil_socket_t sock, Address& addr, struct evbuffer *evb); // Called by RecvDatagram
- static int SendTo(evutil_socket_t sock, const Address& addr, struct evbuffer *evb); // Called by Channel::Send()
+ static int RecvFrom(evutil_socket_t sock, Address& addr, struct evbuffer **evb); // Called by RecvDatagram
+ static int SendTo(evutil_socket_t sock, const Address& addr, struct evbuffer **evb); // Called by Channel::Send()
static evutil_socket_t Bind(Address address, sckrwecb_t callbacks=sckrwecb_t());
static Address BoundAddress(evutil_socket_t sock);
static evutil_socket_t default_socket()