Пример #1
0
        public void handlePackage(Package package)
        {
            NHLFE_Entry nhlfeEntry = null;
            FIB_Entry   fibEntry   = null;

            if (package.labelStack.labels.Any())                         //check if stack has any elements
            {
                if (package.labelStack.labels.Peek().labelNumber == 0)   // check if i'm last hop
                {
                    //getting rid of all '0' labels (pushed in penultimate router)
                    while (package.labelStack.labels.Peek().labelNumber == 0)
                    {
                        package.labelStack.labels.Pop();
                        if (!package.labelStack.labels.Any())
                        {
                            break;
                        }
                    }

                    //if there are no labels left all tunnels are over. check fib table and return
                    if (!package.labelStack.labels.Any())
                    {
                        fibEntry     = findFibEntry(package.DestinationAddress);
                        package.Port = (ushort)fibEntry.portOut;
                        return;
                    }
                }

                ILM_Entry ilmEntry = findIlmEntry(package.Port, package.labelStack.labels.Peek().labelNumber);
                nhlfeEntry = findNhlfeEntry(ilmEntry.NHLFE_ID);
            }
            else
            {
                FEC_Entry fecEntry = findFecEntry(package.DestinationAddress);

                if (fecEntry != null)                         //adding label
                {
                    FTN_Entry ftnEntry = findFtnEntry(fecEntry.FEC);
                    nhlfeEntry = findNhlfeEntry(ftnEntry.NHLFE_ID);
                }
                else                                         //forwarding by IPAddress
                {
                    fibEntry = findFibEntry(package.DestinationAddress);
                }
            }

            modifyPackage(package, nhlfeEntry, fibEntry);
        }
Пример #2
0
        public FIB_Entry findFibEntry(IPAddress ipAddress)
        {
            FIB_Entry fibEntry = null;

            foreach (FIB_Entry item in FIB_Table)
            {
                if (ipAddress.ToString().Equals(item.destinationIP))
                {
                    fibEntry = item;
                    break;
                }
            }

            if (fibEntry == null)
            {
                Console.WriteLine("No fib found for IP  " + ipAddress);
            }

            return(fibEntry);
        }
Пример #3
0
        private void modifyPackage(Package package, NHLFE_Entry nhlfeEntry, FIB_Entry fibEntry)
        {
            if (nhlfeEntry != null)
            {
                package.Port = (ushort)nhlfeEntry.portOut;
                switch (nhlfeEntry.action)
                {
                case "swap":
                {
                    package.labelStack.labels.Pop();

                    Label newLabel = new Label();
                    newLabel.labelNumber = nhlfeEntry.labelsOut[0];
                    package.labelStack.labels.Push(newLabel);
                    break;
                }

                case "push":
                {
                    if (package.labelStack.labels.Any())
                    {
                        package.labelStack.labels.Pop();
                    }

                    foreach (ushort label in nhlfeEntry.labelsOut)
                    {
                        Label newLabel = new Label();
                        newLabel.labelNumber = label;
                        package.labelStack.labels.Push(newLabel);
                    }

                    break;
                }

                case "pop":
                {
                    //pop labels to replace them with '0'
                    for (int i = 0; i < nhlfeEntry.popDepth; i++)
                    {
                        package.labelStack.labels.Pop();
                    }

                    // add '0' labels
                    for (int i = 0; i < nhlfeEntry.popDepth; i++)
                    {
                        package.labelStack.labels.Push(new Label(0));
                    }

                    break;
                }


                default:
                {
                    Console.WriteLine("Wrong value in nhlfe.action field for portOut " + package.Port +
                                      " and labelOut " + nhlfeEntry.labelsOut[0]);
                    return;
                }
                }
            }
            else if (fibEntry != null)
            {
                package.Port = (ushort)fibEntry.portOut;
            }
            else
            {
                Console.WriteLine("Couldn't find forwarding information of package coming from port " + package.Port);
            }
        }