예제 #1
0
        public Tunnel GetTunnel(string name)
        {
            Tunnel temp = new Tunnel("-", "-", "0", "0");

            foreach (Tunnel tunnel in tunnels)
            {
                if (tunnel.Nodes.ContainsKey(name))
                {
                    temp = tunnel;
                    if (name == "r2")
                    {
                        tunnels.Remove(tunnel);
                    }
                    break;
                }
            }

            return(temp);
        }
예제 #2
0
        public Tunnel RemoveTunnel(string start, string end, string first, string last)
        {
            Tunnel temp = new Tunnel("-", "-", "0", "0");

            foreach (Tunnel tunnel in tunnels)
            {
                if (tunnel.Start == start && tunnel.End == end && tunnel.First == first && tunnel.Last == last)
                {
                    temp = tunnel;
                    // usunięcie tunelu z pamięci?
                    break;
                }
                else if (start[0] == 'r' && end[0] == 'r' && tunnel.First == first && tunnel.Last == last)
                {
                    temp = tunnel;
                    // usunięcie tunelu z pamięci?
                    break;
                }
            }

            return(temp);
        }
예제 #3
0
        public void ListenStart()
        {
            listener.Start();
            nmap.Form.SetLog(GetTime() + "Włączono nasłuchiwanie.");

            while (isOn)
            {
                if (listener.Pending())
                {
                    TcpClient client       = listener.AcceptTcpClient();
                    Thread    clientThread = new Thread(new ParameterizedThreadStart(WorkWithClient));
                    nmap.Form.SetLog(GetTime() + "Połączono z nowym urządzeniem.");
                    clientThread.Start(client);
                }
                //Thread.Sleep(15);

                if (repair != "" && repair[0] == 'r' && (repair[1] == '5' || repair[1] == '8'))
                {
                    string[] repairTemp = repair.Split('|');

                    nmap.Form.SetOfficial(GetTime() + "LRM -> CC : Wykryto niesprawność węzła \"" + repairTemp[0] + "\"!");
                    nmap.Form.SetOfficial(GetTime() + "CC -> RC : Żądanie znalezienia drogi zastępczej dla węzła \"" + repairTemp[0] + "\".");

                    if (repairTemp[0] == "r2")
                    {
                        Tunnel tempTunnel = nmap.GetTunnel("r2");
                        if (tempTunnel.Nodes.Count == 0)
                        {
                            //nic nie rób
                        }
                        else
                        {
                            foreach (KeyValuePair <string, string> entry in tempTunnel.Nodes)
                            {
                                toSend[entry.Key].Add("Remove|" + entry.Value);
                            }
                        }
                    }
                    else if (repairTemp[0] == "r5")
                    {
                        /*toSend["r4"].Add("Remove|1|" + repairTemp[1] + "|" + repairTemp[2] + "|3");
                         * nmap.RemoveFib("r4", "1", "3", repairTemp[1], repairTemp[2]);
                         * toSend["r6"].Add("Remove|1|" + repairTemp[1] + "|" + repairTemp[2] + "|3");
                         * nmap.RemoveFib("r6", "1", "3", repairTemp[1], repairTemp[2]);
                         * toSend["r4"].Add("Add|1|" + repairTemp[1] + "|" + repairTemp[2] + "|2");
                         * nmap.AddFib("r4", "1", "2", repairTemp[1], repairTemp[2]);
                         * toSend["r6"].Add("Add|2|" + repairTemp[1] + "|" + repairTemp[2] + "|3");
                         * nmap.AddFib("r6", "2", "3", repairTemp[1], repairTemp[2]);*/

                        Tunnel tempTunnel = new Tunnel("-", "-", "0", "0");
                        do
                        {
                            tempTunnel = nmap.GetTunnel("r5");
                            if (tempTunnel.Start != "-")
                            {
                                for (int i = 0; i < tempTunnel.Nodes.Count; i++)
                                {
                                    if (tempTunnel.Nodes.ElementAt(i).Key == "r5" && tempTunnel.Nodes.ElementAt(i + 1).Key == "r4" && tempTunnel.Nodes.ElementAt(i - 1).Key == "r6")
                                    {
                                        toSend["r4"].Add("Remove|1|" + tempTunnel.First + "|" + tempTunnel.Last + "|3");
                                        nmap.RemoveFib("r4", "1", "3", tempTunnel.First, tempTunnel.Last);
                                        toSend["r6"].Add("Remove|1|" + tempTunnel.First + "|" + tempTunnel.Last + "|3");
                                        nmap.RemoveFib("r6", "1", "3", tempTunnel.First, tempTunnel.Last);
                                        toSend["r4"].Add("Add|1|" + tempTunnel.First + "|" + tempTunnel.Last + "|2");
                                        nmap.AddFib("r4", "1", "2", tempTunnel.First, tempTunnel.Last);
                                        toSend["r6"].Add("Add|2|" + tempTunnel.First + "|" + tempTunnel.Last + "|3");
                                        nmap.AddFib("r6", "2", "3", tempTunnel.First, tempTunnel.Last);

                                        nmap.ChangeTunnelConf(tempTunnel.Start, tempTunnel.End, tempTunnel.First, tempTunnel.Last, "r4", "1|" + tempTunnel.First + "|" + tempTunnel.Last + "|2");
                                        nmap.ChangeTunnelConf(tempTunnel.Start, tempTunnel.End, tempTunnel.First, tempTunnel.Last, "r6", "2|" + tempTunnel.First + "|" + tempTunnel.Last + "|3");
                                        nmap.ChangeTunnelConf(tempTunnel.Start, tempTunnel.End, tempTunnel.First, tempTunnel.Last, "r5", "Remove");
                                    }
                                    else if (tempTunnel.Nodes.ElementAt(i).Key == "r5" && tempTunnel.Nodes.ElementAt(i - 1).Key == "r4" && tempTunnel.Nodes.ElementAt(i + 1).Key == "r6")
                                    {
                                        toSend["r4"].Add("Remove|3|" + tempTunnel.First + "|" + tempTunnel.Last + "|1");
                                        nmap.RemoveFib("r4", "3", "1", tempTunnel.First, tempTunnel.Last);
                                        toSend["r6"].Add("Remove|3|" + tempTunnel.First + "|" + tempTunnel.Last + "|1");
                                        nmap.RemoveFib("r6", "3", "1", tempTunnel.First, tempTunnel.Last);
                                        toSend["r4"].Add("Add|2|" + tempTunnel.First + "|" + tempTunnel.Last + "|1");
                                        nmap.AddFib("r4", "2", "1", tempTunnel.First, tempTunnel.Last);
                                        toSend["r6"].Add("Add|3|" + tempTunnel.First + "|" + tempTunnel.Last + "|2");
                                        nmap.AddFib("r6", "3", "2", tempTunnel.First, tempTunnel.Last);

                                        nmap.ChangeTunnelConf(tempTunnel.Start, tempTunnel.End, tempTunnel.First, tempTunnel.Last, "r4", "2|" + tempTunnel.First + "|" + tempTunnel.Last + "|1");
                                        nmap.ChangeTunnelConf(tempTunnel.Start, tempTunnel.End, tempTunnel.First, tempTunnel.Last, "r6", "3|" + tempTunnel.First + "|" + tempTunnel.Last + "|2");
                                        nmap.ChangeTunnelConf(tempTunnel.Start, tempTunnel.End, tempTunnel.First, tempTunnel.Last, "r5", "Remove");
                                    }
                                }
                            }
                        }while (tempTunnel.Start != "-");
                    }
                    else if (repairTemp[0] == "r8")
                    {
                        /*toSend["r7"].Add("Remove|1|" + repairTemp[1] + "|" + repairTemp[2] + "|3");
                         * nmap.RemoveFib("r7", "1", "3", repairTemp[1], repairTemp[1]);
                         * toSend["r9"].Add("Remove|2|" + repairTemp[1] + "|" + repairTemp[2] + "|3");
                         * nmap.RemoveFib("r9", "2", "3", repairTemp[1], repairTemp[2]);
                         * toSend["r7"].Add("Add|1|" + repairTemp[1] + "|" + repairTemp[2] + "|2");
                         * nmap.AddFib("r7", "1", "2", repairTemp[1], repairTemp[2]);
                         * toSend["r9"].Add("Add|1|" + repairTemp[1] + "|" + repairTemp[2] + "|3");
                         * nmap.AddFib("r9", "1", "3", repairTemp[1], repairTemp[2]);*/


                        Tunnel tempTunnel = new Tunnel("-", "-", "0", "0");
                        do
                        {
                            tempTunnel = nmap.GetTunnel("r8");
                            if (tempTunnel.Start != "-")
                            {
                                for (int i = 0; i < tempTunnel.Nodes.Count; i++)
                                {
                                    if (tempTunnel.Nodes.ElementAt(i).Key == "r8" && tempTunnel.Nodes.ElementAt(i + 1).Key == "r7" && tempTunnel.Nodes.ElementAt(i - 1).Key == "r9")
                                    {
                                        toSend["r7"].Add("Remove|1|" + tempTunnel.First + "|" + tempTunnel.Last + "|3");
                                        nmap.RemoveFib("r7", "1", "3", tempTunnel.First, tempTunnel.Last);
                                        toSend["r9"].Add("Remove|2|" + tempTunnel.First + "|" + tempTunnel.Last + "|3");
                                        nmap.RemoveFib("r9", "2", "3", tempTunnel.First, tempTunnel.Last);
                                        toSend["r7"].Add("Add|1|" + tempTunnel.First + "|" + tempTunnel.Last + "|2");
                                        nmap.AddFib("r7", "1", "2", tempTunnel.First, tempTunnel.Last);
                                        toSend["r9"].Add("Add|1|" + tempTunnel.First + "|" + tempTunnel.Last + "|3");
                                        nmap.AddFib("r9", "1", "3", tempTunnel.First, tempTunnel.Last);

                                        nmap.ChangeTunnelConf(tempTunnel.Start, tempTunnel.End, tempTunnel.First, tempTunnel.Last, "r7", "1|" + tempTunnel.First + "|" + tempTunnel.Last + "|2");
                                        nmap.ChangeTunnelConf(tempTunnel.Start, tempTunnel.End, tempTunnel.First, tempTunnel.Last, "r9", "1|" + tempTunnel.First + "|" + tempTunnel.Last + "|3");
                                        nmap.ChangeTunnelConf(tempTunnel.Start, tempTunnel.End, tempTunnel.First, tempTunnel.Last, "r8", "Remove");
                                    }
                                    else if (tempTunnel.Nodes.ElementAt(i).Key == "r8" && tempTunnel.Nodes.ElementAt(i - 1).Key == "r7" && tempTunnel.Nodes.ElementAt(i + 1).Key == "r9")
                                    {
                                        toSend["r7"].Add("Remove|3|" + tempTunnel.First + "|" + tempTunnel.Last + "|1");
                                        nmap.RemoveFib("r7", "3", "1", tempTunnel.First, tempTunnel.Last);
                                        toSend["r9"].Add("Remove|3|" + tempTunnel.First + "|" + tempTunnel.Last + "|2");
                                        nmap.RemoveFib("r9", "3", "2", tempTunnel.First, tempTunnel.Last);
                                        toSend["r7"].Add("Add|2|" + tempTunnel.First + "|" + tempTunnel.Last + "|1");
                                        nmap.AddFib("r7", "2", "1", tempTunnel.First, tempTunnel.Last);
                                        toSend["r9"].Add("Add|3|" + tempTunnel.First + "|" + tempTunnel.Last + "|1");
                                        nmap.AddFib("r9", "3", "1", tempTunnel.First, tempTunnel.Last);

                                        nmap.ChangeTunnelConf(tempTunnel.Start, tempTunnel.End, tempTunnel.First, tempTunnel.Last, "r7", "2|" + tempTunnel.First + "|" + tempTunnel.Last + "|1");
                                        nmap.ChangeTunnelConf(tempTunnel.Start, tempTunnel.End, tempTunnel.First, tempTunnel.Last, "r9", "3|" + tempTunnel.First + "|" + tempTunnel.Last + "|1");
                                        nmap.ChangeTunnelConf(tempTunnel.Start, tempTunnel.End, tempTunnel.First, tempTunnel.Last, "r8", "Remove");
                                    }
                                }
                            }
                        }while (tempTunnel.Start != "-");
                    }

                    nmap.Form.SetOfficial(GetTime() + "RC -> CC : Odnaleziono nową ścieżkę:");

                    nmap.Form.SetOfficial(GetTime() + "CC -> LRM : Żądanie alokacji zasobów na potrzeby przejścia połączenia na nową ścieżkę.");
                    nmap.Form.SetOfficial(GetTime() + "LRM -> RC : Uaktualnienie informacji o stanie podsieci.");

                    repair = "";
                }
            }

            listener.Stop();
            //nmap.Form.SetLog(GetTime() + "Wyłaczono nasłuchiwanie.");  // okno (Form) już nie istnieje w tym momencie, patrz Form1.Dispose() (w "Designer.cs")
        }
