ndn-js-contrib
Version:
Reusable 'Classes' for Named Data Networking: NameTree, PIT, FIB, ContentStore, Interfaces, and Transports
100 lines (83 loc) • 2.51 kB
JavaScript
var NameTree = require("./NameTree.js");
/**
*/
function FIB (){
this._nameTree = new NameTree();
}
FIB.prototype.insert = function FIB_insert(prefix, face){
var self = this;
return new Promise(function FIB_insert_Promise(resolve,reject){
var node = self._nameTree.get(prefix);
if (!node.getItem())
node.setItem(new FIB.Entry(prefix))
var fibEntry = node.getItem();
if (fibEntry.addNextHop(face))
resolve(face);
else
reject(new Error("FIB.insert(prefix, face): duplicate prefix and face combination"));
});
};
FIB.prototype.remove = function FIB_remove(face){
var prefixes = face.registeredPrefixTable;
for (var i in prefixes)
this._nameTree.get(prefixes[i]).getItem().removeFace(face);
}
FIB.prototype.lookup = function FIB_lookup(interest, face){
var self = this;
return new Promise(function FIB_lookup_Promise(resolve, reject){
self._nameTree.up(interest.name);
self._nameTree.skip(function(node){
var fibEntry = node.getItem();
return (!fibEntry
|| (fibEntry.getNextHops().length === 0)
|| ((fibEntry.getNextHops().length === 1) && (fibEntry.getNextHops()[0].face === face)));
});
var results = [];
for (var node of self._nameTree){
var nexthops = node.getItem().getNextHops();
for (var i in nexthops){
var dup = false;
for (var j in results)
if (nexthops[i].face === results[j].face){
dup = true;
break;
}
if (!dup && (nexthops[i].face !== face))
results.push(nexthops[i]);
}
}
if (results.length)
resolve(results);
else
reject(new Error("FIB.lookup(interest, face): no valid nexthops for that interest"));
});
};
FIB.Entry = function FIB_Entry(prefix){
this._nextHops = [];
this._prefix = prefix;
};
FIB.Entry.prototype.getNextHops = function FIB_Entry_getNextHops(){
return this._nextHops;
};
FIB.Entry.prototype.addNextHop = function FIB_Entry_addNextHop(face){
for (var i in this._nextHops)
if (this._nextHops[i].face === face)
return false;
this._nextHops.push({
face: face
, prefixLength: this._prefix.size()
, measurements: {
Fulfilled : 0
, timeouts : 0
}
});
return true;
}
FIB.Entry.prototype.removeFace = function FIB_Entry_removeFace(face){
for (var i in this._nextHops)
if (this._nextHops[i].face === face){
this._nextHops.splice(i,1);
break;
}
}
module.exports = FIB;