Commit 150b92a3 authored by Ulysse Beaugnon's avatar Ulysse Beaugnon

A peer now only advertise one route for its /64 instead of 3 (/64, /128, /128 anycast)

parent 4f82d0fa
...@@ -2,14 +2,15 @@ Bug : ...@@ -2,14 +2,15 @@ Bug :
possible bug in the upnp refresh, when refreshing after a too long time possible bug in the upnp refresh, when refreshing after a too long time
To be done : To be done :
Choose the db size and who peers are deleted Choose the db size and how peers are deleted
find out who to have an automatic recovery without declare find out who to have an automatic recovery without declare
Test the package Test the package
PB : at the beggining a node tries to find 10 other nodes so ask for 10 bootsrap nodes at the beggining a node tries to find 10 other nodes so ask for 10 bootsrap nodes
This slow the beginning !! This slow the beginning and might overload the server
If their is too many nodes flaged as bad, the node never ask for some bootstrap peer
When a node arrive it is in nobody DB => very slow beginning. It should advertise itself more When a node arrive it is in nobody DB => very slow beginning. It should advertise itself more.
check the ips attributed check the ips attributed
remove decalre remove decalre
......
...@@ -119,8 +119,8 @@ class PeerManager: ...@@ -119,8 +119,8 @@ class PeerManager:
except sqlite3.IntegrityError, e: except sqlite3.IntegrityError, e:
if e.args[0] != 'column prefix is not unique': if e.args[0] != 'column prefix is not unique':
raise raise
#except Exception, e: except Exception, e:
# logging.info('Unable to bootstrap : %s' % e) logging.info('Unable to bootstrap : %s' % e)
return False return False
def usePeer(self, prefix): def usePeer(self, prefix):
......
...@@ -62,12 +62,14 @@ def client(server_address, pipe_fd, hello_interval, encrypt, *args, **kw): ...@@ -62,12 +62,14 @@ def client(server_address, pipe_fd, hello_interval, encrypt, *args, **kw):
return openvpn(hello_interval, encrypt, *remote, **kw) return openvpn(hello_interval, encrypt, *remote, **kw)
def router(network, internal_ip, interface_list, def router(network, subnet, subnet_size, interface_list,
wireless, hello_interval, state_path, **kw): wireless, hello_interval, state_path, **kw):
logging.info('Starting babel...') logging.info('Starting babel...')
args = ['babeld', args = ['babeld',
'-C', 'redistribute local ip %s' % (internal_ip), '-C', 'redistribute local ip %s/%s le %s' % (subnet, subnet_size, subnet_size),
'-C', 'redistribute local deny', '-C', 'redistribute local deny',
'-C', 'redistribute ip %s/%s le %s' % (subnet, subnet_size, subnet_size),
'-C', 'redistribute deny',
# Route VIFIB ip adresses # Route VIFIB ip adresses
'-C', 'in ip %s::/%u' % (utils.ipFromBin(network), len(network)), '-C', 'in ip %s::/%u' % (utils.ipFromBin(network), len(network)),
# Route only addresse in the 'local' network, # Route only addresse in the 'local' network,
......
...@@ -135,7 +135,7 @@ class TunnelManager: ...@@ -135,7 +135,7 @@ class TunnelManager:
iface = line[-1] iface = line[-1]
subnet_size = int(line[1], 16) subnet_size = int(line[1], 16)
logging.trace('Route on iface %s detected to %s/%s' logging.trace('Route on iface %s detected to %s/%s'
% (iface, ip, subnet_size)) % (iface, line[0], subnet_size))
if iface in self._iface_to_prefix.keys(): if iface in self._iface_to_prefix.keys():
self._connection_dict[self._iface_to_prefix[iface]].routes += 1 self._connection_dict[self._iface_to_prefix[iface]].routes += 1
if iface in self._iface_list and self._net_len < subnet_size < 128: if iface in self._iface_list and self._net_len < subnet_size < 128:
...@@ -168,7 +168,7 @@ class TunnelManager: ...@@ -168,7 +168,7 @@ class TunnelManager:
if self._peer_db.address: if self._peer_db.address:
ip = '%s:%s:%s:%s:%s:%s:%s:%s' % (peerIp[0:4], peerIp[4:8], peerIp[8:12], ip = '%s:%s:%s:%s:%s:%s:%s:%s' % (peerIp[0:4], peerIp[4:8], peerIp[8:12],
peerIp[12:16], peerIp[16:20], peerIp[20:24], peerIp[24:28], peerIp[28:32]) peerIp[12:16], peerIp[16:20], peerIp[20:24], peerIp[24:28], peerIp[28:32])
logging.debug('Notifying peer %s' % ip) logging.trace('Notifying peer %s' % ip)
sock = socket.socket(socket.AF_INET6, socket.SOCK_DGRAM) sock = socket.socket(socket.AF_INET6, socket.SOCK_DGRAM)
sock.sendto('%s %s\n' % (self._prefix, utils.address_str(self._peer_db.address)), (ip, 326)) sock.sendto('%s %s\n' % (self._prefix, utils.address_str(self._peer_db.address)), (ip, 326))
except socket.error, e: except socket.error, e:
......
...@@ -153,8 +153,9 @@ def main(): ...@@ -153,8 +153,9 @@ def main():
interface_list = list(tunnel_manager.free_interface_set) \ interface_list = list(tunnel_manager.free_interface_set) \
+ config.iface_list + list(iface + config.iface_list + list(iface
for _, _, iface in config.pp) for _, _, iface in config.pp)
router = plib.router(network, internal_ip, interface_list, config.wireless, subnet = utils.ipFromBin((network + prefix).ljust(128, '0'))
config.hello, os.path.join(config.state, 'babeld.state'), router = plib.router(network, subnet, len(prefix) + len(network), interface_list,
config.wireless, config.hello, os.path.join(config.state, 'babeld.state'),
stdout=os.open(os.path.join(config.log, 'babeld.log'), stdout=os.open(os.path.join(config.log, 'babeld.log'),
os.O_WRONLY | os.O_CREAT | os.O_TRUNC), stderr=subprocess.STDOUT) os.O_WRONLY | os.O_CREAT | os.O_TRUNC), stderr=subprocess.STDOUT)
......
...@@ -110,6 +110,56 @@ void Graph::GetRoutesFrom(int from, int* nRoutes, int* prevs, int* distances) ...@@ -110,6 +110,56 @@ void Graph::GetRoutesFrom(int from, int* nRoutes, int* prevs, int* distances)
} }
} }
void Graph::GetRoutesFromHop(int from, int* nRoutes, int* prevs, int* distances)
{
// init vars
stack<int> order;
for(int i=0; i<size; i++)
{
distances[i] = -1;
nRoutes[i] = 1;
}
distances[from] = 0;
priority_queue<pair<int, int>> remainingNodes;
remainingNodes.push(pair<int, int>(-0, from));
// Get the order
while(!remainingNodes.empty())
{
pair<int, int> p = remainingNodes.top();
int node = p.second;
int d = -p.first;
remainingNodes.pop();
if(d == distances[node])
{
order.push(node);
for(int neighbor : adjacency[node])
{
int neighborDist = d + 1;
if(distances[neighbor] == -1 || distances[neighbor] > neighborDist)
{
distances[neighbor] = neighborDist;
prevs[neighbor] = node;
remainingNodes.push(pair<int, int>(-neighborDist, neighbor));
}
}
}
}
// get the BC
while(!order.empty())
{
int node = order.top();
order.pop();
if(distances[node] != -1 && node != from)
nRoutes[prevs[node]] += nRoutes[node];
}
}
routesResult Graph::GetRouteResult(int node, int nRefresh, double* bc) routesResult Graph::GetRouteResult(int node, int nRefresh, double* bc)
{ {
int nRoutes[size], prevs[size], distances[size]; int nRoutes[size], prevs[size], distances[size];
......
...@@ -89,6 +89,8 @@ void testOptimized(int size, int k, int maxPeer, int seed, Latency* latency, con ...@@ -89,6 +89,8 @@ void testOptimized(int size, int k, int maxPeer, int seed, Latency* latency, con
fflush(output); fflush(output);
fsync(fno); fsync(fno);
graph.Reboot(1.0/(2500 + 1.0), i);
cout << "\r" << i+1 << "/" << 3000; cout << "\r" << i+1 << "/" << 3000;
cout.flush(); cout.flush();
} }
...@@ -121,9 +123,7 @@ void Optimize(int size, int k, int maxPeer, int seed, Latency* latency, const ch ...@@ -121,9 +123,7 @@ void Optimize(int size, int k, int maxPeer, int seed, Latency* latency, const ch
double nRoutesKilled = 0; double nRoutesKilled = 0;
int arityDistrib[maxPeer+1]; int arityDistrib[maxPeer+1];
//graph.Reboot(1.0/(100 + 1.0), i); for(int i=0; i<1000; i++)
for(int i=0; i<3000; i++)
{ {
vector<future<pair<double, double>>> threads; vector<future<pair<double, double>>> threads;
for(int a=0; a<range; a++) for(int a=0; a<range; a++)
...@@ -172,6 +172,8 @@ void Optimize(int size, int k, int maxPeer, int seed, Latency* latency, const ch ...@@ -172,6 +172,8 @@ void Optimize(int size, int k, int maxPeer, int seed, Latency* latency, const ch
fflush(output); fflush(output);
fsync(fno); fsync(fno);
graph->Reboot(1.0/(2500 + 1.0), i);
cout << "\r" << i+1 << "/" << 3000;cout.flush(); cout << "\r" << i+1 << "/" << 3000;cout.flush();
} }
...@@ -191,7 +193,7 @@ int main(int argc, char** argv) ...@@ -191,7 +193,7 @@ int main(int argc, char** argv)
vector<future<void>> threads; vector<future<void>> threads;
for(int i=0; i<1; i++) /*for(int i=0; i<1; i++)
{ {
int seed = rng(); int seed = rng();
char* out = new char[100]; char* out = new char[100];
...@@ -201,9 +203,9 @@ int main(int argc, char** argv) ...@@ -201,9 +203,9 @@ int main(int argc, char** argv)
} }
for(int i=0; i<4; i++) for(int i=0; i<4; i++)
threads[i].get(); threads[i].get();*/
//Optimize(2500, 10, 30, rng(), latency, "out.csv"); Optimize(2500, 10, 30, rng(), latency, "out.csv");
delete latency; delete latency;
return 0; return 0;
......
...@@ -46,6 +46,7 @@ public: ...@@ -46,6 +46,7 @@ public:
void KillMachines(float proportion); void KillMachines(float proportion);
pair<double, double> UpdateLowRoutesArity(int arityToUpdate); pair<double, double> UpdateLowRoutesArity(int arityToUpdate);
void GetArity(int* arity); void GetArity(int* arity);
void GetRoutesFromHop(int from, int* nRoutes, int* prevs, int* distances)
private: private:
void SaturateNode(int node); void SaturateNode(int node);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment