Exemplo n.º 1
0
        public NetworkNode(NetworkNodeModel parameters)
            : base(
                parameters.NetworkAddress, parameters.IpAddress, parameters.CableCloudListeningPort,
                parameters.SignallingCloudListeningPort)
        {
            CableCloudMessage.MaxAtmCellsNumber = parameters.MaxAtmCellsNumberInCableCloudMessage;

            CommutationMatrix              = new CommutationMatrix(new CommutationTable(), parameters.NumberOfPorts);
            CommutationMatrix.UpdateState += (sender, state) => OnUpdateState(state);

            _connectionController                = new ConnectionController(parameters.NetworkAddress);
            _connectionController.UpdateState   += (sender, state) => OnUpdateState(state);
            _connectionController.MessageToSend += (sender, message) => Send(message);


            _linkResourceManager                     = new LinkResourceManager(parameters.NetworkAddress);
            _linkResourceManager.UpdateState        += (sender, state) => OnUpdateState(state);
            _linkResourceManager.MessageToSend      += (sender, message) => Send(message);
            _linkResourceManager.CommutationCommand += ConnectionControllerOnCommutationCommand;

            NetworkNodeAgent = new NetworkNodeAgent(parameters.NetworkAddress, parameters.IpAddress,
                                                    parameters.NetworkManagmentSystemListeningPort);
            NetworkNodeAgent.UpdateState           += (sender, state) => OnUpdateState(state);
            NetworkNodeAgent.ConfigurationReceived += NetworkNodeAgentOnConfigurationReceived;

            StartThread();
        }
