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