예제 #1
0
        public ResponsePacket OnLocalTopology(RequestPacket requestPacket)
        {
            // Get OnLocalTopology_req packet params
            GenericPacket.PacketType type = requestPacket.Type;
            string            port1       = requestPacket.Port1;
            string            port2       = requestPacket.Port2;
            List <(int, int)> slotsArray  = requestPacket.SlotsArray;

            LOG.Info($"Received RC::OnLocalTopology_req" + $"(port1 = {port1}, port2 = {port2}," +
                     $" slotsArray = {SlotsArrayToString(slotsArray)})");

            // If it's first OnLocalTopology_req for this link just add it to the _links List
            if (!(_links.Any((link => link.PortAlias1 == port1 && link.PortAlias2 == port2))))
            {
                _links.Add(new Link(port1, port2, slotsArray));
            }
            else
            {
                // If link between given 2 ports already exists in _links update its SlotsArray
                foreach (Link link in _links.Where(link => link.PortAlias1 == port1 && link.PortAlias2 == port2))
                {
                    link.SlotsArray = slotsArray;
                }
            }

            LOG.Info($"Sending RC::OnLocalTopology_res" + $"(res = Ok)");

            return(new ResponsePacket.Builder()
                   .SetRes(ResponsePacket.ResponseType.Ok)
                   .Build());
        }
예제 #2
0
        public ResponsePacket OnCallCoordinationReceived(RequestPacket requestPacket)
        {
            // Get ConnectionRequest_req packet params
            GenericPacket.PacketType type = requestPacket.Type;
            string srcName     = requestPacket.SrcName;
            string dstName     = requestPacket.DstName;
            int    slotsNumber = requestPacket.SlotsNumber;

            LOG.Info($"Received NCC::CallCoordination_req" + $"(srcName = {srcName}, dstName = {dstName},slotsNumber = {slotsNumber})");

            // < C A L L   A D M I S S I O N   C O N T R O L >
            LOG.Info("Call Admission Control");
            // P O L I C Y
            // Randomize chance of rejecting ConnectionRequest_req by Policy component
            int chanceToRejectRequestInPolicy = _rnd.Next(0, 100);

            if (chanceToRejectRequestInPolicy > 5)
            {
                LOG.Info("ConnectionRequest meets conditions of Policy component");
            }
            else
            {
                return(new Builder()
                       .SetRes(ResponseType.AuthProblem)
                       .Build());
            }

            // D I R E C T O R Y
            // Find srcName and dstName ports in clientPortAliases dictionary
            string srcPort = null;
            string dstPort = null;

            foreach (string clientPortName in _clientPortAliases.Keys)
            {
                if (clientPortName == srcName)
                {
                    srcPort = _clientPortAliases[clientPortName];
                }
                if (clientPortName == dstName)
                {
                    dstPort = _clientPortAliases[clientPortName];
                }
            }

            // If Directory couldn't find dstPort send NCC::CallRequest_res(res=No client);
            if (dstPort == null)
            {
                LOG.Info($"Directory could not find port for user {dstName}");
                LOG.Info($"NCC::CallRequest_res(res = {ResponseTypeToString(ResponseType.NoClient)})");
                return(new Builder()
                       .SetRes(ResponseType.NoClient)
                       .Build());
            }
            // </ C A L L   A D M I S S I O N   C O N T R O L >
            // If Call passed CAC response with OK
            return(new Builder()
                   .SetRes(ResponseType.Ok)
                   .Build());
        }
