Changeset 86a35f1


Ignore:
Timestamp:
May 12, 2016 9:37:07 PM (4 years ago)
Author:
zzz <zzz@…>
Branches:
master
Children:
18b61e7
Parents:
d6638f3
Message:

SSU: If configured with a hostname, bind to all v4/v6
addresses found for that hostname.
Fix binding if more than one IP or host was configured.
Log tweaks

File:
1 edited

Legend:

Unmodified
Added
Removed
  • router/java/src/net/i2p/router/transport/udp/UDPTransport.java

    rd6638f3 r86a35f1  
    44import java.io.Writer;
    55import java.net.InetAddress;
     6import java.net.Inet4Address;
    67import java.net.SocketException;
    78import java.net.UnknownHostException;
     
    1011import java.util.Arrays;
    1112import java.util.HashMap;
     13import java.util.HashSet;
    1214import java.util.Iterator;
    1315import java.util.List;
     
    326328       
    327329        // bind host
     330        // This is not exposed in the UI and in practice is always null.
     331        // We use PROP_EXTERNAL_HOST instead. See below.
    328332        String bindTo = _context.getProperty(PROP_BIND_INTERFACE);
    329333
     
    334338            String fixedHost = _context.getProperty(PROP_EXTERNAL_HOST);
    335339            if (fixedHost != null && fixedHost.length() > 0) {
    336                 try {
    337                     // TODO getAllByName(), bind to each
    338                     String testAddr = InetAddress.getByName(fixedHost).getHostAddress();
    339                     if (Addresses.getAddresses().contains(testAddr))
    340                         bindTo = testAddr;
    341                 } catch (UnknownHostException uhe) {}
    342             }
    343         }
    344 
    345         List<InetAddress> bindToAddrs = new ArrayList<InetAddress>(4);
     340                // Generate a comma-separated list of valid IP addresses
     341                // that we can bind to,
     342                // from the comma-separated PROP_EXTERNAL_HOST config.
     343                // The config may contain IPs or hostnames; expand each
     344                // hostname to one or more (v4 or v6) IPs.
     345                TransportUtil.IPv6Config cfg = getIPv6Config();
     346                Set<String> myAddrs;
     347                if (cfg == IPV6_DISABLED)
     348                    myAddrs = Addresses.getAddresses(false, false);
     349                else
     350                    myAddrs = Addresses.getAddresses(false, true);
     351                StringBuilder buf = new StringBuilder();
     352                String[] bta = DataHelper.split(fixedHost, "[,; \r\n\t]");
     353                for (int i = 0; i < bta.length; i++) {
     354                    String bt = bta[i];
     355                    if (bt.length() <= 0)
     356                        continue;
     357                    try {
     358                        InetAddress[] all = InetAddress.getAllByName(bt);
     359                        for (int j = 0; j < all.length; j++) {
     360                            InetAddress ia = all[j];
     361                            if (cfg == IPV6_ONLY && (ia instanceof Inet4Address)) {
     362                                if (_log.shouldWarn())
     363                                    _log.warn("Configured for IPv6 only, not binding to configured IPv4 host " + bt);
     364                                continue;
     365                            }
     366                            String testAddr = ia.getHostAddress();
     367                            if (myAddrs.contains(testAddr)) {
     368                                if (buf.length() > 0)
     369                                    buf.append(',');
     370                                buf.append(testAddr);
     371                            } else {
     372                                if (_log.shouldWarn())
     373                                    _log.warn("Not a local address, not binding to configured IP " + testAddr);
     374                            }
     375                        }
     376                    } catch (UnknownHostException uhe) {
     377                        if (_log.shouldWarn())
     378                            _log.warn("Not binding to configured host " + bt + " - " + uhe);
     379                    }
     380                }
     381                if (buf.length() > 0) {
     382                    bindTo = buf.toString();
     383                    if (_log.shouldWarn() && !fixedHost.equals(bindTo))
     384                        _log.warn("Expanded external host config \"" + fixedHost + "\" to \"" + bindTo + '"');
     385                }
     386            }
     387        }
     388
     389        // construct a set of addresses
     390        Set<InetAddress> bindToAddrs = new HashSet<InetAddress>(4);
    346391        if (bindTo != null) {
     392            // Generate a set IP addresses
     393            // that we can bind to,
     394            // from the comma-separated PROP_BIND_INTERFACE config,
     395            // or as generated from the PROP_EXTERNAL_HOST config.
     396            // In theory, the config may contain IPs and/or hostnames.
     397            // However, in practice, it's only IPs, because any hostnames
     398            // in PROP_EXTERNAL_HOST were expanded above to one or more (v4 or v6) IPs.
     399            // PROP_BIND_INTERFACE is not exposed in the UI and is never set.
    347400            String[] bta = DataHelper.split(bindTo, "[,; \r\n\t]");
    348401            for (int i = 0; i < bta.length; i++) {
     
    501554                rebuildExternalAddress(ia.getHostAddress(), newPort, false);
    502555            }
     556            // TODO
     557            // If we are bound only to v4 addresses,
     558            // force _haveIPv6Address to false, or else we get 'no endpoint' errors
     559            // If we are bound only to v6 addresses,
     560            // override getIPv6Config() ?
    503561        }
    504562        if (isIPv4Firewalled()) {
Note: See TracChangeset for help on using the changeset viewer.