public class Router implements IRouter { private DoubleList SLN, SLH; //input and service level queues private SingleList Port0, Port1; //output ports private int SLHpct; //service level percentages private int lastID, numSLH, numTotal; //packets processed //default router initializes the linked lists, packets processed public Router() { SLN = new DoubleList(); SLH = new DoubleList(); Port0 = new SingleList(); Port1 = new SingleList(); lastID = 0; numSLH = 0; numTotal=0; } //Calls the default router, sets the percentages public Router (int high_pct) { this(); SLHpct = high_pct; } //pre - p is a valid packet //post - p has been added to the input queue // p has been added to the service level queue if appropriate public void addPacket (Packet p) { lastID++; p.setPkPacketID(lastID); SLN.addNode(p); System.out.println ("Packet " + p.getPkPacketID() + " was added to the input queue"); if (p.getPkServiceLevel() == Packet.ServiceLevel.HIGH) { SLH.addNode(p); System.out.println ("Packet " + p.getPkPacketID() + " was added to the SLH queue"); } } //pre - packetID may or may not be a valid packetID //post - if packetID was the ID of a packet on the input queue // that packet has been removed from the input queue, and // from any service queues it belonged to public Packet removePacket (int packetID) { Packet p = SLN.removeNode(packetID); System.out.println ("Packet " + packetID + " was removed from the input queue"); if (p == null) return null; if (p.getPkServiceLevel() == Packet.ServiceLevel.HIGH) { SLH.removeNode(packetID); System.out.println ("Packet " + packetID + " was removed from the SLH queue"); } return p; } //pre - none //post - if the input queue is empty, do nothing // if the input queue is not empty, process a packet // from the input queue. The selection of the packet // to process should be done according to the writeup. public void processPacket() { Packet p; if (lastID == 0 || SLN.isEmpty()) // No packets received yet return; if (numTotal > 0 && (((double) numSLH / (double)numTotal) < (double) SLHpct/100.) && !SLH.isEmpty()) { numSLH++; numTotal++; p = SLH.removeNode(); SLN.removeNode(p.getPkPacketID()); } else { numTotal++; p = SLN.removeNode(); if (p.getPkServiceLevel() == Packet.ServiceLevel.HIGH) { SLH.removeNode(p.getPkPacketID()); numSLH++; } } if (p.getPkDestPort() == 0) Port0.addNode(p); else Port1.addNode(p); System.out.println ("Processing packet " + p.getPkPacketID() + ", adding to port " + p.getPkDestPort() + ", with a service priority of " + p.getPkServiceLevel()); } //pre - option is a number between 1 and 4 //post - print the contents of the specified queue // 1 - input queue // 2 - service level high queue // 3 - output queue for port 0 // 4 - output queue for port 1 public boolean print (int option) { if (option < 1 || option > 4) return false; switch (option) { case 1: System.out.println ("Input queue\n" +SLN); break; case 2: System.out.println ("Service Level High Queue\n" +SLH); break; case 3: System.out.println ("Port 0 Queue\n" +Port0); break; case 4: System.out.println ("Port 1 Queue\n" +Port1); break; } return true; } //test program for the router public static void main(String[] args) { String[] name = {"SLN","SLH","Port0","Port1"}; Router r = new Router(10); Packet p6 = new Packet(); p6.setPkDestPort(1); p6.setPkServiceLevel(Packet.ServiceLevel.NORMAL); p6.setPkPayload("asfasdf"); Packet p3 = new Packet(); p3.setPkDestPort(1); p3.setPkServiceLevel(Packet.ServiceLevel.NORMAL); p3.setPkPayload("asfasdf"); Packet p4 = new Packet(); p4.setPkDestPort(1); p4.setPkServiceLevel(Packet.ServiceLevel.NORMAL); p4.setPkPayload("asfasdf"); Packet p5 = new Packet(); p5.setPkDestPort(1); p5.setPkServiceLevel(Packet.ServiceLevel.NORMAL); p5.setPkPayload("asfasdf"); r.addPacket(p3); r.addPacket(p4); r.addPacket(p5); r.addPacket(p6); Packet p1 = new Packet(); p1.setPkDestPort(0); p1.setPkServiceLevel(Packet.ServiceLevel.HIGH); p1.setPkPayload("asfasdf"); r.addPacket(p1); Packet p2 = new Packet(); //p2.setPkPacketID(2); p2.setPkDestPort(1); p2.setPkServiceLevel(Packet.ServiceLevel.HIGH); p2.setPkPayload("asfasdf"); r.addPacket(p2); for (int i=0; i<4; i++){ System.out.println (name[i]); r.print(i+1); } r.processPacket(); for (int i=0; i<4; i++){ System.out.println (name[i]); r.print(i+1); } r.processPacket(); for (int i=0; i<4; i++){ System.out.println (name[i]); r.print(i+1); } r.processPacket(); for (int i=0; i<4; i++){ System.out.println (name[i]); r.print(i+1); } r.processPacket(); for (int i=0; i<4; i++){ System.out.println (name[i]); r.print(i+1); } r.processPacket(); for (int i=0; i<4; i++){ System.out.println (name[i]); r.print(i+1); } r.processPacket(); for (int i=0; i<4; i++){ System.out.println (name[i]); r.print(i+1); } } }