Пример #1
0
        private void ConnectionResponse_Analyse(int connectionID, bool isAccepted)
        {
            //wyszukujemy wskaźnik na odpowiednią tablicę
            ConnectionTableRecord record = _connectionsList[_indexInListOfConnection[connectionID]];

            //zwiększ liczbe otrzmyanych wiadomości
            record.NumberOfResponse++;

            //sprawdzamy, czy otrzymaliśmy wszystkie odpowiedzi
            if (record.NumberOfResponse == record.NumberOfRequest)
            {
                //zmień status na established
                record.Status = "established";

                //wyczyść zmienne w rekordzie
                record.NumberOfRequest  = 0;
                record.NumberOfResponse = 0;

                if (_higherAreaName != "")
                {
                    //trzeba odeslać wiadomość do CC

                    //znajdź adres wyżej w hierarchii węzła sterowania z którego musiało pochodzić pierwotne żądanie
                    string destinationIpAddress = _connectedCcDestinationAddrress[_higherAreaName];

                    //wyslij wiadomość potwierdzającą wykonanie zadania
                    ConnectionResponse(connectionID, true, destinationIpAddress);
                }
                else
                {
                    //trzeba odeslać wiadomośc do NCC
                    //znajdź etykiete wejściową i wyjściową
                    int labelIn  = 0;
                    int labelOut = 0;

                    //przeszukaj liste AllocatedSNP związaną z lokal areaName i znajdz SNP skojarzony z localBoundaryFirstSnppID
                    foreach (SNP element in record.AllocatedSnps[0])
                    {
                        if (element._snppID == record.LocalBoundaryFirstSnppID)
                        {
                            labelIn = element._allocatedLabel;
                        }
                        if (element._snppID == record.LocalBoundarySecondSnppID)
                        {
                            labelOut = element._allocatedLabel;
                        }
                        if ((labelIn != 0) && (labelOut != 0))
                        {
                            break;
                        }
                    }

                    //wyślij wiadomośc do NCC
                    ConnectionResponse(connectionID, true, labelIn, labelOut);
                }
            }
            //jak nie to nic nie rób, czekaj dalej
        }
