Handle all net statuses, extract console strings
This commit is contained in:
@ -37,7 +37,6 @@ import net.i2p.data.DataHelper;
|
||||
import net.i2p.data.Destination;
|
||||
import net.i2p.data.Hash;
|
||||
import net.i2p.data.LeaseSet;
|
||||
import net.i2p.router.CommSystemFacade;
|
||||
import net.i2p.router.RouterContext;
|
||||
import net.i2p.router.TunnelPoolSettings;
|
||||
|
||||
@ -376,33 +375,15 @@ public class MainFragment extends I2PFragmentBase {
|
||||
if (!Connectivity.isConnected(getActivity())) {
|
||||
// Manually set state, RouterService won't be running
|
||||
updateState(State.WAITING);
|
||||
vStatusText.setText("No Internet connection is available");
|
||||
vStatus.setVisibility(View.VISIBLE);
|
||||
vNetworkStatus.setText(R.string.no_internet);
|
||||
statusView.setVisibility(View.VISIBLE);
|
||||
} else if (ctx != null) {
|
||||
if (_startPressed) {
|
||||
_startPressed = false;
|
||||
}
|
||||
|
||||
String netstatus;
|
||||
CommSystemFacade.Status reach = ctx.commSystem().getStatus();
|
||||
switch (reach) {
|
||||
case DIFFERENT:
|
||||
netstatus = "Symmetric NAT";
|
||||
break;
|
||||
case HOSED:
|
||||
netstatus = "Port Failure";
|
||||
break;
|
||||
case OK:
|
||||
netstatus = "OK";
|
||||
break;
|
||||
case REJECT_UNSOLICITED:
|
||||
netstatus = "Firewalled";
|
||||
break;
|
||||
default:
|
||||
netstatus = "Unknown";
|
||||
}
|
||||
vNetworkStatus.setText("Network: " + netstatus);
|
||||
Util.NetStatus netStatus = Util.getNetStatus(getActivity(), ctx);
|
||||
vNetworkStatus.setText(getString(R.string.settings_label_network) + ": " + netStatus.status);
|
||||
|
||||
String uptime = DataHelper.formatDuration(ctx.router().getUptime());
|
||||
int active = ctx.commSystem().countActivePeers();
|
||||
@ -487,7 +468,6 @@ public class MainFragment extends I2PFragmentBase {
|
||||
getActivity().findViewById(R.id.console_usage_stats).setVisibility(View.VISIBLE);
|
||||
} else {
|
||||
// network but no router context
|
||||
vStatusText.setText("Not running");
|
||||
statusView.setVisibility(View.GONE);
|
||||
getActivity().findViewById(R.id.console_usage_stats).setVisibility(View.INVISIBLE);
|
||||
/**
|
||||
@ -574,6 +554,7 @@ public class MainFragment extends I2PFragmentBase {
|
||||
}
|
||||
}
|
||||
|
||||
private static final String SHARED_CLIENTS = "shared clients";
|
||||
/**
|
||||
* compare translated nicknames - put "shared clients" first in the sort
|
||||
*/
|
||||
@ -583,7 +564,7 @@ public class MainFragment extends I2PFragmentBase {
|
||||
|
||||
public AlphaComparator(RouterContext ctx) {
|
||||
_ctx = ctx;
|
||||
xsc = _(ctx, "shared clients");
|
||||
xsc = _(ctx, SHARED_CLIENTS);
|
||||
}
|
||||
|
||||
public int compare(Destination lhs, Destination rhs) {
|
||||
@ -617,7 +598,7 @@ public class MainFragment extends I2PFragmentBase {
|
||||
}
|
||||
|
||||
private String _(RouterContext ctx, String s) {
|
||||
if ("shared clients".equals(s))
|
||||
if (SHARED_CLIENTS.equals(s))
|
||||
return getString(R.string.shared_clients);
|
||||
else
|
||||
return s;
|
||||
|
@ -14,9 +14,13 @@ import net.i2p.android.router.I2PConstants;
|
||||
import net.i2p.android.router.R;
|
||||
import net.i2p.android.router.service.State;
|
||||
import net.i2p.data.DataHelper;
|
||||
import net.i2p.data.router.RouterAddress;
|
||||
import net.i2p.data.router.RouterInfo;
|
||||
import net.i2p.router.CommSystemFacade;
|
||||
import net.i2p.router.Router;
|
||||
import net.i2p.router.RouterContext;
|
||||
import net.i2p.router.transport.TransportManager;
|
||||
import net.i2p.router.transport.TransportUtil;
|
||||
import net.i2p.router.transport.udp.UDPTransport;
|
||||
import net.i2p.util.OrderedProperties;
|
||||
|
||||
@ -372,4 +376,162 @@ public abstract class Util implements I2PConstants {
|
||||
state == State.MANUAL_QUITTED ||
|
||||
state == State.WAITING;
|
||||
}
|
||||
|
||||
public static class NetStatus {
|
||||
public enum Level {
|
||||
ERROR,
|
||||
WARN,
|
||||
INFO,
|
||||
}
|
||||
|
||||
public final Level level;
|
||||
public final String status;
|
||||
|
||||
public NetStatus(Level level, String status) {
|
||||
this.level = level;
|
||||
this.status = status;
|
||||
}
|
||||
}
|
||||
public static NetStatus getNetStatus(Context ctx, RouterContext rCtx) {
|
||||
if (rCtx.commSystem().isDummy())
|
||||
return new NetStatus(NetStatus.Level.INFO, ctx.getString(R.string.vm_comm_system));
|
||||
if (rCtx.router().getUptime() > 60*1000 && (!rCtx.router().gracefulShutdownInProgress()) &&
|
||||
!rCtx.clientManager().isAlive()) // not a router problem but the user should know
|
||||
return new NetStatus(NetStatus.Level.ERROR, ctx.getString(R.string.net_status_error_i2cp));
|
||||
// Warn based on actual skew from peers, not update status, so if we successfully offset
|
||||
// the clock, we don't complain.
|
||||
//if (!rCtx.clock().getUpdatedSuccessfully())
|
||||
long skew = rCtx.commSystem().getFramedAveragePeerClockSkew(33);
|
||||
// Display the actual skew, not the offset
|
||||
if (Math.abs(skew) > 30*1000)
|
||||
return new NetStatus(NetStatus.Level.ERROR,
|
||||
ctx.getString(R.string.net_status_error_skew, DataHelper.formatDuration2(Math.abs(skew))));
|
||||
if (rCtx.router().isHidden())
|
||||
return new NetStatus(NetStatus.Level.INFO, ctx.getString(R.string.hidden));
|
||||
RouterInfo routerInfo = rCtx.router().getRouterInfo();
|
||||
if (routerInfo == null)
|
||||
return new NetStatus(NetStatus.Level.INFO, ctx.getString(R.string.testing));
|
||||
|
||||
CommSystemFacade.Status status = rCtx.commSystem().getStatus();
|
||||
switch (status) {
|
||||
case OK:
|
||||
case IPV4_OK_IPV6_UNKNOWN:
|
||||
case IPV4_OK_IPV6_FIREWALLED:
|
||||
case IPV4_UNKNOWN_IPV6_OK:
|
||||
case IPV4_DISABLED_IPV6_OK:
|
||||
case IPV4_SNAT_IPV6_OK:
|
||||
RouterAddress ra = routerInfo.getTargetAddress("NTCP");
|
||||
if (ra == null)
|
||||
return new NetStatus(NetStatus.Level.INFO, toStatusString(ctx, status));
|
||||
byte[] ip = ra.getIP();
|
||||
if (ip == null)
|
||||
return new NetStatus(NetStatus.Level.ERROR, ctx.getString(R.string.net_status_error_unresolved_tcp));
|
||||
// TODO set IPv6 arg based on configuration?
|
||||
if (TransportUtil.isPubliclyRoutable(ip, true))
|
||||
return new NetStatus(NetStatus.Level.INFO, toStatusString(ctx, status));
|
||||
return new NetStatus(NetStatus.Level.ERROR, ctx.getString(R.string.net_status_error_private_tcp));
|
||||
|
||||
case IPV4_SNAT_IPV6_UNKNOWN:
|
||||
case DIFFERENT:
|
||||
return new NetStatus(NetStatus.Level.ERROR, ctx.getString(R.string.symmetric_nat));
|
||||
|
||||
case REJECT_UNSOLICITED:
|
||||
case IPV4_DISABLED_IPV6_FIREWALLED:
|
||||
if (routerInfo.getTargetAddress("NTCP") != null)
|
||||
return new NetStatus(NetStatus.Level.WARN, ctx.getString(R.string.net_status_warn_firewalled_inbound_tcp));
|
||||
// fall through...
|
||||
case IPV4_FIREWALLED_IPV6_OK:
|
||||
case IPV4_FIREWALLED_IPV6_UNKNOWN:
|
||||
if (rCtx.netDb().floodfillEnabled())
|
||||
return new NetStatus(NetStatus.Level.WARN, ctx.getString(R.string.net_status_warn_firewalled_floodfill));
|
||||
//if (rCtx.router().getRouterInfo().getCapabilities().indexOf('O') >= 0)
|
||||
// return _("WARN-Firewalled and Fast");
|
||||
return new NetStatus(NetStatus.Level.INFO, toStatusString(ctx, status));
|
||||
|
||||
case DISCONNECTED:
|
||||
return new NetStatus(NetStatus.Level.INFO, ctx.getString(R.string.net_status_info_disconnected));
|
||||
|
||||
case HOSED:
|
||||
return new NetStatus(NetStatus.Level.ERROR, ctx.getString(R.string.net_status_error_udp_port));
|
||||
|
||||
case UNKNOWN:
|
||||
case IPV4_UNKNOWN_IPV6_FIREWALLED:
|
||||
case IPV4_DISABLED_IPV6_UNKNOWN:
|
||||
default:
|
||||
ra = routerInfo.getTargetAddress("SSU");
|
||||
if (ra == null && rCtx.router().getUptime() > 5*60*1000) {
|
||||
if (rCtx.commSystem().countActivePeers() <= 0)
|
||||
return new NetStatus(NetStatus.Level.ERROR, ctx.getString(R.string.net_status_error_no_active_peers));
|
||||
else if (rCtx.getProperty(ctx.getString(R.string.PROP_I2NP_NTCP_HOSTNAME)) == null ||
|
||||
rCtx.getProperty(ctx.getString(R.string.PROP_I2NP_NTCP_PORT)) == null)
|
||||
return new NetStatus(NetStatus.Level.ERROR, ctx.getString(R.string.net_status_error_udp_disabled_tcp_not_set));
|
||||
else
|
||||
return new NetStatus(NetStatus.Level.WARN, ctx.getString(R.string.net_status_warn_firewalled_udp_disabled));
|
||||
}
|
||||
return new NetStatus(NetStatus.Level.INFO, toStatusString(ctx, status));
|
||||
}
|
||||
}
|
||||
|
||||
private static String toStatusString(Context ctx, CommSystemFacade.Status status) {
|
||||
String ipv4Status = "";
|
||||
String ipv6Status = "";
|
||||
switch (status) {
|
||||
case OK:
|
||||
return ctx.getString(android.R.string.ok);
|
||||
case IPV4_OK_IPV6_UNKNOWN:
|
||||
ipv4Status = ctx.getString(android.R.string.ok);
|
||||
ipv6Status = ctx.getString(R.string.testing);
|
||||
break;
|
||||
case IPV4_OK_IPV6_FIREWALLED:
|
||||
ipv4Status = ctx.getString(android.R.string.ok);
|
||||
ipv6Status = ctx.getString(R.string.firewalled);
|
||||
break;
|
||||
case IPV4_UNKNOWN_IPV6_OK:
|
||||
ipv4Status = ctx.getString(R.string.testing);
|
||||
ipv6Status = ctx.getString(android.R.string.ok);
|
||||
break;
|
||||
case IPV4_FIREWALLED_IPV6_OK:
|
||||
ipv4Status = ctx.getString(R.string.firewalled);
|
||||
ipv6Status = ctx.getString(android.R.string.ok);
|
||||
break;
|
||||
case IPV4_DISABLED_IPV6_OK:
|
||||
ipv4Status = ctx.getString(R.string.disabled);
|
||||
ipv6Status = ctx.getString(android.R.string.ok);
|
||||
break;
|
||||
case IPV4_SNAT_IPV6_OK:
|
||||
ipv4Status = ctx.getString(R.string.symmetric_nat);
|
||||
ipv6Status = ctx.getString(android.R.string.ok);
|
||||
break;
|
||||
case DIFFERENT:
|
||||
return ctx.getString(R.string.symmetric_nat);
|
||||
case IPV4_SNAT_IPV6_UNKNOWN:
|
||||
ipv4Status = ctx.getString(R.string.symmetric_nat);
|
||||
ipv6Status = ctx.getString(R.string.testing);
|
||||
break;
|
||||
case IPV4_FIREWALLED_IPV6_UNKNOWN:
|
||||
ipv4Status = ctx.getString(R.string.firewalled);
|
||||
ipv6Status = ctx.getString(R.string.testing);
|
||||
break;
|
||||
case REJECT_UNSOLICITED:
|
||||
return ctx.getString(R.string.firewalled);
|
||||
case IPV4_UNKNOWN_IPV6_FIREWALLED:
|
||||
ipv4Status = ctx.getString(R.string.testing);
|
||||
ipv6Status = ctx.getString(R.string.firewalled);
|
||||
break;
|
||||
case IPV4_DISABLED_IPV6_UNKNOWN:
|
||||
ipv4Status = ctx.getString(R.string.disabled);
|
||||
ipv6Status = ctx.getString(R.string.testing);
|
||||
break;
|
||||
case IPV4_DISABLED_IPV6_FIREWALLED:
|
||||
ipv4Status = ctx.getString(R.string.disabled);
|
||||
ipv6Status = ctx.getString(R.string.firewalled);
|
||||
break;
|
||||
case UNKNOWN:
|
||||
return ctx.getString(R.string.testing);
|
||||
default:
|
||||
return status.toStatusString();
|
||||
}
|
||||
|
||||
return ctx.getString(R.string.net_status_ipv4_ipv6, ipv4Status, ipv6Status);
|
||||
}
|
||||
}
|
||||
|
@ -11,6 +11,7 @@
|
||||
<!-- net.i2p.router.transport.udp.UDPTransport -->
|
||||
<string name="PROP_UDP_INTERNAL_PORT" translatable="false">i2np.udp.internalPort</string>
|
||||
<!-- net.i2p.router.transport.ntcp.NTCPTransport -->
|
||||
<string name="PROP_I2NP_NTCP_HOSTNAME" translatable="false">i2np.ntcp.hostname</string>
|
||||
<string name="PROP_I2NP_NTCP_AUTO_PORT" translatable="false">i2np.ntcp.autoport</string>
|
||||
<string name="PROP_I2NP_NTCP_PORT" translatable="false">i2np.ntcp.port</string>
|
||||
<!-- net.i2p.router.transport.TransportImpl.getMaxConnections() -->
|
||||
|
@ -30,6 +30,27 @@
|
||||
<string name="button_shutdown_now">Long press to stop now</string>
|
||||
<string name="button_cancel_graceful">Long press to cancel shutdown</string>
|
||||
|
||||
<string name="no_internet">No Internet connection is available</string>
|
||||
|
||||
<string name="net_status_ipv4_ipv6" translatable="false">IPv4: %1$s; IPv6: %2$s</string>
|
||||
<string name="hidden">Hidden</string>
|
||||
<string name="testing">Testing</string>
|
||||
<string name="firewalled">Firewalled</string>
|
||||
<string name="symmetric_nat">Symmetric NAT</string>
|
||||
|
||||
<string name="vm_comm_system" translatable="false">VM Comm System</string>
|
||||
<string name="net_status_error_i2cp">Client manager I2CP error - check logs</string>
|
||||
<string name="net_status_error_skew">Clock skew of %s</string>
|
||||
<string name="net_status_error_unresolved_tcp">Unresolved TCP address</string>
|
||||
<string name="net_status_error_private_tcp">Private TCP address</string>
|
||||
<string name="net_status_warn_firewalled_inbound_tcp">Firewalled with inbound TCP enabled</string>
|
||||
<string name="net_status_warn_firewalled_floodfill">Firewalled and floodfill</string>
|
||||
<string name="net_status_info_disconnected">Disconnected - check network connection</string>
|
||||
<string name="net_status_error_udp_port">UDP port in use - change in settings and restart</string>
|
||||
<string name="net_status_error_no_active_peers">No active peers, check network connection and firewall</string>
|
||||
<string name="net_status_error_udp_disabled_tcp_not_set">UDP disabled and inbound TCP host/port not set</string>
|
||||
<string name="net_status_warn_firewalled_udp_disabled">Firewalled with UDP disabled</string>
|
||||
|
||||
<string name="shared_clients">Shared clients</string>
|
||||
|
||||
<string name="uptime">Uptime</string>
|
||||
|
Reference in New Issue
Block a user