Exemplo n.º 2
0
        public void ActivateRouter()
        {
            Console.WriteLine("My name is: " + this.Name);
            SocketToForward = new Socket(cloudIp.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
            SocketToDomain  = new Socket(DomainIP.AddressFamily, SocketType.Stream, ProtocolType.Tcp);

            SocketToForward.Connect(new IPEndPoint(cloudIp, cloudPort)); // connection with cloud
            Console.WriteLine(this.Name + ": [" + DateTime.UtcNow.ToString("HH:mm:ss.fff",
                                                                           System.Globalization.CultureInfo.InvariantCulture) + "] " + "Connected with cloud :)");
            SocketToForward.Send(Encoding.ASCII.GetBytes("First Message " + this.IpAddress.ToString() + " Router"));
            byte[] buffer1 = new byte[256];

            SocketToForward.Receive(buffer1);//node has to know about used ports
            usedPorts = givePorts(buffer1);
            for (int i = 0; i < usedPorts.ToArray().Length; i++)
            {
                ushort port = usedPorts[i];
                LinkResourceManager link = new LinkResourceManager(port);
                link.IPofNode = this.IpAddress;
                linkResources.Add(link); // creating LRM's
            }
            SocketToDomain.Connect(new IPEndPoint(DomainIP, DomainPort));
            List <byte> bufferForLRMs = new List <byte>();
            List <byte> buffer2       = new List <byte>();

            bufferForLRMs.AddRange(Encoding.ASCII.GetBytes("CC-callin " + this.IpAddress.ToString() + " "));
            int j = 0;

            foreach (var linkResource in this.linkResources)
            {
                //bufferForLRMs.Add(0); // flaga
                bufferForLRMs.AddRange(linkResource.convertToBytes());
                buffer2.AddRange(linkResource.convertToBytes());
                Console.WriteLine("After conversion " + (ushort)((buffer2[j + 1] << 8) + buffer2[j]));
                j += 16;
            }
            for (int k = 0; k < buffer2.Count; k++)
            {
                Console.Write(buffer2[k] + " ");
            }
            Console.WriteLine();
            SocketToDomain.Send(bufferForLRMs.ToArray()); // zgłasza się  do Domaina
            Console.WriteLine((ushort)((buffer2.ToArray()[1] << 8) + buffer2.ToArray()[0]));
            byte[] buffer = new byte[4096];
            Console.WriteLine(this.Name + ": [" + DateTime.UtcNow.ToString("HH:mm:ss.fff",
                                                                           CultureInfo.InvariantCulture) + "] " + "Connected with Domain :)");
            //byte[] msg = Encoding.ASCII.GetBytes(Name);

            // int bytesSent = SocketToDomain.Send(msg);

            Thread forwardingThread = new Thread(WaitForPackage);
            Thread managementThread = new Thread(WaitForCommands);

            managementThread.Start();
            forwardingThread.Start();
        }
Exemplo n.º 3
0
        public static LinkResourceManager findLRM(IPAddress ip, ushort port, List <LinkResourceManager> links)
        {
            LinkResourceManager link = null;

            foreach (var l in links)
            {
                if (l.IPofNode == ip && l.port == port)
                {
                    link = l;
                    break;
                }
            }
            return(link);
        }
Exemplo n.º 4
0
        static void Main(string[] args)
        {
            enni = PointBetweenDomains.readInfo(args[0]);
            enni.socketToCloud.Connect(new IPEndPoint(IPAddress.Parse("127.0.0.1"), enni.portOfCloud));
            enni.socketToCloud.Send(Encoding.ASCII.GetBytes("First Message " + enni.ip.ToString()));
            byte[] buffer12 = new byte[128];
            enni.socketToCloud.Receive(buffer12);
            Console.WriteLine("received info");
            byte[] buffer    = new byte[128];
            int    readBytes = 0;
            // readBytes=enni.socketToCloud.Receive(buffer);
            LinkResourceManager lrm = new LinkResourceManager(enni.port1);

            lrm.IPofNode = enni.ip;
            enni.lrms.Add(lrm);
            LinkResourceManager lrm1 = new LinkResourceManager(enni.port2);

            lrm1.IPofNode = enni.ip;
            enni.lrms.Add(lrm1);
            List <byte> buffer1 = new List <byte>();

            buffer1.AddRange(Encoding.ASCII.GetBytes("CC-callin " + enni.ip.ToString() + " "));

            buffer1.AddRange(lrm.convertToBytes());

            enni.socketToDomain1.Connect(new IPEndPoint(IPAddress.Parse("127.0.0.1"), enni.portDomain1));
            enni.socketToDomain1.Send(buffer1.ToArray());
            buffer1.Clear();
            buffer1.AddRange(Encoding.ASCII.GetBytes("CC-callin " + enni.ip.ToString() + " "));
            buffer1.AddRange(lrm1.convertToBytes());

            /* foreach (var lr in enni.lrms)
             * {
             *   buffer1.AddRange(lr.convertToBytes());
             * }*/
            enni.socketToDomain2.Connect(new IPEndPoint(IPAddress.Parse("127.0.0.1"), enni.portDomain2));
            enni.socketToDomain2.Send(buffer1.ToArray());
            Thread thread = new Thread(WaitForData);

            thread.Start();
        }
Exemplo n.º 5
0
        public void GetConnectionWithCloud()
        {
            try
            {
                client.socketToCloud = new Socket(client.cloudIP.AddressFamily, SocketType.Stream, ProtocolType.Tcp); // Stream uses TCP protocol
                Dispatcher.Invoke(() => ListBox12.Items.Add("This is " + client.clientName));
                client.socketToCloud.Connect(new IPEndPoint(client.cloudIP, client.cloudPort));                       //connect with server
                Dispatcher.Invoke(() => ListBox12.Items.Add("This is " + client.clientName));
                Dispatcher.Invoke(() => ListBox12.Items.Add(client.clientName + ": [" + DateTime.UtcNow.ToString("HH:mm:ss.fff",
                                                                                                                 CultureInfo.InvariantCulture) + "] " + "I got connection with cable cloud"));
                client.socketToCloud.Send(Encoding.ASCII.GetBytes("First Message " + client.clientIP.ToString())); // zgłasza się do chmury
                byte[] buffer1 = new byte[256];

                client.socketToCloud.Receive(buffer1);//node has to know about used ports
                client.usedPorts = givePorts(buffer1);
                Dispatcher.Invoke(() => ListBox12.Items.Add("Received"));


                for (int i = 0; i < client.usedPorts.ToArray().Length; i++)
                {
                    ushort port = client.usedPorts[i];

                    Dispatcher.Invoke(() => ListBox12.Items.Add(port));
                    LinkResourceManager link = new LinkResourceManager(port);
                    link.IPofNode = client.clientIP;
                    client.linkResources.Add(link); // adding LRMs
                }
            }
            catch (SocketException e)
            {
                ListBox12.Items.Add(client.clientName + ": Cant get connection");
                Task.Run(GetConnectionWithCloud);
            }

            Task.Run(ConnectWithDomain); // CPCC łączy się z domeną
        }
Exemplo n.º 6
0
        public static void ReceiveCallBack(IAsyncResult asyncResult)
        {
            StateObject state   = (StateObject)asyncResult.AsyncState;
            Socket      handler = state.workSocket; //socket of client

            int ReadBytes;

            try
            {
                ReadBytes = handler.EndReceive(asyncResult);
            }
            catch (Exception e)
            {
                Console.WriteLine(e);
                throw;
            }

            state.sb.Append(Encoding.ASCII.GetString(state.buffer, 0, ReadBytes));
            var message = state.sb.ToString().Split(' ');

            // first message must be send to get information about connected socket: First Message <Ip address>
            if (message[0].Equals("NCC-GET")) // żądanie hosta na połączenie
            {
                String source      = message[1];
                String destination = message[2];
                int    speed       = int.Parse(message[3]);
                Console.WriteLine("Speed " + speed);
                Console.WriteLine("Checking in directory...");
                IPAddress sourceAddress = domain.NCC.DirectoryRequest(source);
                IPAddress destAddress   = domain.NCC.DirectoryRequest(destination);
                bool      flag          = false;
                Console.WriteLine("Checking policy...");
                flag = domain.NCC.PolicyRequest(sourceAddress, destAddress);
                ushort portOfSubSource = 0;
                ushort portOfSubDest   = 0;
                bool   ifSubnet        = false;
                if (sourceAddress != null && destAddress != null)
                {                                                                                                                                   //RC w swoim pliku ma odległość przy danym source i destination więc to też do zrobienia
                    RoutingResult routingResult = domain.RC.DijkstraAlgorithm(sourceAddress, destAddress, domain.RC.cables, domain.RC.lrms, speed); // prototyp funkcji Dijkstry
                    foreach (var node in routingResult.Path)
                    {
                        if (node.Equals(domain.RC.ipOfSubnet) && domain.RC.ipOfSubnet != null)
                        {
                            ifSubnet = true;
                            break;
                        }
                    }
                    if (ifSubnet)
                    {
                        Cable cable1 = null;
                        foreach (var node in routingResult.networkNodes)
                        {
                            if (node.ipadd.Equals(sourceAddress))
                            {
                                continue;
                            }
                            Console.WriteLine("Node: " + node.ipadd + " Predecessory: " + node.predecessor.ipadd);
                            if (node.ipadd.Equals(domain.RC.ipOfSubnet))
                            {
                                cable1 = findCableBetweenNodes(node.ipadd, node.predecessor.ipadd, domain.RC.cables);
                                // cable1 = findCableBetweenNodes(node.ipadd, node.predecessor.ipadd, domain.RC.cables);
                                if (cable1.Node1.Equals(node.ipadd))
                                {
                                    portOfSubSource = cable1.port1;
                                }
                                else if (cable1.Node2.Equals(node.ipadd))
                                {
                                    portOfSubSource = cable1.port2;
                                }
                            }
                            if (node.predecessor.ipadd.Equals(domain.RC.ipOfSubnet))
                            {
                                cable1 = findCableBetweenNodes(node.ipadd, node.predecessor.ipadd, domain.RC.cables);
                                if (cable1.Node1.Equals(node.predecessor.ipadd))
                                {
                                    portOfSubDest = cable1.port1;
                                }
                                else if (cable1.Node2.Equals(node.predecessor.ipadd))
                                {
                                    portOfSubDest = cable1.port2;
                                }
                            }
                        }



                        Socket      socket1             = domain.CC.SocketfromIP[domain.RC.ipOfSubnet];
                        List <byte> bufferForSubnetwork = new List <byte>();
                        // Cable cable=findCableBetweenNodes(domain.RC.ipOfSubnet, )
                        bufferForSubnetwork.AddRange(Encoding.ASCII.GetBytes("SET-CONNECTION " + portOfSubSource + " " + portOfSubDest + " " + routingResult.startSlot + " " + routingResult.lastSlot + " " + routingResult.speed + " " + routingResult.lengthOfGivenDomain));
                        domain.socketToSub.Send(bufferForSubnetwork.ToArray());
                    }

                    //  Console.WriteLine("RoutingResult Count: " + routingResult.networkNodes.Count);

                    List <int> idxOfSlots = new List <int>();
                    for (int i = 0; i < 10; i++)
                    {
                        if (routingResult.slots[i])
                        {
                            idxOfSlots.Add(i);
                            Console.WriteLine("Index of slot: " + i);
                        }
                    }
                    foreach (var node in routingResult.Path)
                    {
                        Console.WriteLine("Chosen node: " + node.ToString());
                    }
                    List <byte> bufferToSend = new List <byte>();
                    int         ct           = 0;
                    foreach (var cab in routingResult.nodeAndPortsOut)
                    {
                        bool   flaga  = false;
                        Socket socket = domain.CC.SocketfromIP[cab.Key];
                        Console.WriteLine("Adres: " + cab.Key + " port out: " + cab.Value);
                        foreach (var cab1 in routingResult.nodeAndPortsIn)
                        {
                            if (cab1.Key.Equals(cab.Key))
                            {
                                Console.WriteLine("Port in: " + cab1.Value);
                                bufferToSend.AddRange(Encoding.ASCII.GetBytes("ACK"));
                                bufferToSend.AddRange(BitConverter.GetBytes(idxOfSlots[0]));
                                bufferToSend.AddRange(BitConverter.GetBytes(idxOfSlots[idxOfSlots.Count - 1]));
                                bufferToSend.AddRange(BitConverter.GetBytes(cab.Value));
                                bufferToSend.AddRange(BitConverter.GetBytes(cab1.Value));
                                socket.BeginSend(bufferToSend.ToArray(), 0, bufferToSend.ToArray().Length, 0,
                                                 new AsyncCallback(SendCallBack), socket);
                                bufferToSend.Clear();
                                flaga = true;
                                break;
                            }
                        }
                        if (!flaga)
                        {
                            bufferToSend.AddRange(Encoding.ASCII.GetBytes("ACK"));
                            bufferToSend.AddRange(BitConverter.GetBytes(idxOfSlots[0]));
                            bufferToSend.AddRange(BitConverter.GetBytes(idxOfSlots[idxOfSlots.Count - 1]));
                            bufferToSend.AddRange(BitConverter.GetBytes(cab.Value));

                            socket.BeginSend(bufferToSend.ToArray(), 0, bufferToSend.ToArray().Length, 0,
                                             new AsyncCallback(SendCallBack), socket);
                            Console.WriteLine("Send to host: " + cab.Key);
                            bufferToSend.Clear();
                            flaga = false;
                        }
                    }
                }
                else
                {
                    /*Thread thread = new Thread(connectWithSecondDomain);
                     * thread.Start();*/

                    List <byte> buffer = new List <byte>();
                    buffer.AddRange(Encoding.ASCII.GetBytes("RC-giveDomainPoint " + sourceAddress.ToString() + " " + destination + " " + speed));
                    // Socket socket = domain.CC.SocketfromIP[IPAddress.Parse("127.0.0.1")];
                    //socket.BeginSend(buffer.ToArray(),0,buffer.ToArray().Length,0, new AsyncCallback(SendCallBack), socket);

                    //Console.WriteLine("Connected");
                    domain.domainClient.Send(buffer.ToArray());
                    Console.WriteLine("Connected");
                    // domain.domainClient.Disconnect(true);
                    //domain.domainClient.Send(buffer.ToArray());
                }
            }
            //  bool ifSubnet = false;

            //  Console.WriteLine("RoutingResult Count: " + routingResult.networkNodes.Count);

            if (message[0].Equals("RC-giveDomainPoint"))
            {
                Console.WriteLine("Rc-giveDomainPoint");
                IPAddress source      = IPAddress.Parse(message[1]);
                String    destination = message[2];
                Console.WriteLine("Checking in other directory...");
                IPAddress    destAddress   = domain.NCC.DirectoryRequest(destination);
                int          speed         = int.Parse(message[3]);
                StreamReader streamReader  = new StreamReader("domainPoints.txt");
                IPAddress    borderAddress = null;
                string       line;
                while ((line = streamReader.ReadLine()) != null)
                {
                    if ((IPAddress.Parse(line.Split(' ')[0]).Equals(source) && IPAddress.Parse(line.Split(' ')[1]).Equals(destAddress)) || (IPAddress.Parse(line.Split(' ')[0]).Equals(destAddress) && IPAddress.Parse(line.Split(' ')[1]).Equals(source)))
                    {
                        borderAddress = IPAddress.Parse(line.Split(' ')[2]);
                        break;
                    }
                }
                // domain.domainClient.Connect(new IPEndPoint(IPAddress.Parse("127.0.0.1"), domain.secondDomainPort));
                domain.domainClient.Send(Encoding.ASCII.GetBytes("RC-SecondDomainTopology " + borderAddress.ToString() + " " + source.ToString() + " " + speed + " " + destAddress.ToString()));
                // domain.domainClient.Disconnect(true);
                Console.WriteLine("Send " + borderAddress.ToString());
            }
            if (message[0].Equals("SET-REST-CONNECTION"))
            {
                Console.WriteLine("I will set rest connection");
                IPAddress border                = IPAddress.Parse(message[1]);
                IPAddress destination           = IPAddress.Parse(message[2]);
                int       speed                 = int.Parse(message[3]);
                int       startslot             = int.Parse(message[4]);
                int       lastSlot              = int.Parse(message[5]);
                int       length_of_prev_domain = int.Parse(message[6]);
                IPAddress source                = IPAddress.Parse(message[7]);
                Console.WriteLine("Checking directory...");
                Console.WriteLine("Checking policy...");
                RoutingResult result       = domain.RC.SubentDijkstraAlgorithm(border, destination, domain.RC.cables, domain.RC.lrms, speed, startslot, lastSlot, length_of_prev_domain);
                List <byte>   bufferToSend = new List <byte>();
                if (result.lastSlot == lastSlot)
                {
                    foreach (var cab in result.nodeAndPortsOut)
                    {
                        bool   flaga  = false;
                        Socket socket = domain.CC.SocketfromIP[cab.Key];
                        Console.WriteLine("Adres: " + cab.Key + " port out: " + cab.Value);

                        foreach (var cab1 in result.nodeAndPortsIn)
                        {
                            if (cab1.Key.Equals(cab.Key))
                            {
                                Console.WriteLine("Port in: " + cab1.Value);
                                bufferToSend.AddRange(Encoding.ASCII.GetBytes("ACK"));
                                bufferToSend.AddRange(BitConverter.GetBytes(result.startSlot));
                                bufferToSend.AddRange(BitConverter.GetBytes(result.lastSlot));
                                bufferToSend.AddRange(BitConverter.GetBytes(cab.Value));
                                bufferToSend.AddRange(BitConverter.GetBytes(cab1.Value));
                                socket.BeginSend(bufferToSend.ToArray(), 0, bufferToSend.ToArray().Length, 0,
                                                 new AsyncCallback(SendCallBack), socket);
                                bufferToSend.Clear();
                                flaga = true;
                                break;
                            }
                        }
                        if (!flaga)
                        {
                            bufferToSend.AddRange(Encoding.ASCII.GetBytes("ACK"));
                            bufferToSend.AddRange(BitConverter.GetBytes(result.startSlot));
                            bufferToSend.AddRange(BitConverter.GetBytes(result.lastSlot));
                            bufferToSend.AddRange(BitConverter.GetBytes(cab.Value));

                            socket.BeginSend(bufferToSend.ToArray(), 0, bufferToSend.ToArray().Length, 0,
                                             new AsyncCallback(SendCallBack), socket);
                            Console.WriteLine("Send to E-nni: " + cab.Key);
                            bufferToSend.Clear();
                            flaga = false;
                        }
                    }
                    bufferToSend.AddRange(Encoding.ASCII.GetBytes("OK"));
                    domain.domainClient.Send(bufferToSend.ToArray());
                }
                else
                {
                    List <byte> buffer = new List <byte>();
                    buffer.AddRange(Encoding.ASCII.GetBytes("RETRY " + source.ToString() + " " + border.ToString() + " " + speed + " " + result.startSlot + " " + result.lastSlot + " " + result.lengthOfGivenDomain + " " + destination.ToString()));
                    domain.domainClient.Send(buffer.ToArray());
                }
            }
            if (message[0].Equals("RETRY"))
            {
                Console.WriteLine("I will RETRY");
                IPAddress     source                = IPAddress.Parse(message[1]);
                IPAddress     border                = IPAddress.Parse(message[2]);
                int           speed                 = int.Parse(message[3]);
                int           startslot             = int.Parse(message[4]);
                int           lastSlot              = int.Parse(message[5]);
                int           length_of_prev_domain = int.Parse(message[6]);
                IPAddress     destination           = IPAddress.Parse(message[7]);
                RoutingResult result                = domain.RC.SubentDijkstraAlgorithm(border, destination, domain.RC.cables, domain.RC.lrms, speed, startslot, lastSlot, length_of_prev_domain);
                List <byte>   buffer                = new List <byte>();
                buffer.AddRange(Encoding.ASCII.GetBytes("SET-REST-CONNECTION " + border.ToString() + " " + destination.ToString() + " " + speed + " " + result.startSlot + " " + result.lastSlot + " " + result.lengthOfGivenDomain + " " + source.ToString()));
                domain.domainClient.Send(buffer.ToArray());
            }
            if (message[0].Equals("OK"))
            {
                foreach (var cab in r.nodeAndPortsOut)
                {
                    bool   flaga  = false;
                    Socket socket = domain.CC.SocketfromIP[cab.Key];
                    Console.WriteLine("Adres: " + cab.Key + " port out: " + cab.Value);
                    List <byte> bufferToSend = new List <byte>();
                    foreach (var cab1 in r.nodeAndPortsIn)
                    {
                        if (cab1.Key.Equals(cab.Key))
                        {
                            Console.WriteLine("Port in: " + cab1.Value);
                            bufferToSend.AddRange(Encoding.ASCII.GetBytes("ACK"));
                            bufferToSend.AddRange(BitConverter.GetBytes(r.startSlot));
                            bufferToSend.AddRange(BitConverter.GetBytes(r.lastSlot));
                            bufferToSend.AddRange(BitConverter.GetBytes(cab.Value));
                            bufferToSend.AddRange(BitConverter.GetBytes(cab1.Value));
                            socket.BeginSend(bufferToSend.ToArray(), 0, bufferToSend.ToArray().Length, 0,
                                             new AsyncCallback(SendCallBack), socket);
                            bufferToSend.Clear();
                            flaga = true;
                            break;
                        }
                    }
                    if (!flaga)
                    {
                        bufferToSend.AddRange(Encoding.ASCII.GetBytes("ACK"));
                        bufferToSend.AddRange(BitConverter.GetBytes(r.startSlot));
                        bufferToSend.AddRange(BitConverter.GetBytes(r.lastSlot));
                        bufferToSend.AddRange(BitConverter.GetBytes(cab.Value));

                        socket.BeginSend(bufferToSend.ToArray(), 0, bufferToSend.ToArray().Length, 0,
                                         new AsyncCallback(SendCallBack), socket);
                        Console.WriteLine("Send to Host: " + cab.Key);
                        bufferToSend.Clear();
                        flaga = false;
                    }
                }
            }

            //Domain.NCC.ConnectionRequest(sourceAddress, destAddress, speed);

            if (message[0].Equals("RC-SecondDomainTopology"))
            {
                Console.WriteLine("RC second domain topology");
                IPAddress borderAddress      = IPAddress.Parse(message[1]);
                IPAddress sourceAddress      = IPAddress.Parse(message[2]);
                int       speed              = int.Parse(message[3]);
                IPAddress destinationAddress = IPAddress.Parse(message[4]);
                Console.WriteLine("Saved data");
                RoutingResult routing = domain.RC.DijkstraAlgorithm(sourceAddress, borderAddress, domain.RC.cables, domain.RC.lrms, speed);
                r = routing;
                bool ifSubnet = false;
                foreach (var node in routing.Path)
                {
                    if (node.Equals(domain.RC.ipOfSubnet) && domain.RC.ipOfSubnet != null)
                    {
                        ifSubnet = true;
                        break;
                    }
                }
                ushort portOfSubSource = 0;
                ushort portOfSubDest   = 0;
                if (ifSubnet)
                {
                    Cable cable1 = null;
                    foreach (var node in routing.networkNodes)
                    {
                        if (node.ipadd.Equals(sourceAddress))
                        {
                            continue;
                        }
                        Console.WriteLine("Node: " + node.ipadd + " Predecessory: " + node.predecessor.ipadd);
                        if (node.ipadd.Equals(domain.RC.ipOfSubnet))
                        {
                            cable1 = findCableBetweenNodes(node.ipadd, node.predecessor.ipadd, domain.RC.cables);
                            // cable1 = findCableBetweenNodes(node.ipadd, node.predecessor.ipadd, domain.RC.cables);
                            if (cable1.Node1.Equals(node.ipadd))
                            {
                                portOfSubSource = cable1.port1;
                            }
                            else if (cable1.Node2.Equals(node.ipadd))
                            {
                                portOfSubSource = cable1.port2;
                            }
                        }
                        if (node.predecessor.ipadd.Equals(domain.RC.ipOfSubnet))
                        {
                            cable1 = findCableBetweenNodes(node.ipadd, node.predecessor.ipadd, domain.RC.cables);
                            if (cable1.Node1.Equals(node.predecessor.ipadd))
                            {
                                portOfSubDest = cable1.port1;
                            }
                            else if (cable1.Node2.Equals(node.predecessor.ipadd))
                            {
                                portOfSubDest = cable1.port2;
                            }
                        }
                    }
                    Socket      socket1             = domain.CC.SocketfromIP[domain.RC.ipOfSubnet];
                    List <byte> bufferForSubnetwork = new List <byte>();
                    // Cable cable=findCableBetweenNodes(domain.RC.ipOfSubnet, )
                    bufferForSubnetwork.AddRange(Encoding.ASCII.GetBytes("SET-CONNECTION " + portOfSubSource + " " + portOfSubDest + " " + routing.startSlot + " " + routing.lastSlot + " " + routing.speed + " " + routing.lengthOfGivenDomain));
                    domain.socketToSub.Send(bufferForSubnetwork.ToArray());
                }

                /*List<int> idxOfSlots = new List<int>();
                 * for (int i = 0; i < 10; i++)
                 * {
                 *  if (routing.slots[i])
                 *  {
                 *      idxOfSlots.Add(i);
                 *      Console.WriteLine("Index of slot: " + i);
                 *  }
                 * }*/
                // Socket socket = domain.CC.SocketfromIP[IPAddress.Parse("127.0.0.1")];
                List <byte> buffer = new List <byte>();
                buffer.AddRange(Encoding.ASCII.GetBytes("SET-REST-CONNECTION " + borderAddress.ToString() + " " + destinationAddress.ToString() + " " + speed + " " + routing.startSlot + " " + routing.lastSlot + " " + routing.lengthOfGivenDomain + " " + sourceAddress.ToString()));
                //domain.domainClient.Connect(new IPEndPoint(IPAddress.Parse("127.0.0.1"), domain.secondDomainPort));
                domain.domainClient.Send(buffer.ToArray());
                //domain.domainClient.Disconnect(true);
                // socket.BeginSend(buffer.ToArray(), 0, buffer.ToArray().Length, 0, new AsyncCallback(SendCallBack), socket);
            }

            if (message[0].Equals("CC-callin"))
            {
                domain.CC.IPfromSocket.Add(handler, IPAddress.Parse(message[1]));
                domain.CC.SocketfromIP.Add(IPAddress.Parse(message[1]), handler); // router wysyła też swoje LRMy więc trzeba je dodać do RC
                Console.WriteLine("Called in to domain: " + IPAddress.Parse(message[1]));
                domain.RC.nodesToAlgorithm.Add(IPAddress.Parse(message[1]));
                List <byte> bufferLRM = new List <byte>();
                bufferLRM.AddRange(Encoding.ASCII.GetBytes(message[2]));

                /* for(int j=0; j<bufferLRM.Count;j++)
                 * {
                 *   Console.Write(bufferLRM[j] + " ");
                 *
                 * }*/
                Console.WriteLine();

                /*  ushort port1 = (ushort)((bufferLRM[1] << 8) + bufferLRM[0]);
                 * Console.WriteLine(port1);
                 * Console.WriteLine(bufferLRM.Count);*/
                byte[] buffer = new byte[16];
                int    i      = 0;
                while (i < bufferLRM.Count)
                {
                    buffer = bufferLRM.GetRange(i, 16).ToArray();
                    ushort port = (ushort)((buffer[1] << 8) + buffer[0]);
                    Console.WriteLine(port);
                    LinkResourceManager LRM = LinkResourceManager.returnLRM(buffer);
                    i += 16;
                    Console.WriteLine("Port: " + LRM.port);
                    domain.RC.lrms.Add(LRM);
                }
                // Array.Clear(state.buffer, 0, state.buffer.Length);
            }
            if (message[0].Equals("SUBNETWORK-callin"))
            {
                domain.CC.IPfromSocket.Add(handler, IPAddress.Parse(message[1]));
                domain.CC.SocketfromIP.Add(IPAddress.Parse(message[1]), handler);
                domain.RC.nodesToAlgorithm.Add(IPAddress.Parse(message[1]));
                domain.RC.ipOfSubnet = IPAddress.Parse(message[1]);
                ushort portOfSub = ushort.Parse(message[2]);
                Console.WriteLine("Subnetwork called in: " + IPAddress.Parse(message[1]));
                List <byte> bufferLRM = new List <byte>();
                domain.socketToSub.Connect(new IPEndPoint(IPAddress.Parse("127.0.0.1"), portOfSub));
                bufferLRM.AddRange(Encoding.ASCII.GetBytes(message[3]));
                byte[] buffer = new byte[16];
                int    i      = 0;
                while (i < bufferLRM.Count)
                {
                    buffer = bufferLRM.GetRange(i, 16).ToArray();
                    ushort port = (ushort)((buffer[1] << 8) + buffer[0]);
                    Console.WriteLine("Ports of subnetwork: " + port);
                    LinkResourceManager LRM = LinkResourceManager.returnLRM(buffer);
                    i += 16;
                    // Console.WriteLine("Port: " + LRM.port);
                    domain.RC.lrms.Add(LRM);
                }
            }
            state.sb.Clear();
            handler.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0, new AsyncCallback(ReceiveCallBack), state);
        }
        public void TestLRM()
        {
            var subnetwork1Address = new NetworkAddress("1");

            var client1Address = new NetworkAddress("1.1.1");
            var client2Address = new NetworkAddress("1.2.1");

            var node1Address = new NetworkAddress("1.1");
            var node2Address = new NetworkAddress("1.2");

            var node1Client1SnppOut = new SubnetworkPointPool(client1Address.Append(1));
            var node1Client1SnppIn  = new SubnetworkPointPool(node1Address.Append(1));
            var node1Node2SnppOut   = new SubnetworkPointPool(node2Address.Append(2));
            var node1Node2SnppIn    = new SubnetworkPointPool(node1Address.Append(2));
            var node2Client2SnppOut = new SubnetworkPointPool(client2Address.Append(1));
            var node2Client2SnppIn  = new SubnetworkPointPool(node2Address.Append(1));

            var client1Node1Link = new Link(node1Client1SnppIn, node1Client1SnppOut, 10, true);
            var node1Node2Link   = new Link(node1Node2SnppIn, node1Node2SnppOut, 10, false);
            var client2Node2Link = new Link(node2Client2SnppIn, node2Client2SnppOut, 10, true);

            var rcAddress = subnetwork1Address;
            var rc        = new RoutingController(rcAddress);

            _controlPlaneElements.Add(new Row(rcAddress, ControlPlaneElementType.RC), rc);

            var ccAddress = subnetwork1Address;
            var cc        = new ConnectionController(ccAddress);

            _controlPlaneElements.Add(new Row(ccAddress, ControlPlaneElementType.CC), cc);

            var cc1Address = node1Address;
            var cc1        = new ConnectionController(cc1Address);

            _controlPlaneElements.Add(new Row(cc1Address, ControlPlaneElementType.CC), cc1);

            var cc2Address = node2Address;
            var cc2        = new ConnectionController(cc2Address);

            _controlPlaneElements.Add(new Row(cc2Address, ControlPlaneElementType.CC), cc2);

            var lrm1Address = node1Address;
            var lrm1        = new LinkResourceManager(lrm1Address);

            _controlPlaneElements.Add(new Row(lrm1Address, ControlPlaneElementType.LRM), lrm1);

            var lrm2Address = node2Address;
            var lrm2        = new LinkResourceManager(lrm2Address);

            _controlPlaneElements.Add(new Row(lrm2Address, ControlPlaneElementType.LRM), lrm2);


            rc.MessageToSend   += PassMessage;
            cc.MessageToSend   += PassMessage;
            cc1.MessageToSend  += PassMessage;
            cc2.MessageToSend  += PassMessage;
            lrm1.MessageToSend += PassMessage;
            lrm2.MessageToSend += PassMessage;

            rc.UpdateState   += UpdateState;
            cc.UpdateState   += UpdateState;
            cc1.UpdateState  += UpdateState;
            cc2.UpdateState  += UpdateState;
            lrm1.UpdateState += UpdateState;
            lrm2.UpdateState += UpdateState;

            lrm1.ReceiveMessage(new SignallingMessage {
                Operation                      = OperationType.Configuration,
                Payload                        = client1Node1Link,
                DestinationAddress             = node1Address,
                DestinationControlPlaneElement = ControlPlaneElementType.LRM
            });

            lrm1.ReceiveMessage(new SignallingMessage {
                Operation                      = OperationType.Configuration,
                Payload                        = client1Node1Link.Reverse(),
                DestinationAddress             = node1Address,
                DestinationControlPlaneElement = ControlPlaneElementType.LRM
            });

            lrm1.ReceiveMessage(new SignallingMessage {
                Operation                      = OperationType.Configuration,
                Payload                        = node1Node2Link,
                DestinationAddress             = node1Address,
                DestinationControlPlaneElement = ControlPlaneElementType.LRM
            });

            lrm1.ReceiveMessage(new SignallingMessage {
                Operation                      = OperationType.Configuration,
                Payload                        = node1Node2Link.Reverse(),
                DestinationAddress             = node1Address,
                DestinationControlPlaneElement = ControlPlaneElementType.LRM
            });

            lrm2.ReceiveMessage(new SignallingMessage {
                Operation                      = OperationType.Configuration,
                Payload                        = node1Node2Link,
                DestinationAddress             = node2Address,
                DestinationControlPlaneElement = ControlPlaneElementType.LRM
            });

            lrm2.ReceiveMessage(new SignallingMessage {
                Operation                      = OperationType.Configuration,
                Payload                        = node1Node2Link.Reverse(),
                DestinationAddress             = node2Address,
                DestinationControlPlaneElement = ControlPlaneElementType.LRM
            });

            lrm2.ReceiveMessage(new SignallingMessage {
                Operation                      = OperationType.Configuration,
                Payload                        = client2Node2Link,
                DestinationAddress             = node2Address,
                DestinationControlPlaneElement = ControlPlaneElementType.LRM
            });

            lrm2.ReceiveMessage(new SignallingMessage {
                Operation                      = OperationType.Configuration,
                Payload                        = client2Node2Link.Reverse(),
                DestinationAddress             = node2Address,
                DestinationControlPlaneElement = ControlPlaneElementType.LRM
            });

            cc.ReceiveMessage(new SignallingMessage {
                DemandedCapacity               = 5,
                DestinationAddress             = ccAddress,
                DestinationControlPlaneElement = ControlPlaneElementType.CC,
                DestinationClientAddress       = client2Address,
                Operation = OperationType.ConnectionRequest,
                Payload   = new[] {
                    node1Client1SnppIn,
                    node1Node2SnppOut
                },
                SourceAddress             = subnetwork1Address,
                SourceClientAddress       = client1Address,
                SourceControlPlaneElement = ControlPlaneElementType.CC
            });
        }