Changeset de5f294


Ignore:
Timestamp:
Aug 30, 2013 10:27:22 AM (8 years ago)
Author:
zzz <zzz@…>
Branches:
master
Children:
8655988
Parents:
1933e62
Message:
  • SSU, confignet: Add support for specifiying multiple addresses
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • apps/routerconsole/java/src/net/i2p/router/web/ConfigNetHandler.java

    r1933e62 rde5f294  
    22
    33import java.util.ArrayList;
     4import java.util.Collections;
    45import java.util.HashMap;
    56import java.util.List;
    67import java.util.Map;
     8import java.util.Set;
     9import java.util.TreeSet;
    710
    811import net.i2p.router.Router;
     
    9598        _udpHost1 = (host != null ? host.trim() : null);
    9699    }
    97     public void setUdpHost2(String host) {
    98         _udpHost2 = (host != null ? host.trim() : null);
    99     }
    100100    public void setUdpPort(String port) {
    101101        _udpPort = (port != null ? port.trim() : null);
     
    161161                String uhost = "";
    162162                if (_udpAutoIP.equals("fixed")) {
    163                     if (_udpHost1 != null && _udpHost1.length() > 0)
    164                         uhost =  _udpHost1;
    165                     else if (_udpHost2 != null && _udpHost2.length() > 0)
    166                         uhost =  _udpHost2;
    167                     else
    168                         _udpAutoIP = UDPTransport.DEFAULT_SOURCES;
    169                 }
    170                 changes.put(UDPTransport.PROP_SOURCES, _udpAutoIP);
    171                 boolean valid = true;
    172                 if (uhost.length() > 0) {
    173                     valid = verifyAddress(uhost);
    174                     if (valid) {
     163                    if (_settings == null)
     164                        _settings = Collections.EMPTY_MAP;
     165                    Set<String> addrs = new TreeSet();
     166                    for (Object o : _settings.keySet()) {
     167                        String k = (String) o;
     168                        if (k.startsWith("addr_")) {
     169                            String v = k.substring(5);
     170                            if (v.length() > 0)
     171                                addrs.add(v);
     172                        }
     173                    }
     174                    if (getJettyString("addrnew") != null) {
     175                        if (_udpHost1 != null && _udpHost1.length() > 0) {
     176                            if (verifyAddress(_udpHost1)) {
     177                                addrs.add(_udpHost1);
     178                            } else {
     179                                error = true;
     180                            }
     181                        }
     182                    }
     183                    int tot = addrs.size();
     184                    int i = 0;
     185                    if (tot > 0) {
     186                        StringBuilder buf = new StringBuilder(128);
     187                        for (String addr : addrs) {
     188                            buf.append(addr);
     189                            if (++i < tot)
     190                                buf.append(',');
     191                        }
     192                        uhost = buf.toString();
    175193                        changes.put(UDPTransport.PROP_EXTERNAL_HOST, uhost);
    176194                    } else {
    177                         error = true;
     195                        _udpAutoIP = UDPTransport.DEFAULT_SOURCES;
     196                        removes.add(UDPTransport.PROP_EXTERNAL_HOST);
    178197                    }
    179198                } else {
    180                     removes.add(UDPTransport.PROP_EXTERNAL_HOST);
    181                 }
    182                 if (valid && ((!oldUdp.equals(_udpAutoIP)) || (!oldUHost.equals(uhost)))) {
     199                    // not fixed
     200                    if (oldUHost.length() > 0)
     201                        removes.add(UDPTransport.PROP_EXTERNAL_HOST);
     202                }
     203                changes.put(UDPTransport.PROP_SOURCES, _udpAutoIP);
     204                if ((!oldUdp.equals(_udpAutoIP)) || (!oldUHost.equals(uhost))) {
    183205                   addFormNotice(_("Updating IP address"));
    184206                   restartRequired = true;
  • apps/routerconsole/java/src/net/i2p/router/web/ConfigNetHelper.java

    r1933e62 rde5f294  
    22
    33import java.util.ArrayList;
     4import java.util.Collections;
     5import java.util.HashSet;
     6import java.util.Set;
    47
    58import net.i2p.data.DataHelper;
     
    1922   
    2023    /** copied from various private components */
    21     public final static String PROP_I2NP_NTCP_HOSTNAME = "i2np.ntcp.hostname";
    22     public final static String PROP_I2NP_NTCP_PORT = "i2np.ntcp.port";
    23     public final static String PROP_I2NP_NTCP_AUTO_PORT = "i2np.ntcp.autoport";
    24     public final static String PROP_I2NP_NTCP_AUTO_IP = "i2np.ntcp.autoip";
     24    final static String PROP_I2NP_NTCP_HOSTNAME = "i2np.ntcp.hostname";
     25    final static String PROP_I2NP_NTCP_PORT = "i2np.ntcp.port";
     26    final static String PROP_I2NP_NTCP_AUTO_PORT = "i2np.ntcp.autoport";
     27    final static String PROP_I2NP_NTCP_AUTO_IP = "i2np.ntcp.autoip";
    2528    private final static String CHECKED = " checked=\"checked\" ";
    2629
     
    176179    }
    177180   
    178     public String[] getAddresses() {
    179         ArrayList<String> al = new ArrayList(Addresses.getAddresses());
    180         return al.toArray(new String[al.size()]);
     181    public Set<String> getAddresses() {
     182        // exclude local, include IPv6
     183        return Addresses.getAddresses(false, true);
     184    }
     185
     186    /** @since IPv6 */
     187    public String getAddressSelector() {
     188        Set<String> addrs = getAddresses();
     189        Set<String> configs;
     190        String cs = getUdphostname();
     191        if (cs.length() <= 0) {
     192            configs = Collections.EMPTY_SET;
     193        } else {
     194            configs = new HashSet(4);
     195            String[] ca = cs.split("[,; \r\n\t]");
     196            for (int i = 0; i < ca.length; i++) {
     197                String c = ca[i];
     198                if (c.length() > 0) {
     199                    configs.add(c);
     200                    addrs.add(c);
     201                }
     202            }
     203        }
     204        StringBuilder buf = new StringBuilder(128);
     205        buf.append("<div class=\"indent\">");
     206        for (String addr : addrs) {
     207            buf.append("\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;" +
     208                       "<input type=\"checkbox\" class=\"optbox\" value=\"foo\" name=\"addr_");
     209            buf.append(addr);
     210            buf.append('"');
     211            if (addrs.size() == 1 || configs.contains(addr))
     212                buf.append(CHECKED);
     213            buf.append("> ");
     214            buf.append(addr);
     215            buf.append("<br>");
     216        }
     217        buf.append("\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;" +
     218                   "<input type=\"checkbox\" class=\"optbox\" name=\"addrnew\"");
     219        buf.append(CHECKED);
     220        buf.append("><input name =\"udpHost1\" type=\"text\" size=\"16\" />" +
     221                   "</div>");
     222        return buf.toString();
    181223    }
    182224
  • apps/routerconsole/jsp/confignet.jsp

    r1933e62 rde5f294  
    4141    <input type="radio" class="optbox" name="udpAutoIP" value="ssu" <%=nethelper.getUdpAutoIPChecked(0) %> >
    4242    <%=intl._("Use SSU IP address detection only")%><br>
    43     <input type="radio" class="optbox" name="udpAutoIP" value="fixed" <%=nethelper.getUdpAutoIPChecked(1) %> >
    44     <%=intl._("Specify hostname or IP")%>:
    45     <input name ="udpHost1" type="text" size="16" value="<jsp:getProperty name="nethelper" property="udphostname" />" >
    46     <% String[] ips = nethelper.getAddresses();
    47        if (ips.length > 0) {
    48            out.print(intl._("or") + " <select name=\"udpHost2\"><option value=\"\" selected=\"selected\">"+intl._("Select Interface")+"</option>\n");
    49            for (int i = 0; i < ips.length; i++) {
    50                out.print("<option value=\"");
    51                out.print(ips[i]);
    52                out.print("\">");
    53                out.print(ips[i]);
    54                out.print("</option>\n");
    55            }
    56            out.print("</select>\n");
    57        }
    58     %>
    59     <br>
    6043    <input type="radio" class="optbox" name="udpAutoIP" value="hidden" <%=nethelper.getUdpAutoIPChecked(2) %> >
    6144    <%=intl._("Hidden mode - do not publish IP")%> <i><%=intl._("(prevents participating traffic)")%></i><br>
     45    <input type="radio" class="optbox" name="udpAutoIP" value="fixed" <%=nethelper.getUdpAutoIPChecked(1) %> >
     46    <%=intl._("Specify hostname or IP")%>:<br>
     47    <%=nethelper.getAddressSelector() %>
    6248 </p><p>
    6349 <%=intl._("Action when IP changes")%>:<br>
  • history.txt

    r1933e62 rde5f294  
     12013-08-30 zzz
     2 * Addresses: Treat Teredo addresses 2001:0::/32 as local
     3 * SSU, confignet: Add support for specifiying multiple addresses
     4 * SusiDNS: Don't require last subscription to be terminated by newline (ticket #1000)
     5
    162013-08-11 zzz
    27 * Jetty 7.6.12.v20130726
  • router/java/src/net/i2p/router/RouterVersion.java

    r1933e62 rde5f294  
    1919    public final static String ID = "Monotone";
    2020    public final static String VERSION = CoreVersion.VERSION;
    21     public final static long BUILD = 20;
     21    public final static long BUILD = 21;
    2222
    2323    /** for example "-test" */
  • router/java/src/net/i2p/router/transport/udp/UDPTransport.java

    r1933e62 rde5f294  
    330330        }
    331331
    332         InetAddress bindToAddr = null;
     332        List<InetAddress> bindToAddrs = new ArrayList(4);
    333333        if (bindTo != null) {
    334             try {
    335                 bindToAddr = InetAddress.getByName(bindTo);
    336             } catch (UnknownHostException uhe) {
    337                 _log.error("Invalid SSU bind interface specified [" + bindTo + "]", uhe);
    338                 //setReachabilityStatus(CommSystemFacade.STATUS_HOSED);
    339                 //return;
    340                 // fall thru...
     334            String[] bta = bindTo.split("[,; \r\n\t]");
     335            for (int i = 0; i < bta.length; i++) {
     336                String bt = bta[i];
     337                if (bt.length() <= 0)
     338                    continue;
     339                try {
     340                    bindToAddrs.add(InetAddress.getByName(bt));
     341                } catch (UnknownHostException uhe) {
     342                    _log.error("Invalid SSU bind interface specified [" + bt + "]", uhe);
     343                    //setReachabilityStatus(CommSystemFacade.STATUS_HOSED);
     344                    //return;
     345                    // fall thru...
     346                }
    341347            }
    342348        }
     
    356362        else
    357363            port = oldEPort;
    358         if (bindToAddr != null && _log.shouldLog(Log.WARN))
    359             _log.warn("Binding only to " + bindToAddr);
     364        if (!bindToAddrs.isEmpty() && _log.shouldLog(Log.WARN))
     365            _log.warn("Binding only to " + bindToAddrs);
    360366        if (_log.shouldLog(Log.INFO))
    361367            _log.info("Binding to the port: " + port);
    362368        if (_endpoints.isEmpty()) {
    363369            // will always be empty since we are removing them above
    364             UDPEndpoint endpoint = new UDPEndpoint(_context, this, port, bindToAddr);
    365             _endpoints.add(endpoint);
    366             // TODO add additional endpoints for additional addresses/ports
     370            if (bindToAddrs.isEmpty()) {
     371                UDPEndpoint endpoint = new UDPEndpoint(_context, this, port, null);
     372                _endpoints.add(endpoint);
     373                setMTU(null);
     374            } else {
     375                for (InetAddress bindToAddr : bindToAddrs) {
     376                    UDPEndpoint endpoint = new UDPEndpoint(_context, this, port, bindToAddr);
     377                    _endpoints.add(endpoint);
     378                    setMTU(bindToAddr);
     379                }
     380            }
    367381        } else {
    368382            // unused for now
     
    376390            }
    377391        }
    378         setMTU(bindToAddr);
    379392
    380393        if (_establisher == null)
     
    441454        // REA param is false;
    442455        // TransportManager.startListening() calls router.rebuildRouterInfo()
    443         if (newPort > 0 && bindToAddr == null) {
     456        if (newPort > 0 && bindToAddrs.isEmpty()) {
    444457            for (InetAddress ia : getSavedLocalAddresses()) {
    445458                rebuildExternalAddress(ia.getHostAddress(), newPort, false);
     
    17261739        if (explicitAddressSpecified()) {
    17271740            host = _context.getProperty(PROP_EXTERNAL_HOST);
     1741            if (host != null) {
     1742                String[] hosts = host.split("[,; \r\n\t]");
     1743                RouterAddress rv = null;
     1744                for (int i = 0; i < hosts.length; i++) {
     1745                    String h = hosts[i];
     1746                    if (h.length() <= 0)
     1747                        continue;
     1748                    rv = rebuildExternalAddress(h, port, allowRebuildRouterInfo);
     1749                }
     1750                return rv;
     1751            }
    17281752        } else {
    17291753            RouterAddress cur = getCurrentAddress(false);
Note: See TracChangeset for help on using the changeset viewer.