Пример #2
0
        private void LinkConnectionResponse(int connectionID, bool isAccepted, List <SNP> receivedSnps, List <string> receivedSnpsAreaNames)
        {
            //wyszukujemy wskaźnik na odpowiednią tablicę
            ConnectionTableRecord record = _connectionsList[_indexInListOfConnection[connectionID]];

            //zwiększ liczbę otrzymanych wiadomości
            record.NumberOfResponse++;

            #region Step_1-Sprawdz_status_odpowiedzi
            if (isAccepted)
            {
                //odpowiedź jest pozytywna - udało się zaalokować łącze
                //uzupełniam odpowiednie listy danymi zawartymi w odpowiedzi
                for (int i = 0; i < receivedSnpsAreaNames.Count; i++)
                {
                    int index = record.AllocatedSnpAreaName.IndexOf(receivedSnpsAreaNames[i]);
                    record.AllocatedSnps[index].Add(receivedSnps[i]);
                }
            }
            else
            {
                //odpowiedź jest negatywna - nie udało się zaalowkować łącza
                SignallingNodeDeviceClass.MakeSignallingLog("CC", "ERROR - LinkConnectionRequest is not accepted");
                SignallingNodeDeviceClass.MakeSignallingConsoleLog("CC", "ERROR - LinkConnectionRequest is not accepted");

                //dopisać kod, który wykonuje sie w sytuacji odmowy alokacji
                return;
            }
            #endregion

            #region Step_2-Sprawdź_czy_odebrałem_wszystkie_odpowiedzi_czy_mam_czekac_dalej
            if (record.NumberOfResponse == record.NumberOfRequest)
            {
                //otrzymałem wszystkie odpowiedzi
                //ustaw nowy status rekordu oznaczający, że wszystkie lokalne linki zostały ustawione
                record.Status = "localLinksAllocated";

                //sprawdź, czy nasze połaczenie przechodzi przez jakieś podsieci
                if (record.AllocatedSnpAreaName.Count > 1)   //zawsze będzie nasza podsieć
                {
                    //ustaw nowe wartości Response i Request
                    record.NumberOfRequest  = record.AllocatedSnpAreaName.Count - 1;
                    record.NumberOfResponse = 0;

                    //wyślij do każdego areaName != localAreaName wiadomosć ConnectionRequest
                    //pierwszy wiersz dotyczy lokalnej sytuacji więc go omijamy
                    for (int i = 1; i < record.NumberOfRequest + 1; i++)
                    {
                        SNP snpIn  = record.AllocatedSnps[i][0];
                        SNP snpOut = record.AllocatedSnps[i][1];

                        //znajdź adres docelowy PC obsługującego CC niższego rzędu związanego z daną areaname
                        string destinationIpAddress = _connectedCcDestinationAddrress[record.AllocatedSnpAreaName[i]];

                        //wyślij do CC niższego rzędu wiadomośc connectionRequest
                        ConnectionRequest(connectionID, snpIn, snpOut, record.AllocatedCapacity, destinationIpAddress);
                    }
                }
                else
                {
                    //jak nie ma już żadnej podsieci to znaczy, że zakończyliśmy działania tego CC i wysyłamy ConnectionResponse do CC wyższego

                    //znajdź adres docelowy PC obsługującego CC wyższego rzędu związanego z daną areaname
                    string destinationIpAddress = _connectedCcDestinationAddrress[_higherAreaName];

                    ConnectionResponse(connectionID, true, destinationIpAddress);

                    //zmień status na established
                    record.Status = "established";
                }
            }
            else
            {
                //nie otrzymałem wszystkich więc czekam na pozostałe
                return;
            }

            #endregion

            //if (record.IsInterdomain && record.Status == "establishingInterdomainLink")
            //{

            //    //Wyslij do RC pierwsza parę złożoną ze zmiennych boudaryFirst boundarySecond znajdującej się w rekordzie
            //    SignalMessage message = new SignalMessage()
            //    {
            //        General_SignalMessageType = SignalMessage.SignalType.RouteQuery,
            //        General_SourceIpAddress = _localPcIpAddress,
            //        General_DestinationIpAddress = _localPcIpAddress,
            //        General_SourceModule = "CC",
            //        General_DestinationModule = "RC",

            //        ConnnectionID = record.ConnectionID,
            //        SnppIdPair = new SignalMessage.Pair
            //        {
            //            first = record.LocalBoundaryFirstSnppID,
            //            second = record.LocalBoundarySecondSnppID
            //        },
            //        CallingCapacity = record.AllocatedCapacity
            //    };

            //}
            //else
            //{
            //    //ustaw nowy status rekordu oznaczający, że wszystkie lokalne linki zostały ustawione
            //    record.Status = "localLinksAllocated";

            //    //sprawdź, czy nasze połaczenie przechodzi przez jakieś podsieci
            //    if (record.AllocatedSnpAreaName.Count > 1)   //zawsze będzie nasza podsieć
            //    {
            //        //zaalokuj nowe listy
            //        record.NumberOfCcConnectionRequestToSend = record.AllocatedSnpAreaName.Count;
            //        int
            //            //tworzę listę odpowiedzi
            //            record.IsConnectionResponse = new List<bool>(listCount);
            //        record.ConnectionResponseStatus = new List<bool>(listCount);

            //        //wyślij do każdego areaName != localAreaName wiadomosć ConnectionRequest
            //        //pierwszy wiersz dotyczy lokalnej sytuacji więc go omijamy
            //        for (int i = 1; i < listCount; i++)
            //        {
            //            SNP snpIn = record.AllocatedSnps[i][0];
            //            SNP snpOut = record.AllocatedSnps[i][1];

            //            ConnectionRequest(connectionID, snpIn, snpOut);
            //        }
            //    }
            //    else
            //    {
            //        //jak nie ma już żadnej podsieci to znaczy, że zakończyliśmy działania tego CC i wysyłamy ConnectionResponse
            //        ConnectionResponse(connectionID, true);

            //        //zmień status na established
            //        record.Status = "established";
            //    }
            //}
            //#endregion
        }
