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); }
public NetworkUpdateRequest(NetworkUpdateRequest other) : base(other) { DeadNodes = other.DeadNodes; }
public Task<NetworkDetailResponse> UpdateNetwork(string networkId, NetworkUpdateRequest request) { throw new NotImplementedException(); }
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); } }
private async void ExecuteRequest(Request request, bool isDependency) { switch (request.Command) { case Request.Commands.GENERATE: PlanGenerator.GeneratePlan(this, request as PlanRequest); break; case Request.Commands.EXECUTE: PlanExecuter.ExecutePlan(this, request as PlanRequest); break; case Request.Commands.HEARTBEAT: Heartbeat.RespondToHeartbeat(this, request); break; case Request.Commands.PING: Ping.RespondToPing(this, request); break; case Request.Commands.DETECTFAILURE: FailureDetection.DetectFailure(this, request as DetectFailureRequest); break; case Request.Commands.DISCOVER: await Discovery.DiscoverAsync(this, request as DiscoveryRequest); break; case Request.Commands.POSITION: PositionResponse response = new PositionResponse(Id, request.SourceID, Response.ResponseCodes.OK, request.MessageIdentifer, Position); CommsModule.Send(request.SourceID, response); break; case Request.Commands.ADDITION: List <uint?> neighbours = CommsModule.Discover(); AdditionRequest addition = (request as AdditionRequest).DeepCopy(); List <ConstellationPlanField> fields = new List <ConstellationPlanField> { new ConstellationPlanField("DeltaV", 0, (x, y) => x.CompareTo(y)) }; addition.plan.Entries.Add(new ConstellationPlanEntry(Id, Position, fields, (x, y) => 1)); ActivePlan = addition.plan; Router.UpdateNetworkMap(addition.plan); NodeAdditionResponse additionResponse = new NodeAdditionResponse(Id, request.SourceID, Response.ResponseCodes.OK, request.MessageIdentifer, Position, neighbours); CommsModule.Send(request.SourceID, additionResponse); break; case Request.Commands.UPDATENETWORKMAP: NetworkUpdateRequest updateRequest = request as NetworkUpdateRequest; //Remove any dead nodes from the networkmap Router.NetworkMap.Entries.RemoveAll(entry => updateRequest.DeadNodes.Contains(entry.ID)); //Remove any dead nodes from neighbour lists foreach (NetworkMapEntry entry in Router.NetworkMap.Entries) { foreach (uint?deadNode in updateRequest.DeadNodes) { entry.Neighbours.Remove(deadNode); } } break; default: throw new NotImplementedException(request.Command.ToString() + " was not implemented."); } }