예제 #4
0
        public string HandleNmsMsg(string msg)
        {
            string[] message = msg.Split('|');
            string   answer  = "-";

            try
            {
                if (message[0] == "CallCoordination")  // "CallCoordination"|nazwa domeny-nadawcy|id routera nadawcy|nazwa domeny-odbiorcy|id routera odbiorcy|klient docelowy|przepustowość|
                {
                    if (domainName[0] != 'd')
                    {
                        nmap.Form.SetLog(GetTime() + "BŁĄD! Otrzymano wiadomość NIE przeznaczoną dla subdomeny!");
                        return("Error|" + domainName + "|Otrzymano wiadomość NIE przeznaczoną dla subdomeny!");
                    }

                    nmap.Form.SetOfficial(GetTime() + "NCC : Otrzymano żądanie koordynacji połączenia od domeny \"" + message[1] + "\". Parametry:");
                    nmap.Form.SetOfficial("\tID routera brzegowego nadawcy: " + message[2] + ", ID routera brzegowego adresata (tej domeny): " + message[4]);
                    nmap.Form.SetOfficial("\tUżytkownik docelowy: " + message[5] + ", Przepustowość: " + message[6]);


                    string tempClient = "";
                    if (message[5] == "c1")
                    {
                        tempClient = "c2";
                    }
                    else if (message[5] == "c2")
                    {
                        tempClient = "c1";
                    }
                    toSend[message[5]].Add("CallAccept|" + tempClient);

                    nmap.Form.SetOfficial(GetTime() + "NCC : Wysłano do klienta \"" + message[5] + "\" prośbę o akceptację połączenia od klienta \"" + tempClient + "\".");
                    // wstawić for() żeby zająć czas???
                    nmap.Form.SetOfficial(GetTime() + "NCC : Klient \"" + message[5] + "\" zaakceptował połączenie.");

                    string decoded = "";
                    nmap.Form.SetOfficial(GetTime() + "NCC -> D : Translacja nazw użytkowników na adresy.");
                    if (message[5] == "c1")
                    {
                        decoded = "1101";
                    }
                    else if (message[5] == "c2")
                    {
                        decoded = "2101";
                    }


                    nmap.Form.SetOfficial(GetTime() + "D -> NCC : Adres użytkownika docelowego (\"" + message[5] + "\") to " + decoded + ".");
                    nmap.Form.SetOfficial(GetTime() + "NCC -> CC : Żądanie koordynacji połączenia z domeną \"" + message[1] + "\" z powyższymi parametrami.");
                    nmap.Form.SetOfficial(GetTime() + "CC -> RC : Żądanie koordynacji topologii (dostępnych szczelin) z domeną \"" + message[1] + "\".");
                    nmap.Form.SetOfficial(GetTime() + "RC : Wymieniono informacja o dostępnych szczelinach z domeną \"" + message[1] + "\".");
                    // nmap robi Dijkstre ale bez wyznacznania najkrótszej z najkrótszych - zwraca szczeliny na których znalazł najkrótsze trasy
                    // tutaj nie robimy uzgadniania, od razu wyznaczamy co trzeba

                    Dictionary <string, string> tempDict = new Dictionary <string, string>(nmap.GetPathPorts(nmap.TranslateID(message[4]), message[5], message[6], "").Nodes);

                    string tempS = "";
                    string route = "";
                    for (int i = 0; i < tempDict.Count; i++)
                    {
                        tempS += "\t" + tempDict.ElementAt(i).Key + "===" + tempDict.ElementAt(i).Value + Environment.NewLine;
                        route  = tempDict.ElementAt(i).Key + " -> " + route;
                    }
                    route = route.Substring(0, route.Length - 4);
                    nmap.Form.SetLog(GetTime() + "Ścieżka: " + tempS);

                    if (tempDict.Count > 1)
                    {
                        nmap.Form.SetOfficial(GetTime() + "RC -> CC : Odnaleziono ścieżkę.");
                        nmap.Form.SetOfficial("\t" + route);
                        nmap.Form.SetOfficial(GetTime() + "CC -> LRM : Żądanie alokacji zasobów na potrzeby połącznia pomiędzy routeram brzegowym o ID " + message[4] + " oraz użytkownikiem \"" + message[5] + "\" ścieżką otrzymaną od RC.");

                        for (int i = 1; i < tempDict.Count - 1; i++)
                        {
                            toSend[tempDict.ElementAt(i).Key].Add("Add|" + tempDict.ElementAt(i).Value);
                        }
                        string[] veryTemp = tempDict.ElementAt(tempDict.Count - 1).Value.Split('|');  // szczeliny first i last
                        // przesłanie do węzła brzegowego (zwykle jest to klient a nie węzeł):
                        if (domainName == "d1")
                        {
                            toSend[nmap.TranslateID(message[4])].Add("Add|2|" + veryTemp[veryTemp.Length - 2] + "|" + veryTemp[veryTemp.Length - 1] + "|" + nmap.FindPort(nmap.TranslateID(message[4]), tempDict.ElementAt(tempDict.Count - 2).Key));
                            nmap.AddFib(nmap.TranslateID(message[4]), "2", nmap.FindPort(nmap.TranslateID(message[4]), tempDict.ElementAt(1).Key), veryTemp[veryTemp.Length - 2], veryTemp[veryTemp.Length - 1]);
                            nmap.ChangeTunnelConf(nmap.TranslateID(message[4]), message[5], veryTemp[veryTemp.Length - 2], veryTemp[veryTemp.Length - 1], nmap.TranslateID(message[4]), "2|" + veryTemp[veryTemp.Length - 2] + "|" + veryTemp[veryTemp.Length - 1] + "|" + nmap.FindPort(nmap.TranslateID(message[4]), tempDict.ElementAt(tempDict.Count - 2).Key));
                        }
                        else
                        {
                            toSend[nmap.TranslateID(message[4])].Add("Add|1|" + veryTemp[veryTemp.Length - 2] + "|" + veryTemp[veryTemp.Length - 1] + "|" + nmap.FindPort(nmap.TranslateID(message[4]), tempDict.ElementAt(tempDict.Count - 2).Key));
                            nmap.AddFib(nmap.TranslateID(message[4]), "1", nmap.FindPort(nmap.TranslateID(message[4]), tempDict.ElementAt(1).Key), veryTemp[veryTemp.Length - 2], veryTemp[veryTemp.Length - 1]);
                            nmap.ChangeTunnelConf(nmap.TranslateID(message[4]), message[5], veryTemp[veryTemp.Length - 2], veryTemp[veryTemp.Length - 1], nmap.TranslateID(message[4]), "1|" + veryTemp[veryTemp.Length - 2] + "|" + veryTemp[veryTemp.Length - 1] + "|" + nmap.FindPort(nmap.TranslateID(message[4]), tempDict.ElementAt(tempDict.Count - 2).Key));
                        }

                        answer = "ExYupNMS|" + message[1] + "|" + message[2] + "|" + message[3] + "|" + message[4];

                        nmap.Form.SetOfficial(GetTime() + "LRM -> RC : Uaktualnienie informacji o stanie podsieci.");
                        // ma to już miejsce w funkcji GetPathPorts() (patrz AllocateChannels() i końcowe foreach)
                    }
                    else   // czyli jest tylko potencjalna wiadomość dla kienta lub nie ma nic - brak routerów po drodze
                    {
                        nmap.Form.SetOfficial(GetTime() + "RC -> CC : NIE odnaleziono ścieżki.");
                        answer = "ExNopeNMS|" + message[1] + "|" + message[2] + "|" + message[3] + "|" + message[4];
                    }
                }
                else if (message[0] == "Connect")  // "Connect"|nazwa domeny-nadawcy|id routera wejściowego|id routera wyjściowego|przepustowość|
                {
                    // nieaktualne
                }
                else if (message[0] == "Add") // "Add"|id_wej|first|last|id_wyj
                {
                    if (domainName[0] == 's')
                    {
                        nmap.Form.SetOfficial(GetTime() + "CC : ConnectionRequest() - otrzymano żądanie zestawienia połączenia między routerami brzegowymi o ID " + message[1] + " oraz " + message[4] + ".");
                        nmap.Form.SetOfficial("\tSzczeliny: " + message[2] + "-" + message[3]);
                        nmap.Form.SetOfficial(GetTime() + "CC -> RC : Żądanie znalezienia ścieżki pomiędzy routerami brzegowymi o ID " + message[1] + " oraz " + message[4] + ".");

                        string tempChan = message[2] + "-" + message[3];


                        Dictionary <string, string> tempDict = new Dictionary <string, string>(nmap.GetPathPorts(nmap.TranslateID(message[1]), nmap.TranslateID(message[4]), tempChan, "").Nodes);
                        string tempS = "";
                        string route = "";
                        for (int i = 0; i < tempDict.Count; i++)
                        {
                            tempS += "\t" + tempDict.ElementAt(i).Key + "===" + tempDict.ElementAt(i).Value + Environment.NewLine;
                            route  = tempDict.ElementAt(i).Key + " -> " + route;
                        }
                        route = route.Substring(0, route.Length - 4);
                        nmap.Form.SetLog(GetTime() + "Ścieżka: " + tempS);

                        if (tempDict.Count > 1)
                        {
                            nmap.Form.SetOfficial(GetTime() + "RC -> CC : Odnaleziono ścieżkę:");
                            nmap.Form.SetOfficial("\t" + route);
                            nmap.Form.SetOfficial(GetTime() + "CC -> LRM : Żądanie alokacji zasobów na potrzeby połącznia pomiędzy routerami brzegowymi o ID " + message[2] + " oraz " + message[3] + " ścieżką otrzymaną od RC.");

                            for (int i = 1; i < tempDict.Count - 1; i++)
                            {
                                toSend[tempDict.ElementAt(i).Key].Add("Add|" + tempDict.ElementAt(i).Value);
                            }

                            string[] veryTemp = tempDict.ElementAt(tempDict.Count - 1).Value.Split('|');

                            string tempPort1 = "";
                            string tempPort2 = "";

                            if (nmap.TranslateID(message[1]) == "r4")
                            {
                                tempPort1 = "1";
                                tempPort2 = "3";
                            }
                            else
                            {
                                tempPort1 = "3";
                                tempPort2 = "1";
                            }
                            // przesłanie do węzła brzegowego (zwykle jest to klient a nie węzeł):
                            toSend[nmap.TranslateID(message[1])].Add("Add|" + tempPort1 + "|" + veryTemp[veryTemp.Length - 2] + "|" + veryTemp[veryTemp.Length - 1] + "|" + nmap.FindPort(nmap.TranslateID(message[1]), tempDict.ElementAt(tempDict.Count - 2).Key));
                            toSend[nmap.TranslateID(message[4])].Add("Add|" + nmap.FindPort(nmap.TranslateID(message[4]), tempDict.ElementAt(tempDict.Count - 2).Key) + "|" + veryTemp[veryTemp.Length - 2] + "|" + veryTemp[veryTemp.Length - 1] + "|" + tempPort2);
                            nmap.AddFib(nmap.TranslateID(message[1]), tempPort1, nmap.FindPort(nmap.TranslateID(message[1]), tempDict.ElementAt(1).Key), veryTemp[veryTemp.Length - 2], veryTemp[veryTemp.Length - 1]);
                            nmap.AddFib(nmap.TranslateID(message[4]), nmap.FindPort(nmap.TranslateID(message[4]), tempDict.ElementAt(tempDict.Count - 2).Key), tempPort2, veryTemp[veryTemp.Length - 2], veryTemp[veryTemp.Length - 1]);
                            nmap.ChangeTunnelConf(nmap.TranslateID(message[1]), nmap.TranslateID(message[4]), message[2], message[3], nmap.TranslateID(message[1]), tempPort1 + "|" + veryTemp[veryTemp.Length - 2] + "|" + veryTemp[veryTemp.Length - 1] + "|" + nmap.FindPort(nmap.TranslateID(message[1]), tempDict.ElementAt(tempDict.Count - 2).Key));
                            nmap.ChangeTunnelConf(nmap.TranslateID(message[1]), nmap.TranslateID(message[4]), message[2], message[3], nmap.TranslateID(message[4]), nmap.FindPort(nmap.TranslateID(message[4]), tempDict.ElementAt(tempDict.Count - 2).Key) + "|" + veryTemp[veryTemp.Length - 2] + "|" + veryTemp[veryTemp.Length - 1] + "|" + tempPort2);
                            answer = "SubYupNMS|" + message[1] + "|" + message[2] + "|" + message[3] + "|" + message[4];

                            nmap.Form.SetOfficial(GetTime() + "LRM -> RC : Uaktualnienie informacji o stanie podsieci.");
                            // ma to już miejsce w funkcji GetPathPorts() (patrz AllocateChannels() i końcowe foreach)
                        }
                    }
                }
                else if (message[0] == "Remove")  // "Remove"|id_wej|first|last|id_wyj
                {
                    if (domainName == "d1")
                    {
                        nmap.Form.SetOfficial(GetTime() + "NCC : CallTeardown() - Otrzymano żądanie rozłączenia połączenia od węzła sterującego domeny \"d2\".");
                        nmap.Form.SetOfficial(GetTime() + "NCC -> CC : CallTeardown() - Przesłano żądanie rozłączenia połączenia. Parametry:");
                    }
                    else if (domainName == "d2")
                    {
                        nmap.Form.SetOfficial(GetTime() + "NCC : CallTeardown() - Otrzymano żądanie rozłączenia połączenia od węzła sterującego domeny \"d1\".");
                        nmap.Form.SetOfficial(GetTime() + "NCC -> CC : CallTeardown() - Przesłano żądanie rozłączenia połączenia. Parametry:");
                    }
                    else if (domainName == "s1")
                    {
                        nmap.Form.SetOfficial(GetTime() + "CC : CallTeardown() - Otrzymano żądanie rozłączenia połączenia. Parametry:");
                    }

                    nmap.Form.SetOfficial("\tID węzła wejściowego = " + message[1] + ", ID węzła wyjściowego = " + message[4]);
                    nmap.Form.SetOfficial("\tSzczeliny = " + message[2] + "-" + message[3]);
                    nmap.Form.SetOfficial(GetTime() + "CC -> LRM : Żądanie dealokacji zasobów połączenia o parametrach:");
                    nmap.Form.SetOfficial("\tUżytkownik początkowy = \"" + nmap.TranslateID(message[1]) + "\", użytkownik końcowy = " + nmap.TranslateID(message[4]));



                    Tunnel tempTunnel = nmap.RemoveTunnel(nmap.TranslateID(message[1]), nmap.TranslateID(message[4]), message[2], message[3]);
                    foreach (KeyValuePair <string, string> entry in tempTunnel.Nodes)
                    {
                        if (toSend.ContainsKey(entry.Key))
                        {
                            toSend[entry.Key].Add("Remove|" + entry.Value);
                        }
                    }

                    string tempClientStart = "";
                    string tempClientEnd   = "";
                    if (domainName == "d1")
                    {
                        tempClientStart = "c2";
                        tempClientEnd   = "c1";
                    }
                    else if (domainName == "d2")
                    {
                        tempClientStart = "c1";
                        tempClientEnd   = "c2";
                    }
                    toSend[tempClientEnd].Add("CallTeardown|" + tempClientStart);
                    nmap.Form.SetOfficial(GetTime() + "NCC : Przeszłano klientowi \"" + tempClientEnd + "\" informację o zerwaniu połączenia przez klienta \"" + tempClientStart + "\".");
                }
                else if (message[0] == "Error")
                {
                    nmap.Form.SetLog(GetTime() + "UWAGA! Węzeł zarządzanie \"" + message[1] + "\" przysłał komunikat o błędzie:");
                    nmap.Form.SetLog("\t" + message[2]);
                }
                else if (message[0] == "ExNopeNMS")
                {
                }
                else if (message[0] == "ExYupNMS")
                {
                }
                else if (message[0] == "SubNopeNMS")
                {
                }
                else if (message[0] == "SubYupNMS")
                {
                }
                else
                {
                    nmap.Form.SetLog(GetTime() + "BŁĄD! Otrzymano od innego systemu zarządzania wiadomość nieznanego typu!");
                    nmap.Form.SetLog("\t" + msg);
                    return("Error|" + domainName + "|Otrzymano od innego węzła zarządzania wiadomość nieznanego typu!");
                }
            }
            catch (Exception e)
            {
                nmap.Form.SetLog(GetTime() + "Wyjątek w komunikacji (HandleMessage) z głównym systemem zarządzania w domenie \"" + domainName + "\": " + e.Message);
            }
            return(answer);
        }
