/**
   * Tabelle zur Abfrage der Weiterleitungstabelle nach einem passenden Eintrag fuer eine
   * Ziel-IP-Adresse
   *
   * @param zielIP die Ziel-IP-Adresse
   * @return das Ergebnis als String-Array bestehend aus der IP-Adresse des naechsten Gateways und
   *     der fuer den Versand zu verwendenden Schnittstelle
   */
  public String[] holeWeiterleitungsZiele(String zielIP) {
    Main.debug.println(
        "INVOKED ("
            + this.hashCode()
            + ") "
            + getClass()
            + " (Weiterleitungstabelle), holeWeiterleitungsZiele("
            + zielIP
            + ")");
    String[] routeString = null;
    ListIterator it = holeTabelle().listIterator();

    while (it.hasNext() && routeString == null) {
      String[] tmpString = (String[]) it.next();
      if (!tmpString[1].equals("0.0.0.0")) {
        if (VermittlungsProtokoll.gleichesRechnernetz(zielIP, tmpString[0], tmpString[1])) {
          routeString = new String[] {tmpString[2], tmpString[3]};
        }
      } else {
        // no explicit match found --> standard gateway will be used
        String[] tempy = {tmpString[2], tmpString[3]};
        Main.debug.println(
            "DEBUG ("
                + this.hashCode()
                + ") "
                + getClass()
                + " (Weiterleitungstabelle), holeWeiterleitungsZiele:   using standard gateway: "
                + tempy);
        routeString = tempy;
      }
    }
    if (routeString == null) {
      Main.debug.println(
          "ERROR ("
              + this.hashCode()
              + "), holeWeiterleitungsZiele:  routeString is still 'null' at return point!   (is there a standard gateway for this device?)");
    }
    return routeString;
  }
  /**
   * Methode fuer den Zugriff auf die Weiterleitungstabelle bestehend aus automatisch erzeugten und
   * manuellen Eintraegen
   */
  public LinkedList<String[]> holeTabelle() {
    Main.debug.println(
        "INVOKED ("
            + this.hashCode()
            + ") "
            + getClass()
            + " (Weiterleitungstabelle), holeTabelle()");
    InternetKnoten knoten;
    NetzwerkInterface nic = null;
    String gateway;
    ListIterator it;
    LinkedList<String[]> tabelle;
    String[] tmp = new String[4];

    tabelle = new LinkedList<String[]>(manuelleTabelle);
    manuelleEintraege = new LinkedList<Boolean>();
    for (int i = 0; i < tabelle.size(); i++) manuelleEintraege.add(new Boolean(true));

    if (firmware != null) {
      // Eintrag fuer 'localhost'
      tmp = new String[4];
      tmp[0] = "127.0.0.0";
      tmp[1] = "255.0.0.0";
      tmp[2] = "127.0.0.1";
      tmp[3] = "127.0.0.1";
      tabelle.addFirst(tmp);
      manuelleEintraege.addFirst(new Boolean(false));

      knoten = (InternetKnoten) firmware.getKnoten();

      // Eintrag fuer eigenes Rechnernetz
      it = knoten.getNetzwerkInterfaces().listIterator();
      while (it.hasNext()) {
        nic = (NetzwerkInterface) it.next();

        tmp = new String[4];
        // tmp[0] = nic.getIp();
        tmp[0] = berechneNetzkennung(nic.getIp(), nic.getSubnetzMaske());
        tmp[1] = nic.getSubnetzMaske();
        tmp[2] = nic.getIp();
        tmp[3] = nic.getIp();
        tabelle.addFirst(tmp);
        manuelleEintraege.addFirst(new Boolean(false));
      }

      // Eintrag fuer eigene IP-Adresse
      it = knoten.getNetzwerkInterfaces().listIterator();
      while (it.hasNext()) {
        nic = (NetzwerkInterface) it.next();

        tmp = new String[4];
        tmp[0] = nic.getIp();
        tmp[1] = "255.255.255.255";
        tmp[2] = "127.0.0.1";
        tmp[3] = "127.0.0.1";
        tabelle.addFirst(tmp);
        manuelleEintraege.addFirst(new Boolean(false));
      }

      // Eintrag fuer Standardgateway, wenn es konfiguriert wurde
      gateway = firmware.getStandardGateway();
      if (gateway != null && !gateway.trim().equals("")) {
        gateway = gateway.trim();
        it = knoten.getNetzwerkInterfaces().listIterator();
        tmp = null;
        while (it.hasNext()) {
          nic = (NetzwerkInterface) it.next();

          if (nic != null
              && VermittlungsProtokoll.gleichesRechnernetz(
                  gateway, nic.getIp(), nic.getSubnetzMaske())) {
            tmp = new String[4];
            tmp[0] = "0.0.0.0";
            tmp[1] = "0.0.0.0";
            tmp[2] = gateway;
            tmp[3] = nic.getIp();
          }
        }
        if (tmp == null) {
          tmp = new String[4];
          tmp[0] = "0.0.0.0";
          tmp[1] = "0.0.0.0";
          tmp[2] = gateway;
          tmp[3] = firmware.holeIPAdresse();
        }
        tabelle.addLast(tmp);
        manuelleEintraege.addLast(new Boolean(false));
      }
    }

    return tabelle;
  }