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 ILM_Entry findIlmEntry(int portIn, int labelIn) { ILM_Entry ilmEntry = null; foreach (ILM_Entry item in ILM_Table) { if (portIn.Equals(item.portIn) && labelIn.Equals(item.labelIn)) { ilmEntry = item; break; } } if (ilmEntry == null) { Console.WriteLine("No Ilm for portIn " + portIn + " and label " + labelIn); } return(ilmEntry); }