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); }
public FTN_Entry findFtnEntry(int FEC) { FTN_Entry ftnEntry = null; foreach (FTN_Entry item in FTN_Table) { if (FEC.Equals(item.FEC)) { ftnEntry = item; break; } } if (ftnEntry == null) { Console.WriteLine("No ftn found for fec " + FEC); } return(ftnEntry); }