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 FEC_Entry findFecEntry(IPAddress destinationAddress) { FEC_Entry fecEntry = null; foreach (FEC_Entry item in FEC_Table) { if (destinationAddress.ToString().Equals(item.destinationIP)) { fecEntry = item; break; } } if (fecEntry == null) { Console.WriteLine("No fec found for IP " + destinationAddress); } return(fecEntry); }