예제 #1
0
    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);
    }
예제 #2
0
    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);
    }
예제 #3
0
    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);
    }
예제 #4
0
    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);
        }
    }