예제 #3
0
        public ResponsePacket OnCallRequestReceived(RequestPacket requestPacket)
        {
            // Get ConnectionRequest_req packet params
            GenericPacket.PacketType type = requestPacket.Type;
            string srcName     = requestPacket.SrcName;
            string dstName     = requestPacket.DstName;
            int    slotsNumber = requestPacket.SlotsNumber;

            LOG.Info($"Received NCC::CallRequest_req" + $"(srcName = {srcName}, dstName = {dstName}, slotsNumber = {slotsNumber})");
            // < C A L L   A D M I S S I O N   C O N T R O L >
            LOG.Info("Call Admission Control");
            // P O L I C Y
            // Randomize chance of rejecting ConnectionRequest_req by Policy component
            int chanceToRejectRequestInPolicy = _rnd.Next(0, 100);

            if (chanceToRejectRequestInPolicy > 5)
            {
                LOG.Info("ConnectionRequest meets conditions of Policy component");
            }
            else
            {
                return(new Builder()
                       .SetRes(ResponseType.AuthProblem)
                       .Build());
            }
            // D I R E C T O R Y
            // Find srcName and dstName ports in clientPortAliases dictionary
            string srcPort = null;
            string dstPort = null;

            foreach (string clientPortName in _clientPortAliases.Keys)
            {
                if (clientPortName == srcName)
                {
                    srcPort = _clientPortAliases[clientPortName];
                }
                if (clientPortName == dstName)
                {
                    dstPort = _clientPortAliases[clientPortName];
                }
            }

            // If Directory couldn't find dstPort send NCC::CallRequest_res(res=No client);
            if (dstPort == null)
            {
                LOG.Info($"Directory could not find port for user {dstName}");
                LOG.Info($"NCC::CallRequest_res(res = {ResponseTypeToString(ResponseType.NoClient)})");
                return(new Builder()
                       .SetRes(ResponseType.NoClient)
                       .Build());
            }
            LOG.Info($"Directory found port: {dstPort} for client: {dstName}");
            LOG.Info($"Call Admission Control ended succesfully");
            // </ C A L L   A D M I S S I O N   C O N T R O L >

            //TODO [ASON] Ask dstClient if he wants to connect with srcClient

            // If CAC is passed, create a connection
            int connectionId = int.Parse($"{_domain[1]}{_connectionCounter++}{srcPort}{dstPort}");

            LOG.Trace($"connectionId: {connectionId}");
            Connection newConnection = new Connection(connectionId, srcName, srcPort, dstName, dstPort, slotsNumber);

            _connections.Add(newConnection);
            // Output active connections
            LOG.Info("Active Connections: ");
            foreach (Connection con in _connections)
            {
                LOG.Info(con.ToString);
            }

            // Check if dstPort is from NCC's domain or outside the domain
            string dstDomain     = GetDomainFromPort(dstPort);
            bool   outsideDomain = dstDomain != _domain;

            ResponseType res; //aux var for storing OneShotClients responses

            if (outsideDomain)
            {
                // Inter domain connections only

                // Ask second domain NCC
                // Send NCC::CallCoordination(srcName, dstName, sl)
                LOG.Info("Send NCC::CallCoordination_req" +
                         $"(srcName = {newConnection.SrcName}, dstName = {newConnection.DstName}, sl = {newConnection.SlotsNumber})");
                ResponsePacket nccCallCoordinationResponse = _nccCallCoordinationClient.Get(new RequestPacket.Builder()
                                                                                            .SetSrcName(newConnection.SrcName)
                                                                                            .SetDstName(newConnection.DstName)
                                                                                            .SetSlotsNumber(newConnection.SlotsNumber)
                                                                                            .Build());
                res = nccCallCoordinationResponse.Res;
                LOG.Info($"Received NCC::CallCoordination_res(res = {res})");
                // If second domain NCC refused the call we should also refuse it
                if (res != ResponseType.Ok)
                {
                    LOG.Info($"Second domain refused the call");
                    LOG.Info($"Send NCC::CallRequest_res(res = {ResponseTypeToString(ResponseType.AuthProblem)})");
                    return(new Builder()
                           .SetRes(ResponseType.Refused)
                           .Build());
                }
            }
            // Order domain CC to set a Connection
            // Send CC:ConnectionRequest(id, src, dst, sl)
            LOG.Info("Send CC:ConnectionRequest_req" +
                     $"(id = {connectionId}, src = {newConnection.SrcPortAlias}, dst = {newConnection.DstPortAlias}, sl = {newConnection.SlotsNumber})");
            RequestPacket ccConnectionRequestPacket = new RequestPacket.Builder()
                                                      .SetId(newConnection.Id)
                                                      .SetSrcPort(newConnection.SrcPortAlias)
                                                      .SetDstPort(newConnection.DstPortAlias)
                                                      .SetSlotsNumber(newConnection.SlotsNumber)
                                                      .Build();
            ResponsePacket connectionRequestResponse = _ccConnectionRequestClient.Get(ccConnectionRequestPacket);

            LOG.Info($"Received CC:ConnectionRequest_res(res = {connectionRequestResponse.Res})");
            res             = connectionRequestResponse.Res;
            (int, int)slots = connectionRequestResponse.Slots;
            // Check domain CC response
            switch (res)
            {
            case ResponseType.Ok:
            {
                _ccConnectionRequests[newConnection.Id] = ccConnectionRequestPacket;
                LOG.Info($"Send NCC::CallRequest_res(res = OK, id = {newConnection.Id}, slots = {slots})");
                return(new Builder()
                       .SetRes(ResponseType.Ok)
                       .SetId(newConnection.Id)
                       .SetSlots(slots)
                       .Build());
            }

            case ResponseType.ResourcesProblem:
            {
                LOG.Info("Send NCC:CallRequest_res(res = ResourcesProblem)");
                return(new Builder()
                       .SetRes(ResponseType.ResourcesProblem)
                       .Build());
            }

            default:
            {
                LOG.Info("Send NCC::CallRequest_res(res = Network Problem)");
                return(new Builder()
                       .SetRes(ResponseType.NetworkProblem)
                       .Build());
            }
            }
        }