From cd61f170d948d30eb6a2998226e83596a8dc4af9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tilmann=20Z=C3=A4schke?= Date: Fri, 12 Dec 2025 12:59:48 +0100 Subject: [PATCH 1/3] port output + config --- CHANGELOG.md | 4 +++- README.md | 2 +- src/main/java/org/scion/multiping/PingAll.java | 6 ++++++ src/main/java/org/scion/multiping/PingRepeat.java | 12 ++++++++++-- .../java/org/scion/multiping/PingResponder.java | 2 +- .../java/org/scion/multiping/util/Config.java | 15 ++++++++++++--- 6 files changed, 33 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e447918..53cdc1c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -26,7 +26,9 @@ TODO [#20](https://github.com/netsec-ethz/scion-java-multiping/pull/20) - Added output of global maxima (longest path, ...) [#24](https://github.com/netsec-ethz/scion-java-multiping/pull/24) - +- Added output and config of local port + [#26](https://github.com/netsec-ethz/scion-java-multiping/pull/26) +- ### Changed - Output summary uses `\t` whitespaces for easier copying. diff --git a/README.md b/README.md index ae1fb62..2eac852 100644 --- a/README.md +++ b/README.md @@ -87,7 +87,7 @@ arguments: "tryICMP": false, "isdAsInputFile": "ping-repeat-destinations.csv", "outputFile": "ping-repeat-output.csv", - "localPort": 30041, // This is only used by the PingResponder + "localPort": 30041, "consoleOutput": true } ``` diff --git a/src/main/java/org/scion/multiping/PingAll.java b/src/main/java/org/scion/multiping/PingAll.java index c3e345b..d048f71 100644 --- a/src/main/java/org/scion/multiping/PingAll.java +++ b/src/main/java/org/scion/multiping/PingAll.java @@ -28,6 +28,7 @@ import java.util.stream.Collectors; import org.scion.jpan.*; import org.scion.jpan.internal.PathRawParser; +import org.scion.jpan.internal.Shim; import org.scion.multiping.util.*; /** @@ -91,6 +92,8 @@ enum Policy { public static void main(String[] argsArray) throws IOException { PRINT = true; + // Initialize port from config, but CLI overrides config file. + localPort = config.getLocalPortOr30041(); Policy policy = parseArgs(argsArray); System.setProperty(Constants.PROPERTY_SHIM, startShim ? "true" : "false"); // disable SHIM @@ -99,6 +102,8 @@ public static void main(String[] argsArray) throws IOException { println(" Path policy = " + policy); println(" ICMP=" + config.tryICMP); println(" printOnlyICMP=" + SHOW_ONLY_ICMP); + println(" Local port=" + localPort); + println(" JPAN SHIM active=" + Shim.isInstalled()); long t1 = System.currentTimeMillis(); PingAll pingAll = new PingAll(policy, ScionProvider.defaultProvider(localPort)); @@ -128,6 +133,7 @@ private static Policy parseArgs(String[] argsArray) { case "--help": Main.printUsagePingAll(); System.exit(0); + break; case "--shim": startShim = true; break; diff --git a/src/main/java/org/scion/multiping/PingRepeat.java b/src/main/java/org/scion/multiping/PingRepeat.java index ec0a6bf..8955a93 100644 --- a/src/main/java/org/scion/multiping/PingRepeat.java +++ b/src/main/java/org/scion/multiping/PingRepeat.java @@ -25,8 +25,10 @@ import java.time.Instant; import java.util.*; import java.util.concurrent.ConcurrentLinkedQueue; + import org.scion.jpan.*; import org.scion.jpan.internal.PathRawParser; +import org.scion.jpan.internal.Shim; import org.scion.multiping.util.*; import org.scion.multiping.util.Record; @@ -54,6 +56,7 @@ public class PingRepeat { private int nPingSuccess = 0; private int nPingTimeout = 0; private int nPingError = 0; + private static int localPort = -1; private static Config config; private static FileWriter fileWriter; @@ -61,7 +64,7 @@ public class PingRepeat { private static final boolean SHOW_PATH = true; public PingRepeat() throws UnknownHostException { - this.dummyIP = new InetSocketAddress(InetAddress.getByAddress(new byte[] {1, 2, 3, 4}), 12345); + this.dummyIP = new InetSocketAddress(InetAddress.getByAddress(new byte[]{1, 2, 3, 4}), 12345); } public static void main(String[] args) throws IOException { @@ -70,6 +73,11 @@ public static void main(String[] args) throws IOException { config = Config.read(FILE_CONFIG); PRINT = config.consoleOutput; + localPort = config.hasLocalPort() ? config.localPort : -1; + println("Settings"); + println(" Listening on port: " + localPort); + println(" JPAN SHIM is running: " + Shim.isInstalled()); + // Output: ISD/AS, remote IP, time, hopCount, path, [pings] fileWriter = new FileWriter(config.outputFile); @@ -161,7 +169,7 @@ private Record measureLatency(List paths, Ref refBest) { Record best = null; double currentBestMs = Double.MAX_VALUE; ResponseHandler handler = new ResponseHandler(); - try (ScmpSenderAsync sender = Scmp.newSenderAsyncBuilder(handler).build()) { + try (ScmpSenderAsync sender = Scmp.newSenderAsyncBuilder(handler).setLocalPort(localPort).build()) { for (int attemptCount = 0; attemptCount < config.attemptRepeatCnt; attemptCount++) { Instant start = Instant.now(); Map seqToPathMap = new HashMap<>(); diff --git a/src/main/java/org/scion/multiping/PingResponder.java b/src/main/java/org/scion/multiping/PingResponder.java index 43e6d89..a3b5141 100644 --- a/src/main/java/org/scion/multiping/PingResponder.java +++ b/src/main/java/org/scion/multiping/PingResponder.java @@ -31,7 +31,7 @@ public static void main(String[] args) throws IOException { PRINT = config.consoleOutput; try (ScmpResponder responder = - Scmp.newResponderBuilder().setLocalPort(Constants.SCMP_PORT).build()) { + Scmp.newResponderBuilder().setLocalPort(config.getLocalPortOr30041()).build()) { responder.setScmpErrorListener(PingResponder::printError); responder.setOption(ScionSocketOptions.SCION_API_THROW_PARSER_FAILURE, true); responder.setScmpEchoListener(PingResponder::print); diff --git a/src/main/java/org/scion/multiping/util/Config.java b/src/main/java/org/scion/multiping/util/Config.java index 14946be..28ca420 100644 --- a/src/main/java/org/scion/multiping/util/Config.java +++ b/src/main/java/org/scion/multiping/util/Config.java @@ -18,6 +18,7 @@ import java.io.*; public class Config { + private static final int PORT_NOT_SET = -1; public int attemptRepeatCnt = 5; public int attemptDelayMs = 100; public int roundRepeatCnt = 144; // 1 day @@ -26,15 +27,23 @@ public class Config { public boolean tryICMP = false; public String isdAsInputFile; public String outputFile; - public int localPort = 30041; + public int localPort = PORT_NOT_SET; public boolean consoleOutput = true; + public boolean hasLocalPort() { + return localPort != PORT_NOT_SET; + } + + public int getLocalPortOr30041() { + return hasLocalPort() ? localPort : 30041; + } + public static Config read(String path) { Gson gson = new Gson(); try (Reader reader = new FileReader(path)) { return gson.fromJson(reader, Config.class); } catch (IOException e) { - throw new RuntimeException(e); + throw new IllegalArgumentException(e); } } @@ -47,7 +56,7 @@ void write(String path) { try (Writer writer = new FileWriter(path)) { gson.toJson(this, writer); } catch (IOException e) { - throw new RuntimeException(e); + throw new IllegalArgumentException(e); } } } From 7c2776eb03d8b0af27351c157ba14386991736a1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tilmann=20Z=C3=A4schke?= Date: Fri, 12 Dec 2025 13:13:50 +0100 Subject: [PATCH 2/3] port output + config --- src/main/java/org/scion/multiping/PingRepeat.java | 9 ++++++--- src/main/java/org/scion/multiping/util/Record.java | 4 ++++ 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/scion/multiping/PingRepeat.java b/src/main/java/org/scion/multiping/PingRepeat.java index 8955a93..3911949 100644 --- a/src/main/java/org/scion/multiping/PingRepeat.java +++ b/src/main/java/org/scion/multiping/PingRepeat.java @@ -68,8 +68,6 @@ public PingRepeat() throws UnknownHostException { } public static void main(String[] args) throws IOException { - // System.setProperty(Constants.PROPERTY_DNS_SEARCH_DOMAINS, "ethz.ch."); - config = Config.read(FILE_CONFIG); PRINT = config.consoleOutput; @@ -149,7 +147,12 @@ private void runRepeat(ParseAssignments.HostEntry remote) { // output int nHops = PathRawParser.create(rec.getPath().getRawPath()).getHopCount(); String out = rec.getRemoteIP() + " nPaths=" + nPaths + " nHops=" + nHops; - out += " time=" + bestAttempt.get().getPingMs() + "ms" + " ICMP=" + icmpMs; + if (bestAttempt.get().getState() == Record.Attempt.State.SUCCESS) { + out += " time=" + bestAttempt.get().getPingMs() + "ms"; + } else { + out += " time=" + bestAttempt.get().getState(); + } + out += " ICMP=" + icmpMs; if (SHOW_PATH) { out += " " + ScionUtil.toStringPath(rec.getPath().getMetadata()); } diff --git a/src/main/java/org/scion/multiping/util/Record.java b/src/main/java/org/scion/multiping/util/Record.java index 1db3d09..42ca66a 100644 --- a/src/main/java/org/scion/multiping/util/Record.java +++ b/src/main/java/org/scion/multiping/util/Record.java @@ -199,6 +199,10 @@ public double getPingMs() { return pingMs; } + public State getState() { + return state; + } + @Override public String toString() { return " time=" + round(pingMs, 2) + "ms"; From 7c07a43f94b437c7492dc76d3546e4f451e811e9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tilmann=20Z=C3=A4schke?= Date: Fri, 12 Dec 2025 13:16:16 +0100 Subject: [PATCH 3/3] port output + config --- src/main/java/org/scion/multiping/PingRepeat.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/scion/multiping/PingRepeat.java b/src/main/java/org/scion/multiping/PingRepeat.java index 3911949..a6a5747 100644 --- a/src/main/java/org/scion/multiping/PingRepeat.java +++ b/src/main/java/org/scion/multiping/PingRepeat.java @@ -25,7 +25,6 @@ import java.time.Instant; import java.util.*; import java.util.concurrent.ConcurrentLinkedQueue; - import org.scion.jpan.*; import org.scion.jpan.internal.PathRawParser; import org.scion.jpan.internal.Shim; @@ -64,7 +63,7 @@ public class PingRepeat { private static final boolean SHOW_PATH = true; public PingRepeat() throws UnknownHostException { - this.dummyIP = new InetSocketAddress(InetAddress.getByAddress(new byte[]{1, 2, 3, 4}), 12345); + this.dummyIP = new InetSocketAddress(InetAddress.getByAddress(new byte[] {1, 2, 3, 4}), 12345); } public static void main(String[] args) throws IOException { @@ -172,7 +171,8 @@ private Record measureLatency(List paths, Ref refBest) { Record best = null; double currentBestMs = Double.MAX_VALUE; ResponseHandler handler = new ResponseHandler(); - try (ScmpSenderAsync sender = Scmp.newSenderAsyncBuilder(handler).setLocalPort(localPort).build()) { + try (ScmpSenderAsync sender = + Scmp.newSenderAsyncBuilder(handler).setLocalPort(localPort).build()) { for (int attemptCount = 0; attemptCount < config.attemptRepeatCnt; attemptCount++) { Instant start = Instant.now(); Map seqToPathMap = new HashMap<>();