package ejip123; import ejip123.util.Dbg; /** Implementation of a routing table. Stores net-interface-pairs to provide routing information for IP. */ public class Router{ private static int CNT; private static final Object mutex = new Object(); private static Route[] routes; private static LinkLayer defaultInterface = null; //private static int minMTU = Integer.MAX_VALUE; private Router(){ } /** initializes the routing table. @param routeCnt Number of possible entries in the routing table. Defaults to 0, if < 0. */ public static void init(int routeCnt){ CNT = routeCnt < 0 ? 0 : routeCnt; routes = new Route[CNT]; } /** Returns the interface to be used to send an IP packet. @param dstIp Destination IP address. @return The interface to be used or null if there is no corresponding route and no default interface is set. */ public static LinkLayer getIf(int dstIp){ synchronized(mutex){ for(int i = 0; i < CNT; i++){ Route cur; if((cur = routes[i]) != null && (dstIp&cur.getMask()) == cur.getNet()){ /* Dbg.wr("found a route to "); Dbg.ip(dstIp); Dbg.wr("through "); Dbg.ip(cur.getNet()); Dbg.lf(); */ return cur.getLinkLayer(); } } } if(defaultInterface == null) Dbg.wr("no route!\n"); return defaultInterface; } public static boolean addRoute(Route r){ // int mtu = r.getLinkLayer().getMtu(); synchronized(mutex){ // if(mtu < minMTU) // minMTU = mtu; for(int i = 0; i < routes.length; i++){ if(routes[i] == null){ routes[i] = r; return true; } } } return false; } public static LinkLayer getDefaultInterface(){ return defaultInterface; } public static void setDefaultInterface(LinkLayer newInterface){ synchronized(mutex){ if(defaultInterface == null){ // int mtu = newInterface.getMtu(); // if(mtu < minMTU) // minMTU = mtu; defaultInterface = newInterface; } } } public static void print(){ Dbg.wr("destination network mask interface mtu\r\n"); for(int i = 0; i < CNT; i++){ Route r = routes[i]; if(r != null){ for(int j = Util.wrIp(r.getNet()); j <= 15; j++) Dbg.wr(' '); for(int j = Util.wrIp(r.getMask()); j <= 15; j++) Dbg.wr(' '); for(int j = Util.wrIp(r.getLinkLayer().getIp()); j <= 15; j++) Dbg.wr(' '); Dbg.intVal(r.getLinkLayer().getMtu()); Dbg.lf(); } } if(defaultInterface != null){ Dbg.wr("Default interface: "); Util.wrIp(defaultInterface.getIp()); Dbg.lf(); } Dbg.lf(); } }