public String getDefaultInterface(IPAddress destination) { ArrayList<RouteConfig> matches = new ArrayList<RouteConfig>(); RouteConfig[] routes = getRoutes(); for (int i = 0; i < routes.length; i++) { if (matchesRoute(destination, routes[i])) { matches.add(routes[i]); } } if (matches.size() > 0) { RouteConfig dRoute = (RouteConfig) matches.get(0); for (int i = 0; i < routes.length; i++) { if (dRoute.getMetric() > routes[i].getMetric()) { dRoute = routes[i]; } } s_logger.debug( "Found defualt interface " + dRoute.getInterfaceName() + " for destination " + destination.getHostAddress()); return dRoute.getInterfaceName(); } s_logger.debug("No default interface exists for destination " + destination.getHostAddress()); return null; }
public RouteConfig getDefaultRoute(String iface) { RouteConfig[] routes = getRoutes(); RouteConfig defaultRoute; ArrayList<RouteConfig> defaultRoutes = new ArrayList<RouteConfig>(); // Search through routes and construct a list of all default routes for the specified interface for (int i = 0; i < routes.length; i++) { if (routes[i].getInterfaceName().compareTo(iface) == 0 && routes[i].getDestination().getHostAddress().compareTo("0.0.0.0") == 0) { defaultRoutes.add(routes[i]); } } // If no default routes exist, return null if (defaultRoutes.size() == 0) { s_logger.debug("No default routes exist for inteface: " + iface); return null; } // Set the default route to the first one in the list defaultRoute = (RouteConfig) defaultRoutes.get(0); // Search for the default route with the lowest metric value for (int i = 1; i < defaultRoutes.size(); i++) { if (defaultRoute.getMetric() > ((RouteConfig) defaultRoutes.get(i)).getMetric()) { defaultRoute = (RouteConfig) defaultRoutes.get(i); } } s_logger.info("Default route found for interface: " + iface); s_logger.debug("Default route:\n" + defaultRoute.getDescription()); return defaultRoute; }
public void addStaticRoute( IPAddress destination, IPAddress gateway, IPAddress netmask, String iface, int metric) throws Exception { RouteConfig tmpRoute = null; StringBuffer command = new StringBuffer(); command.append("route add -net " + destination.getHostAddress() + " "); if (netmask != null) { command.append("netmask " + netmask.getHostAddress() + " "); } if (gateway != null) { if ((gateway.getHostAddress().compareTo("0.0.0.0") != 0) && (gateway.getHostAddress().compareTo("127.0.0.1") != 0)) { command.append("gw " + gateway.getHostAddress() + " "); } } if (iface != null) { command.append("dev " + iface + " "); } if (metric != 0 && metric != -1) { command.append("metric " + metric); } SafeProcess proc = null; try { s_logger.debug("Executing command: " + command.toString()); proc = ProcessUtil.exec(command.toString()); proc.waitFor(); if (proc.exitValue() != 0) { s_logger.error("Error adding static Route: " + command.toString()); throw new Exception("Error adding Static Route"); } } catch (IOException e) { s_logger.error("Error executing command: route -n"); throw e; } finally { if (proc != null) ProcessUtil.destroy(proc); } if (destination instanceof IP4Address) { tmpRoute = new RouteConfigIP4( (IP4Address) destination, (IP4Address) gateway, (IP4Address) netmask, iface, -1); } else if (destination instanceof IP6Address) { tmpRoute = new RouteConfigIP6( (IP6Address) destination, (IP6Address) gateway, (IP6Address) netmask, iface, -1); } s_logger.info("Static route added successfully"); s_logger.debug(tmpRoute.getDescription()); }
private boolean matchesRoute(IPAddress destination, RouteConfig route) { byte mask = (byte) 0xFF; byte[] dest = destination.getAddress(); byte[] routeMask = route.getNetmask().getAddress(); byte[] routeDest = route.getDestination().getAddress(); byte[] dest_masked = new byte[4]; for (int i = 0; i < 4; i++) { if (routeMask[i] == mask) { dest_masked[i] = dest[i]; } else { dest_masked[i] = 0; } } for (int i = 0; i < 4; i++) { if (dest_masked[i] != routeDest[i]) { return false; } } return true; }