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 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); }
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); } }