Search in sources :

Example 11 with RouterContext

use of net.i2p.router.RouterContext in project i2p.i2p by i2p.

the class RouterITBase method routerClassSetup.

@BeforeClass
public static void routerClassSetup() {
    // order of these matters
    Router r = new Router();
    _context = new RouterContext(r);
    _context.initAll();
    r.runRouter();
    RouterIdentity rIdentity = new TestRouterIdentity();
    RouterInfo rInfo = new RouterInfo();
    rInfo.setIdentity(rIdentity);
    r.setRouterInfo(rInfo);
    _config = prepareConfig(8);
}
Also used : RouterIdentity(net.i2p.data.router.RouterIdentity) RouterInfo(net.i2p.data.router.RouterInfo) RouterContext(net.i2p.router.RouterContext) Router(net.i2p.router.Router) BeforeClass(org.junit.BeforeClass)

Example 12 with RouterContext

use of net.i2p.router.RouterContext in project i2p.i2p by i2p.

the class FloodfillMonitorJob method shouldBeFloodfill.

private boolean shouldBeFloodfill() {
    if (!SigType.ECDSA_SHA256_P256.isAvailable())
        return false;
    // Hidden trumps netDb.floodfillParticipant=true
    if (getContext().router().isHidden())
        return false;
    String enabled = getContext().getProperty(PROP_FLOODFILL_PARTICIPANT, "auto");
    if ("true".equals(enabled))
        return true;
    if ("false".equals(enabled))
        return false;
    // Only if not shutting down...
    if (getContext().router().gracefulShutdownInProgress())
        return false;
    // ARM ElG decrypt is too slow
    if (SystemVersion.isARM() || SystemVersion.isAndroid())
        return false;
    if (getContext().getBooleanProperty(UDPTransport.PROP_LAPTOP_MODE))
        return false;
    // need IPv4 - The setting is the same for both SSU and NTCP, so just take the SSU one
    if (TransportUtil.getIPv6Config(getContext(), "SSU") == TransportUtil.IPv6Config.IPV6_ONLY)
        return false;
    // need both transports
    if (!TransportManager.isNTCPEnabled(getContext()))
        return false;
    if (!getContext().getBooleanPropertyDefaultTrue(TransportManager.PROP_ENABLE_UDP))
        return false;
    if (getContext().commSystem().isInBadCountry())
        return false;
    String country = getContext().commSystem().getOurCountry();
    // anonymous proxy, satellite provider (not in bad country list)
    if ("a1".equals(country) || "a2".equals(country))
        return false;
    // Only if up a while...
    if (getContext().router().getUptime() < MIN_UPTIME)
        return false;
    RouterInfo ri = getContext().router().getRouterInfo();
    if (ri == null)
        return false;
    char bw = ri.getBandwidthTier().charAt(0);
    // Only if class M, N, O, P, X
    if (bw != Router.CAPABILITY_BW64 && bw != Router.CAPABILITY_BW128 && bw != Router.CAPABILITY_BW256 && bw != Router.CAPABILITY_BW512 && bw != Router.CAPABILITY_BW_UNLIMITED)
        return false;
    // This list will not include ourselves...
    List<Hash> floodfillPeers = _facade.getFloodfillPeers();
    long now = getContext().clock().now();
    // We know none at all! Must be our turn...
    if (floodfillPeers == null || floodfillPeers.isEmpty()) {
        _lastChanged = now;
        return true;
    }
    // Only change status every so often
    boolean wasFF = _facade.floodfillEnabled();
    if (_lastChanged + MIN_CHANGE_DELAY > now)
        return wasFF;
    // This is similar to the qualification we do in FloodOnlySearchJob.runJob().
    // Count the "good" ff peers.
    // 
    // Who's not good?
    // the unheard-from, unprofiled, failing, unreachable and banlisted ones.
    // We should hear from floodfills pretty frequently so set a 60m time limit.
    // If unprofiled we haven't talked to them in a long time.
    // We aren't contacting the peer directly, so banlist doesn't strictly matter,
    // but it's a bad sign, and we often banlist a peer before we fail it...
    // 
    // Future: use Integration calculation
    // 
    int ffcount = floodfillPeers.size();
    int failcount = 0;
    long before = now - 60 * 60 * 1000;
    for (Hash peer : floodfillPeers) {
        PeerProfile profile = getContext().profileOrganizer().getProfile(peer);
        if (profile == null || profile.getLastHeardFrom() < before || profile.getIsFailing() || getContext().banlist().isBanlisted(peer) || getContext().commSystem().wasUnreachable(peer))
            failcount++;
    }
    if (wasFF)
        ffcount++;
    int good = ffcount - failcount;
    boolean happy = getContext().router().getRouterInfo().getCapabilities().indexOf('R') >= 0;
    // TODO - limit may still be too high
    // For reference, the avg lifetime job lag on my Pi is 6.
    // Should we consider avg. dropped ff jobs?
    RateStat lagStat = getContext().statManager().getRate("jobQueue.jobLag");
    RateStat queueStat = getContext().statManager().getRate("router.tunnelBacklog");
    happy = happy && lagStat.getRate(60 * 60 * 1000L).getAvgOrLifetimeAvg() < 25;
    happy = happy && queueStat.getRate(60 * 60 * 1000L).getAvgOrLifetimeAvg() < 5;
    // Only if we're pretty well integrated...
    happy = happy && _facade.getKnownRouters() >= 400;
    happy = happy && getContext().commSystem().countActivePeers() >= 50;
    happy = happy && getContext().tunnelManager().getParticipatingCount() >= 25;
    happy = happy && Math.abs(getContext().clock().getOffset()) < 10 * 1000;
    // We need an address and no introducers
    if (happy) {
        RouterAddress ra = getContext().router().getRouterInfo().getTargetAddress("SSU");
        if (ra == null)
            happy = false;
        else {
            if (ra.getOption("ihost0") != null)
                happy = false;
        }
    }
    double elG = 0;
    RateStat stat = getContext().statManager().getRate("crypto.elGamal.decrypt");
    if (stat != null) {
        Rate rate = stat.getRate(60 * 60 * 1000L);
        if (rate != null) {
            elG = rate.getAvgOrLifetimeAvg();
            happy = happy && elG <= 40.0d;
        }
    }
    if (_log.shouldLog(Log.DEBUG)) {
        final RouterContext rc = getContext();
        final String log = String.format("FF criteria breakdown: happy=%b, capabilities=%s, maxLag=%d, known=%d, " + "active=%d, participating=%d, offset=%d, ssuAddr=%s ElG=%f", happy, rc.router().getRouterInfo().getCapabilities(), rc.jobQueue().getMaxLag(), _facade.getKnownRouters(), rc.commSystem().countActivePeers(), rc.tunnelManager().getParticipatingCount(), Math.abs(rc.clock().getOffset()), rc.router().getRouterInfo().getTargetAddress("SSU").toString(), elG);
        _log.debug(log);
    }
    // Too few, and we're reachable, let's volunteer
    if (good < MIN_FF && happy) {
        if (!wasFF) {
            _lastChanged = now;
            _log.logAlways(Log.INFO, "Only " + good + " ff peers and we want " + MIN_FF + " so we are becoming floodfill");
        }
        return true;
    }
    // Too many, or we aren't reachable, let's stop
    if (good > MAX_FF || (good > MIN_FF && !happy)) {
        if (wasFF) {
            _lastChanged = now;
            _log.logAlways(Log.INFO, "Have " + good + " ff peers and we need only " + MIN_FF + " to " + MAX_FF + " so we are disabling floodfill; reachable? " + happy);
        }
        return false;
    }
    if (_log.shouldLog(Log.INFO))
        _log.info("Have " + good + " ff peers, not changing, enabled? " + wasFF + "; reachable? " + happy);
    return wasFF;
}
Also used : RouterInfo(net.i2p.data.router.RouterInfo) Rate(net.i2p.stat.Rate) RouterContext(net.i2p.router.RouterContext) RouterAddress(net.i2p.data.router.RouterAddress) Hash(net.i2p.data.Hash) RateStat(net.i2p.stat.RateStat) PeerProfile(net.i2p.router.peermanager.PeerProfile)

Aggregations

RouterContext (net.i2p.router.RouterContext)12 Hash (net.i2p.data.Hash)4 RouterInfo (net.i2p.data.router.RouterInfo)3 Router (net.i2p.router.Router)2 RateStat (net.i2p.stat.RateStat)2 BeforeClass (org.junit.BeforeClass)2 Getopt (gnu.getopt.Getopt)1 Font (java.awt.Font)1 Graphics (java.awt.Graphics)1 BufferedImage (java.awt.image.BufferedImage)1 File (java.io.File)1 IOException (java.io.IOException)1 SocketException (java.net.SocketException)1 UnknownHostException (java.net.UnknownHostException)1 DecimalFormat (java.text.DecimalFormat)1 SimpleDateFormat (java.text.SimpleDateFormat)1 Date (java.util.Date)1 HashMap (java.util.HashMap)1 Map (java.util.Map)1 Properties (java.util.Properties)1