UNPKG

30 kBSource Map (JSON)View Raw
1{"version":3,"file":"route-broadcaster.js","sourceRoot":"","sources":["route-broadcaster.ts"],"names":[],"mappings":"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","sourcesContent":["import { randomBytes } from 'crypto'\nimport { Errors } from 'ilp-packet'\nimport { create as createLogger } from '../common/log'\nconst log = createLogger('route-broadcaster')\nimport { find } from 'lodash'\nimport RoutingTable from './routing-table'\nimport ForwardingRoutingTable, { RouteUpdate } from './forwarding-routing-table'\nimport Accounts from './accounts'\nimport Config from './config'\nimport Peer from '../routing/peer'\nimport { canDragonFilter } from '../routing/dragon'\nimport { Relation, getRelationPriority } from '../routing/relation'\nimport {\n formatRoutingTableAsJson,\n formatRouteAsJson,\n formatForwardingRoutingTableAsJson\n} from '../routing/utils'\nimport {\n Route,\n IncomingRoute\n} from '../types/routing'\nimport reduct = require('reduct')\nimport { sha256, hmac } from '../lib/utils'\nimport {\n CcpRouteControlRequest,\n CcpRouteUpdateRequest\n} from 'ilp-protocol-ccp'\nconst { BadRequestError } = Errors\n\nexport default class RouteBroadcaster {\n private deps: reduct.Injector\n // Local routing table, used for actually routing packets\n private localRoutingTable: RoutingTable\n // Master routing table, used for routes that we broadcast\n private forwardingRoutingTable: ForwardingRoutingTable\n\n private accounts: Accounts\n private config: Config\n\n private peers: Map<string, Peer>\n private localRoutes: Map<string, Route>\n private routingSecret: Buffer\n private untrackCallbacks: Map<string, () => void> = new Map()\n\n constructor (deps: reduct.Injector) {\n this.deps = deps\n this.localRoutingTable = deps(RoutingTable)\n this.forwardingRoutingTable = deps(ForwardingRoutingTable)\n this.accounts = deps(Accounts)\n this.config = deps(Config)\n\n if (this.config.routingSecret) {\n log.info('loaded routing secret from config.')\n this.routingSecret = Buffer.from(this.config.routingSecret, 'base64')\n } else {\n log.info('generated random routing secret.')\n this.routingSecret = randomBytes(32)\n }\n\n this.peers = new Map() // peerId:string -> peer:Peer\n this.localRoutes = new Map()\n }\n\n start () {\n this.reloadLocalRoutes()\n\n for (const accountId of this.accounts.getAccountIds()) {\n this.track(accountId)\n }\n }\n\n stop () {\n for (const accountId of this.peers.keys()) {\n this.remove(accountId)\n }\n }\n\n track (accountId: string) {\n if (this.untrackCallbacks.has(accountId)) {\n // Already tracked\n return\n }\n\n const plugin = this.accounts.getPlugin(accountId)\n\n const connectHandler = () => {\n if (!plugin.isConnected()) {\n // some plugins don't set `isConnected() = true` before emitting the\n // connect event, setImmediate has a good chance of working.\n log.error('(!!!) plugin emitted connect, but then returned false for isConnected, broken plugin. account=%s', accountId)\n setImmediate(() => this.add(accountId))\n } else {\n this.add(accountId)\n }\n }\n const disconnectHandler = () => {\n this.remove(accountId)\n }\n\n plugin.on('connect', connectHandler)\n plugin.on('disconnect', disconnectHandler)\n\n this.untrackCallbacks.set(accountId, () => {\n plugin.removeListener('connect', connectHandler)\n plugin.removeListener('disconnect', disconnectHandler)\n })\n\n this.add(accountId)\n }\n\n untrack (accountId: string) {\n this.remove(accountId)\n\n const callback = this.untrackCallbacks.get(accountId)\n\n if (callback) {\n callback()\n }\n }\n\n add (accountId: string) {\n const accountInfo = this.accounts.getInfo(accountId)\n\n let sendRoutes\n if (typeof accountInfo.sendRoutes === 'boolean') {\n sendRoutes = accountInfo.sendRoutes\n } else if (accountInfo.relation !== 'child') {\n sendRoutes = true\n } else {\n sendRoutes = false\n }\n\n let receiveRoutes\n if (typeof accountInfo.receiveRoutes === 'boolean') {\n receiveRoutes = accountInfo.receiveRoutes\n } else if (accountInfo.relation !== 'child') {\n receiveRoutes = true\n } else {\n receiveRoutes = false\n }\n\n if (!sendRoutes && !receiveRoutes) {\n log.warn('not sending/receiving routes for peer, set sendRoutes/receiveRoutes to override. accountId=%s', accountId)\n return\n }\n\n const existingPeer = this.peers.get(accountId)\n if (existingPeer) {\n // Every time we reconnect, we'll send a new route control message to make\n // sure they are still sending us routes.\n const receiver = existingPeer.getReceiver()\n\n if (receiver) {\n receiver.sendRouteControl()\n } else {\n log.warn('unable to send route control message, receiver object undefined. peer=%s', existingPeer)\n }\n\n return\n }\n\n const plugin = this.accounts.getPlugin(accountId)\n\n if (plugin.isConnected()) {\n log.trace('add peer. accountId=%s sendRoutes=%s receiveRoutes=%s', accountId, sendRoutes, receiveRoutes)\n const peer = new Peer({ deps: this.deps, accountId, sendRoutes, receiveRoutes })\n this.peers.set(accountId, peer)\n const receiver = peer.getReceiver()\n if (receiver) {\n receiver.sendRouteControl()\n }\n this.reloadLocalRoutes()\n }\n }\n\n remove (accountId: string) {\n const peer = this.peers.get(accountId)\n\n if (!peer) {\n return\n }\n\n const sender = peer.getSender()\n const receiver = peer.getReceiver()\n\n log.trace('remove peer. peerId=' + accountId)\n if (sender) {\n sender.stop()\n }\n\n // We have to remove the peer before calling updatePrefix on each of its\n // advertised prefixes in order to find the next best route.\n this.peers.delete(accountId)\n if (receiver) {\n for (let prefix of receiver.getPrefixes()) {\n this.updatePrefix(prefix)\n }\n }\n if (this.getAccountRelation(accountId) === 'child') {\n this.updatePrefix(this.accounts.getChildAddress(accountId))\n }\n }\n\n handleRouteControl (sourceAccount: string, routeControl: CcpRouteControlRequest) {\n const peer = this.peers.get(sourceAccount)\n\n if (!peer) {\n log.debug('received route control message from non-peer. sourceAccount=%s', sourceAccount)\n throw new BadRequestError('cannot process route control messages from non-peers.')\n }\n\n const sender = peer.getSender()\n\n if (!sender) {\n log.debug('received route control message from peer not authorized to receive routes from us (sendRoutes=false). sourceAccount=%s', sourceAccount)\n throw new BadRequestError('rejecting route control message, we are configured not to send routes to you.')\n }\n\n sender.handleRouteControl(routeControl)\n }\n\n handleRouteUpdate (sourceAccount: string, routeUpdate: CcpRouteUpdateRequest) {\n const peer = this.peers.get(sourceAccount)\n\n if (!peer) {\n log.debug('received route update from non-peer. sourceAccount=%s', sourceAccount)\n throw new BadRequestError('cannot process route update messages from non-peers.')\n }\n\n const receiver = peer.getReceiver()\n\n if (!receiver) {\n log.debug('received route update from peer not authorized to advertise routes to us (receiveRoutes=false). sourceAccount=%s', sourceAccount)\n throw new BadRequestError('rejecting route update, we are configured not to receive routes from you.')\n }\n\n // Apply import filters\n // TODO Route filters should be much more configurable\n // TODO We shouldn't modify this object in place\n routeUpdate.newRoutes = routeUpdate.newRoutes\n // Filter incoming routes that aren't part of the current global prefix or\n // cover the entire global prefix (i.e. the default route.)\n .filter(route =>\n route.prefix.startsWith(this.getGlobalPrefix()) &&\n route.prefix.length > this.getGlobalPrefix().length\n )\n // Filter incoming routes that include us as a hop (i.e. routing loops)\n .filter(route =>\n !route.path.includes(this.accounts.getOwnAddress())\n )\n\n const changedPrefixes = receiver.handleRouteUpdate(routeUpdate)\n\n let haveRoutesChanged\n for (const prefix of changedPrefixes) {\n haveRoutesChanged = this.updatePrefix(prefix) || haveRoutesChanged\n }\n if (haveRoutesChanged && this.config.routeBroadcastEnabled) {\n // TODO: Should we even trigger an immediate broadcast when routes change?\n // Note that BGP does not do this AFAIK\n for (const peer of this.peers.values()) {\n const sender = peer.getSender()\n if (sender) {\n sender.scheduleRouteUpdate()\n }\n }\n }\n }\n\n reloadLocalRoutes () {\n log.trace('reload local and configured routes.')\n\n this.localRoutes = new Map()\n const localAccounts = this.accounts.getAccountIds()\n\n // Add a route for our own address\n const ownAddress = this.accounts.getOwnAddress()\n this.localRoutes.set(ownAddress, {\n nextHop: '',\n path: [],\n auth: hmac(this.routingSecret, ownAddress)\n })\n\n let defaultRoute = this.config.defaultRoute\n if (defaultRoute === 'auto') {\n defaultRoute = localAccounts.filter(id => this.accounts.getInfo(id).relation === 'parent')[0]\n }\n if (defaultRoute) {\n const globalPrefix = this.getGlobalPrefix()\n this.localRoutes.set(globalPrefix, {\n nextHop: defaultRoute,\n path: [],\n auth: hmac(this.routingSecret, globalPrefix)\n })\n }\n\n for (let accountId of localAccounts) {\n if (this.getAccountRelation(accountId) === 'child') {\n const childAddress = this.accounts.getChildAddress(accountId)\n this.localRoutes.set(childAddress, {\n nextHop: accountId,\n path: [],\n auth: hmac(this.routingSecret, childAddress)\n })\n }\n }\n\n const localPrefixes = Array.from(this.localRoutes.keys())\n const configuredPrefixes = this.config.routes\n ? this.config.routes.map(r => r.targetPrefix)\n : []\n\n for (let prefix of localPrefixes.concat(configuredPrefixes)) {\n this.updatePrefix(prefix)\n }\n }\n\n updatePrefix (prefix: string) {\n const newBest = this.getBestPeerForPrefix(prefix)\n\n return this.updateLocalRoute(prefix, newBest)\n }\n\n getBestPeerForPrefix (prefix: string): Route | undefined {\n // configured routes have highest priority\n const configuredRoute = find(this.config.routes, { targetPrefix: prefix })\n if (configuredRoute) {\n if (this.accounts.exists(configuredRoute.peerId)) {\n return {\n nextHop: configuredRoute.peerId,\n path: [],\n auth: hmac(this.routingSecret, prefix)\n }\n } else {\n log.warn('ignoring configured route, account does not exist. prefix=%s accountId=%s', configuredRoute.targetPrefix, configuredRoute.peerId)\n }\n }\n\n const localRoute = this.localRoutes.get(prefix)\n if (localRoute) {\n return localRoute\n }\n\n const weight = (route: IncomingRoute) => {\n const relation = this.getAccountRelation(route.peer)\n return getRelationPriority(relation)\n }\n\n const bestRoute = Array.from(this.peers.values())\n .map(peer => peer.getReceiver())\n .map(receiver => receiver && receiver.getPrefix(prefix))\n .filter((a): a is IncomingRoute => !!a)\n .sort((a?: IncomingRoute, b?: IncomingRoute) => {\n if (!a && !b) {\n return 0\n } else if (!a) {\n return 1\n } else if (!b) {\n return -1\n }\n\n // First sort by peer weight\n const weightA = weight(a)\n const weightB = weight(b)\n\n if (weightA !== weightB) {\n return weightB - weightA\n }\n\n // Then sort by path length\n const pathA = a.path.length\n const pathB = b.path.length\n\n if (pathA !== pathB) {\n return pathA - pathB\n }\n\n // Finally, tie-break by accountId\n if (a.peer > b.peer) {\n return 1\n } else if (b.peer > a.peer) {\n return -1\n } else {\n return 0\n }\n })[0]\n\n return bestRoute && {\n nextHop: bestRoute.peer,\n path: bestRoute.path,\n auth: bestRoute.auth\n }\n }\n\n getGlobalPrefix () {\n switch (this.config.env) {\n case 'production':\n return 'g'\n case 'test':\n return 'test'\n default:\n throw new Error('invalid value for `env` config. env=' + this.config.env)\n }\n }\n\n getStatus () {\n return {\n routingTableId: this.forwardingRoutingTable.routingTableId,\n currentEpoch: this.forwardingRoutingTable.currentEpoch,\n localRoutingTable: formatRoutingTableAsJson(this.localRoutingTable),\n forwardingRoutingTable: formatForwardingRoutingTableAsJson(this.forwardingRoutingTable),\n routingLog: this.forwardingRoutingTable.log\n .filter(Boolean)\n .map(entry => ({\n ...entry,\n route: entry && entry.route && formatRouteAsJson(entry.route)\n })),\n peers: Array.from(this.peers.values()).reduce((acc, peer) => {\n const sender = peer.getSender()\n const receiver = peer.getReceiver()\n acc[peer.getAccountId()] = {\n send: sender && sender.getStatus(),\n receive: receiver && receiver.getStatus()\n }\n return acc\n }, {})\n }\n }\n\n private updateLocalRoute (prefix: string, route?: Route) {\n const currentBest = this.localRoutingTable.get(prefix)\n const currentNextHop = currentBest && currentBest.nextHop\n const newNextHop = route && route.nextHop\n\n if (newNextHop !== currentNextHop) {\n if (route) {\n log.trace('new best route for prefix. prefix=%s oldBest=%s newBest=%s', prefix, currentNextHop, newNextHop)\n this.localRoutingTable.insert(prefix, route)\n } else {\n log.trace('no more route available for prefix. prefix=%s', prefix)\n this.localRoutingTable.delete(prefix)\n }\n\n this.updateForwardingRoute(prefix, route)\n\n return true\n }\n\n return false\n }\n\n private updateForwardingRoute (prefix: string, route?: Route) {\n if (route) {\n route = {\n ...route,\n path: [this.accounts.getOwnAddress(), ...route.path],\n auth: sha256(route.auth)\n }\n\n if (\n // Routes must start with the global prefix\n !prefix.startsWith(this.getGlobalPrefix()) ||\n\n // Don't publish the default route\n prefix === this.getGlobalPrefix() ||\n\n // Don't advertise local customer routes that we originated. Packets for\n // these destinations should still reach us because we are advertising our\n // own address as a prefix.\n (\n prefix.startsWith(this.accounts.getOwnAddress() + '.') &&\n route.path.length === 1\n ) ||\n\n canDragonFilter(\n this.forwardingRoutingTable,\n this.getAccountRelation,\n prefix,\n route\n )\n ) {\n route = undefined\n }\n }\n\n const currentBest = this.forwardingRoutingTable.get(prefix)\n\n const currentNextHop = currentBest && currentBest.route && currentBest.route.nextHop\n const newNextHop = route && route.nextHop\n\n if (currentNextHop !== newNextHop) {\n const epoch = this.forwardingRoutingTable.currentEpoch++\n const routeUpdate: RouteUpdate = {\n prefix,\n route,\n epoch\n }\n\n this.forwardingRoutingTable.insert(prefix, routeUpdate)\n\n log.trace('logging route update. update=%j', routeUpdate)\n\n if (currentBest) {\n this.forwardingRoutingTable.log[currentBest.epoch] = null\n }\n\n this.forwardingRoutingTable.log[epoch] = routeUpdate\n\n if (route) {\n // We need to re-check any prefixes that start with this prefix to see\n // if we can apply DRAGON filtering.\n //\n // Note that we do this check *after* we have added the new route above.\n const subPrefixes = this.forwardingRoutingTable.getKeysStartingWith(prefix)\n\n for (const subPrefix of subPrefixes) {\n if (subPrefix === prefix) continue\n\n const routeUpdate = this.forwardingRoutingTable.get(subPrefix)\n\n if (!routeUpdate || !routeUpdate.route) continue\n\n this.updateForwardingRoute(subPrefix, routeUpdate.route)\n }\n }\n }\n }\n\n private getAccountRelation = (accountId: string): Relation => {\n return accountId ? this.accounts.getInfo(accountId).relation : 'local'\n }\n}\n"]}
\No newline at end of file