public static void ExcludeNode(INode myNode, DetectFailureRequest request) { ConstellationPlan RecoveryPlan = GenerateConstellation.GenerateTargetConstellation(myNode.Router.ReachableSats(myNode).Count, 7.152f); PlanRequest recoveryRequest = new PlanRequest { SourceID = myNode.Id, DestinationID = myNode.Id, Command = Request.Commands.GENERATE, Plan = RecoveryPlan, Dir = Router.CommDir.CW }; NetworkUpdateRequest updateRequest = new NetworkUpdateRequest(new List <uint?>() { request.NodeToCheck }); recoveryRequest.DependencyRequests.Add(updateRequest); if (myNode.Router.NextSequential(myNode, Router.CommDir.CW) == null) { recoveryRequest.Dir = Router.CommDir.CCW; } PlanGenerator.GeneratePlan(myNode, recoveryRequest); }
public static void Recovery(INode myNode, uint?secondFailedNode) { //Remove edge from router, ensuring it won't try to route through the failed node myNode.Router.DeleteEdge(myNode.Id, secondFailedNode); // Find positions of nodes this node can reach List <Vector3> positions = new List <Vector3> { myNode.Position }; List <uint?> nodesToVisit = new List <uint?> { myNode.Id }; while (nodesToVisit.Count > 0) { uint?nodeToVisit = nodesToVisit[0]; nodesToVisit.RemoveAt(0); List <NetworkMapEntry> neighbourEntries = myNode.Router.NetworkMap.GetEntryByID(nodeToVisit).Neighbours.Select(x => myNode.Router.NetworkMap.GetEntryByID(x)).ToList(); nodesToVisit.AddRange(neighbourEntries.Where(x => positions.Contains(x.Position) == false).Select(x => x.ID)); positions.AddRange(neighbourEntries.Where(x => positions.Contains(x.Position) == false).Select(x => x.Position)); } // Calculate midpoint Vector3 midpoint = positions.Aggregate(Vector3.Zero, (x, y) => x + y); Vector3 midpointOnRightAltitude = Vector3.Normalize(midpoint) * Vector3.Distance(Vector3.Zero, myNode.Position); // Generate recovery plan and start planning ConstellationPlan recoveryPlan = GenerateConstellation.GenerateRecoveryConstellation(midpointOnRightAltitude, positions.Count); PlanRequest recoveryRequest = new PlanRequest { SourceID = myNode.Id, DestinationID = myNode.Id, Command = Request.Commands.GENERATE, Plan = recoveryPlan, }; NetworkUpdateRequest updateRequest = new NetworkUpdateRequest(new NetworkUpdateRequest(new List <uint?>() { secondFailedNode })); recoveryRequest.DependencyRequests.Add(updateRequest); myNode.Router.NetworkMap.Entries.RemoveAll(entry => entry.ID == secondFailedNode); myNode.CommsModule.Send(myNode.Id, recoveryRequest); }
private static void Recover(INode myNode) { ConstellationPlan recoveryPlan = GenerateConstellation.GenerateTargetConstellation(myNode.Router.ReachableSats(myNode).Count, 7.152f); PlanRequest recoveryRequest = new PlanRequest { SourceID = myNode.Id, DestinationID = myNode.Id, Command = Request.Commands.GENERATE, Plan = recoveryPlan }; if (myNode.Router.NextSequential(myNode, Router.CommDir.CW) == null) { recoveryRequest.Dir = Router.CommDir.CCW; } myNode.CommsModule.Send(myNode.Id, recoveryRequest); }
public async static void FailureDetected(INode myNode, uint?failedNode) { //Remove edge from router, ensuring it won't try to route through the failed node myNode.Router.DeleteEdge(myNode.Id, failedNode); List <uint?> failedNeighbours = new List <uint?>() { myNode.Id }; List <uint?> neighboursToCheck = myNode.Router.NetworkMap.GetEntryByID(failedNode).Neighbours.Except(failedNeighbours).ToList(); // Start recovery plan gen without failedNode in case myNode is the only neighbour if (neighboursToCheck.Count == 0) { ConstellationPlan RecoveryPlan = GenerateConstellation.GenerateTargetConstellation(myNode.Router.ReachableSats(myNode).Count, 7.152f); PlanRequest recoveryRequest = new PlanRequest { SourceID = myNode.Id, DestinationID = myNode.Id, Command = Request.Commands.GENERATE, Plan = RecoveryPlan, Dir = Router.CommDir.CW }; NetworkUpdateRequest updateRequest = new NetworkUpdateRequest(new NetworkUpdateRequest(new List <uint?>() { failedNode })); recoveryRequest.DependencyRequests.Add(updateRequest); if (myNode.Router.NextSequential(myNode, Router.CommDir.CW) == null) { recoveryRequest.Dir = Router.CommDir.CCW; } PlanGenerator.GeneratePlan(myNode, recoveryRequest); } else // Otherwise ask another neighbour to try to contact failedNode { uint?neighbourID = neighboursToCheck[0]; uint?nextHop = myNode.Router.NextHop(myNode.Id, neighbourID); DetectFailureRequest request = new DetectFailureRequest { DestinationID = neighbourID, SourceID = myNode.Id, Command = Request.Commands.DETECTFAILURE, ResponseExpected = false, AckExpected = true, NodeToCheck = failedNode, DeadEdges = new List <Tuple <uint?, uint?> > { new Tuple <uint?, uint?>(myNode.Id, failedNode) }, FailedNeighbours = failedNeighbours }; myNode.Router.NetworkMap.Entries.RemoveAll(entry => entry.ID == failedNode); await myNode.CommsModule.SendAsync(nextHop, request, Constants.COMMS_TIMEOUT, Constants.COMMS_ATTEMPTS); } }