예제 #5
0
        public void WorkWithClient(object client)
        {
            TcpClient     tcpClient = client as TcpClient;
            NetworkStream stream    = tcpClient.GetStream();
            BinaryReader  reader    = new BinaryReader(stream);
            BinaryWriter  writer    = new BinaryWriter(stream);
            string        name      = "-";

            // Zabezpieczenie, prawdopodobnie nie potrzebne
            if (tcpClient == null)
            {
                nmap.Form.SetLog(GetTime() + "Klient TCP ma wartośc null - coś jest bardzo źle.");
                tcpClient.Close();
                return;
            }

            string msg;

            while (isOn)  // w tej pętli komunikacja w obie strony
            {
                try
                {
                    msg = "-";
                    if (stream.DataAvailable)
                    {
                        msg = reader.ReadString();
                        nmap.Form.SetLog(GetTime() + "Od urządenia \"" + name + "\" otrzymano wiadomość:");
                        nmap.Form.SetLog("\t" + msg);
                        string[] message = msg.Split('|');

                        if (name[0] == 'd' || name[0] == 's')
                        {
                            string answer = HandleNmsMsg(msg);

                            if (answer != "-")
                            {
                                writer.Write(answer);
                                writer.Flush();
                                nmap.Form.SetLog(GetTime() + "Urządzeniu \"" + name + "\" przesłano wiadomość:");
                                nmap.Form.SetLog("\t" + answer);
                            }
                        }
                        else if (message[0] == "Hello")
                        {
                            name = message[1];
                            nmap.Form.SetLog(GetTime() + "Urządzenie przedstawiło się jako: \"" + name + "\".");
                            clients.Add(name, tcpClient);
                            toSend.Add(name, new List <string>());

                            /*
                             * if(configurated)
                             * {
                             *  string temp = nmap.CreateConfig(name);
                             *  if (temp != "-")
                             *  {
                             *      writer.Write("Config|" + temp);
                             *      writer.Flush();
                             *      nmap.Form.SetLog(GetTime() + "Urządzeniu \"" + name + "\" przesłano konfigurację:");
                             *      nmap.Form.SetLog(temp);
                             *  }
                             *  else
                             *  {
                             *      nmap.Form.SetLog(GetTime() + "BŁĄD! Nie znaleziono konfiguracji dla urządzenia \"" + name + "\"!");
                             *  }
                             * }*/
                        }
                        else if (message[0] == "CallRequest") // "CallRequest"|client-target|przepustowość|symbole/sek
                        {
                            string decoded1 = "";
                            string decoded2 = "";

                            nmap.Form.SetOfficial(GetTime() + "NCC : CallRequest() - Otrzymano żądanie zestawienia połączenia od użytkownika \"" + name + "\". Parametry:");
                            nmap.Form.SetOfficial("\tAdresat = \"" + message[1] + "\", Przepustowość = " + message[2]);
                            nmap.Form.SetOfficial("\tPrzepustowość symbolowa podnośnej = " + message[3]);
                            nmap.Form.SetOfficial(GetTime() + "NCC -> P : Policy() - Żądanie uwierzytelnienia i autoryzacji użytkownika \"" + name + "\".");
                            nmap.Form.SetOfficial(GetTime() + "P -> NCC : Tożsamość i uprawnienia użytkownika \"" + name + "\" potwierdzone.");
                            nmap.Form.SetOfficial(GetTime() + "NCC -> D : Translacja nazw użytkowników na adresy.");
                            if (name == "c1")
                            {
                                decoded1 = "1101";
                                decoded2 = "2101";
                                nmap.Form.SetOfficial(GetTime() + "D -> NCC : Adres nadawcy \"c1\" = 1101, adres odbiorcy \"c2\" = 2101");
                            }
                            else if (name == "c2")
                            {
                                decoded1 = "2101";
                                decoded2 = "1101";
                                nmap.Form.SetOfficial(GetTime() + "D -> NCC : Adres nadawcy \"c2\" = 2101, adres odbiorcy \"c1\" = 1101");
                            }
                            nmap.Form.SetOfficial(GetTime() + "NCC -> CC : ConnectionRequest() - Żądanie zestawienia połączenia. Parametry:");
                            nmap.Form.SetOfficial("\tUżytkownik początkowy (nadawca) = \"" + decoded1 + "\", Użytkownik końcowy = \"" + decoded2);
                            nmap.Form.SetOfficial("\tPrzepustowość = " + message[2] + ", Przepustowość symbolowa podnośnej = " + message[3]);

                            nmap.Form.SetOfficial(GetTime() + "CC -> RC : RouteTableQuery() - Żądanie znalezienia ścieżki. Parametry:");
                            nmap.Form.SetOfficial("\tod użytkownika =" + decoded1 + ", do użytkownika =" + decoded2);
                            nmap.Form.SetOfficial("\tprzepustowość =" + message[2] + " , ilość podnośnych = 1, przepływność symbolowa =" + message[3] + ", kodowanie QAM");

                            string trueTarget = nmap.CheckIfExDomain(message[1]);
                            if (trueTarget != message[1])
                            {
                                nmap.Form.SetOfficial(GetTime() + "RC -> NCC : Wykryto, że użytkownik docelowy należy do innej domeny (\"" + trueTarget + "\").");
                                if (domainName == "d1")
                                {
                                    toSend[trueTarget].Add("CallCoordination|" + domainName + "|1|" + trueTarget + "|1|" + message[1] + "|" + message[2]);
                                }
                                else
                                {
                                    toSend[trueTarget].Add("CallCoordination|" + domainName + "|1|" + trueTarget + "|2|" + message[1] + "|" + message[2]);
                                }

                                nmap.Form.SetOfficial(GetTime() + "NCC : CallCoordination() - wysłano żądanie koordynacji do domeny \"" + trueTarget + "\" z parametrami:");
                                nmap.Form.SetOfficial("\tUżytkownik docelowy = \"" + message[1] + "\", Przepustowość = " + message[2]);
                                nmap.Form.SetOfficial("\tID routera brzegowego nadawcy (tej domeny) = " + "1" + ", ID routera brzegowego adresata = " + "1");
                                nmap.Form.SetOfficial(GetTime() + "NCC : Zakończono koordynację połączenia. Otrzymano informacje o dostępnych w domenie \"" + trueTarget + "\" szczelinach.");
                            }

                            Dictionary <string, string> tempDict = new Dictionary <string, string>(nmap.GetPathPorts(name, message[1], message[2], message[3]).Nodes);

                            string tempS = "";
                            string route = "";
                            for (int i = 0; i < tempDict.Count; i++)
                            {
                                tempS += "\t" + tempDict.ElementAt(i).Key + "===" + tempDict.ElementAt(i).Value + Environment.NewLine;
                                route  = tempDict.ElementAt(i).Key + " -> " + route;
                            }
                            route = route.Substring(0, route.Length - 4);

                            nmap.Form.SetLog(GetTime() + "Ścieżka i komendy konfiguracji:\n" + tempS);

                            if (tempDict.Count > 1)
                            {
                                nmap.Form.SetOfficial(GetTime() + "RC -> CC : Odnaleziono ścieżkę:");
                                nmap.Form.SetOfficial("\t" + route);
                                nmap.Form.SetOfficial(GetTime() + "CC : Podsieci \"s1\" wysłano żądanie zestawienia połączenia między interjesami 1 i 2.");
                                nmap.Form.SetOfficial(GetTime() + "CC -> LRM : Żądanie alokacji zasobów na potrzeby połącznia od użytkownika \"" + name + "\" do użytkownika \"" + message[1] + "\" ścieżką otrzymaną od RC.");

                                for (int i = 1; i < tempDict.Count - 1; i++)
                                {
                                    toSend[tempDict.ElementAt(i).Key].Add("Add|" + tempDict.ElementAt(i).Value);
                                }
                                writer.Write("Add|" + tempDict[name]);
                                writer.Flush();
                                string[] veryTemp = tempDict.ElementAt(tempDict.Count - 1).Value.Split('|');
                                nmap.ChangeTunnelConf(name, message[1], veryTemp[0], veryTemp[1], name, tempDict[name]);
                                nmap.Form.SetLog(GetTime() + "Urządzeniu \"" + name + "\" przesłano wiadomośc:");
                                nmap.Form.SetLog("\t" + "Add|" + tempDict[name]);

                                nmap.Form.SetOfficial(GetTime() + "LRM -> RC : Uaktualnienie informacji o stanie podsieci.");
                                // ma to już miejsce w funkcji GetPathPorts() (patrz AllocateChannels() i końcowe foreach)
                            }
                            else   // czyli jest tylko potencjalna wiadomość dla kienta lub nie ma nic - brak routerów po drodze
                            {
                                nmap.Form.SetOfficial(GetTime() + "RC -> CC : NIE odnaleziono ścieżki.");
                                writer.Write("Nope|" + message[1] + "|" + message[2]);
                                writer.Flush();
                            }
                        }
                        else if (message[0] == "CallTeardown")  // "CallTeardown"|target|first|last
                        {
                            nmap.Form.SetOfficial(GetTime() + "NCC : CallTeardown() - Otrzymano żądanie rozłączenia połączenia od użytkownika \"" + name + "\". Parametry:");
                            nmap.Form.SetOfficial("\tUżytkownik początkowy = \"" + name + "\", połączony z = " + message[1]);

                            string decoded1 = "";
                            string decoded2 = "";
                            if (name == "c1")
                            {
                                decoded1 = "1101";
                                decoded2 = "2101";
                            }
                            else if (name == "c2")
                            {
                                decoded1 = "2101";
                                decoded2 = "1101";
                            }
                            nmap.Form.SetOfficial(GetTime() + "NCC -> CC : ConnectionTeardown() - Żądanie zerwania połączenia. Parametry:");
                            nmap.Form.SetOfficial("\tUżytkownik początkowy = \"" + decoded1 + "\", użytkownik końcowy = " + decoded2 + ", szczeliny = " + message[2] + "-" + message[3]);
                            nmap.Form.SetOfficial(GetTime() + "CC : Podsieci \"s1\" wysłano żądanie zerwania połączenia między interjesami 1 i 2.");
                            nmap.Form.SetOfficial("\tSzczeliny: " + message[2] + "-" + message[3]);
                            nmap.Form.SetOfficial(GetTime() + "CC -> LRM : Żądanie dealokacji zasobów połączenia o parametrach:");
                            nmap.Form.SetOfficial("\tUżytkownik początkowy = \"" + decoded1 + "\", użytkownik końcowy = " + decoded2);



                            Tunnel tempTunnel = nmap.RemoveTunnel(name, message[1], message[2], message[3]);
                            foreach (KeyValuePair <string, string> entry in tempTunnel.Nodes)
                            {
                                if (toSend.ContainsKey(entry.Key) && entry.Key != "d1")
                                {
                                    toSend[entry.Key].Add("Remove|" + entry.Value);
                                }
                            }
                            if (domainName == "d2")
                            {
                                toSend["d1"].Add("Remove|2|" + message[2] + "|" + message[3] + "|1");
                            }
                        }
                        else if (message[0] == "ExNopeNMS")
                        {
                        }
                        else if (message[0] == "ExYupNMS")
                        {
                        }
                        else if (message[0] == "SubNopeNMS")
                        {
                        }
                        else if (message[0] == "SubYupNMS")
                        {
                        }
                        else
                        {
                            nmap.Form.SetLog(GetTime() + "BŁĄD! Otrzymano od urządzenia \"" + name + "\" wiadomość nieznanego typu!");
                        }
                    }
                    else  // test czy klient jeszcze żyje
                    {
                        if (tcpClient.Client.Poll(0, SelectMode.SelectRead))
                        {
                            byte[] buff = new byte[1];
                            if (tcpClient.Client.Receive(buff, SocketFlags.Peek) == 0)
                            {
                                break;
                            }
                        }
                    }
                }
                catch (Exception e)
                {
                    nmap.Form.SetLog(GetTime() + "Wyjątek w komunikacji z klientem \"" + name + "\": " + e.Message);
                    break;
                }

                if (name != "-" && toSend[name].Count != 0)
                {
                    foreach (string text in toSend[name].ToList())
                    {
                        writer.Write(text);
                        writer.Flush();
                        nmap.Form.SetLog(GetTime() + "Urządzeniu \"" + name + "\" przesłano wiadomość:");
                        nmap.Form.SetLog("\t" + name + "::" + text);
                    }
                    toSend[name].Clear();


                    /*if(toSend[name] == )
                     * {
                     *  string[] repairTemp = repair.Split('|');
                     *  if (repairTemp[3] == "r5")
                     *  {
                     *      if (toSend["r7"] == "")
                     *      {
                     *          toSend["r7"] = "Add|1|" + repairTemp[1] + "|" + repairTemp[2] + "|2";
                     *          nmap.AddFib("r7", "1", "2", repairTemp[1], repairTemp[1]);
                     *          toSend["r9"] = "Add|1|" + repairTemp[1] + "|" + repairTemp[2] + "|3";
                     *          nmap.AddFib("r9", "1", "3", repairTemp[1], repairTemp[1]);
                     *
                     *      }
                     *  }
                     *  else if (repairTemp[3] == "r8")
                     *  {
                     *      if (toSend["r4"] != "")
                     *      {
                     *          toSend["r4"] = "Add|1|" + repairTemp[1] + "|" + repairTemp[2] + "|2";
                     *          nmap.AddFib("r4", "1", "2", repairTemp[1], repairTemp[1]);
                     *          toSend["r6"] = "Add|2|" + repairTemp[1] + "|" + repairTemp[2] + "|3";
                     *          nmap.AddFib("r6", "2", "3", repairTemp[1], repairTemp[1]);
                     *          repair = "";
                     *      }
                     *  }
                     * }
                     * else*/
                }
            }

            string tempSS = "";

            if (name == "r8" || name == "r5")
            {
                if (nmap.GetNodeFib(name).Count > 0)
                {
                    tempSS = "|" + nmap.GetNodeFib(name)[0].first + "|" + nmap.GetNodeFib(name)[0].last;
                }
                repair = name + tempSS;
            }
            Thread.Sleep(15);
            DisconnectClient(name, tcpClient);
        }