Пример #3
0
        private void RouteQueryResponse(int connectionID, List <SignalMessage.Pair> includedSnppIdPairs, List <string> includedAreaNames)
        {
            //wyszukujemy wskaźnik na odpowiednią tablicę
            ConnectionTableRecord record = _connectionsList[_indexInListOfConnection[connectionID]];

            //odczytuje przepustoowość z tablicy
            int callingCapacity = record.AllocatedCapacity;

            #region NoPathFound
            if (includedSnppIdPairs == null)
            {
                if (_higherAreaName != null)
                {
                    ConnectionFailure(connectionID, _higherAreaName);
                }
                else
                {
                    ConnectionFailure(connectionID);
                }
            }
            #endregion

            #region Empty_AreaName
            //jeżeli includedAreaName jest pusta to znaczy, że jest to pierwsza wiadomość i dostaliśmy ogólne SNPP in i out
            if (includedAreaNames.Count == 0)
            {
                //zapisz do tablicy graniczne zbiory SNPP
                record.LocalBoundaryFirstSnppID  = includedSnppIdPairs[0].first;
                record.LocalBoundarySecondSnppID = includedSnppIdPairs[0].second;

                //połączenie wewnątrzdomenowe
                if (includedSnppIdPairs.Count == 1)
                {
                    //zmieniamy typ połączenia w tablicy na nie międzydomenowy
                    record.IsInterdomain = false;

                    //odpytujemy RC o szczegóły połączenia pomiędzy zadną parą SNPP
                    RouteQuery(
                        connectionID,
                        new SignalMessage.Pair()
                    {
                        first = includedSnppIdPairs[0].first, second = includedSnppIdPairs[0].second
                    },
                        callingCapacity);

                    //wyjdź z metody
                    return;
                }

                //połączenie międzycdomenowe
                else
                {
                    //zmieniamy typ połączenia w tablicy na nie międzydomenowy
                    record.IsInterdomain = true;
                    record.Status        = "establishingInterdomainLink";

                    //tutaj musimy wysłac druga parę do własnego LRM aby otrzymać etykietę niezbędną do PeerCoordination
                    LinkConnectionRequest(
                        connectionID,
                        new SignalMessage.Pair()
                    {
                        first = includedSnppIdPairs[1].first, second = includedSnppIdPairs[1].second
                    },
                        callingCapacity);

                    //wyjdź z metody
                    return;
                }
            }
            #endregion

            #region Full_AreaName
            else
            {
                //dodac locka



                //uzupełniam tabele o podsieć do której należe
                record.AllocatedSnpAreaName.Add(_areaName);
                record.AllocatedSnps.Add(new List <SNP>());

                //uzupełniam tabele o nazwy uwikłanych podsieci oraz alokuje listy na SNP związane z nimi
                for (int i = 1; i < includedAreaNames.Count; i++)
                {
                    record.AllocatedSnpAreaName.Add(includedAreaNames[i]);
                    record.AllocatedSnps.Add(new List <SNP>());
                }

                //ustawiamy zmienną, mówiącą o ilości wysyłanych wiaodmości LinkConnectionRequest
                int numberOfPairs = includedSnppIdPairs.Count;
                record.NumberOfRequest = numberOfPairs;

                //wyzeruj liczbę otrzymanych wiadomości zwrotnych
                record.NumberOfResponse = 0;

                //wysyłamy wszystkie requesty na raz
                for (int i = 0; i < numberOfPairs; i++)
                {
                    LinkConnectionRequest(connectionID, includedSnppIdPairs[i], callingCapacity);
                }
            }
            #endregion
        }