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 }
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 }
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 }