예제 #6
0
        public Tunnel GetPathPorts(string start, string end, string bits, string bods)
        {
            List <string> temp    = GetPath(start, end, bits, bods); // najkrótsza ścieżka + pierwsza szczelina + ostatnia (2 ostatne stringi)
            string        config1 = "";
            string        config2 = "";
            //if (temp.Count < 5) // nie odnaleziono ścieżki
            //    return answer;
            Tunnel tunnel = new Tunnel(start, end, temp[temp.Count - 2], temp[temp.Count - 1]);

            for (int i = 1; i < temp.Count - 3; i++) // nie chcemy 3 ostatnich wartości - bo to są: pierwszy (nasz) klient, pierwsza szczelina, ostatnia szczelina
            {
                foreach (Link link in links)
                {
                    if (link.nameA == temp[i - 1] && link.nameB == temp[i])  // w temp są W ODWROTNEJ KOLEJNOŚCI WĘZŁY, czyli i-1 to ten DO którego wysyłamy
                    {
                        config2 = link.portB;
                        link.AllocateChannels(Int32.Parse(temp[temp.Count - 2]), Int32.Parse(temp[temp.Count - 1]));
                    }
                    else if (link.nameB == temp[i - 1] && link.nameA == temp[i])
                    {
                        config2 = link.portA;
                        link.AllocateChannels(Int32.Parse(temp[temp.Count - 2]), Int32.Parse(temp[temp.Count - 1]));
                    }

                    if (link.nameA == temp[i + 1] && link.nameB == temp[i])
                    {
                        config1 = link.portB;
                        link.AllocateChannels(Int32.Parse(temp[temp.Count - 2]), Int32.Parse(temp[temp.Count - 1]));
                    }
                    else if (link.nameB == temp[i + 1] && link.nameA == temp[i])
                    {
                        config1 = link.portA;
                        link.AllocateChannels(Int32.Parse(temp[temp.Count - 2]), Int32.Parse(temp[temp.Count - 1]));
                    }
                }

                foreach (Node n in nodes)
                {
                    if (n.Name == temp[i])
                    {
                        n.AddToFib(config1, config2, Int32.Parse(temp[temp.Count - 2]), Int32.Parse(temp[temp.Count - 1]));
                    }
                }
                // "Add"|portForm|First|Last|portTo
                tunnel.AddNode(temp[i], config1 + "|" + temp[temp.Count - 2] + "|" + temp[temp.Count - 1] + "|" + config2);
            }
            // przypomnienie: 3 ostatnie wartości temp - nasz klient (start), pierwsza szczelina, ostatnia szczelina
            tunnel.AddNode(start, end + "|" + temp[temp.Count - 2] + "|" + temp[temp.Count - 1]);
            foreach (Client c in clients)
            {
                if (c.Name == start)
                {
                    c.AddTarget(end, temp[temp.Count - 2], temp[temp.Count - 1]);
                    break;
                }
            }

            tunnels.Add(tunnel);
            UpdateNetwindow();
            return(tunnel);
        }