From 03a603ee1d3da5bd131a196407ef5de7bc4363e6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tilmann=20Z=C3=A4schke?= Date: Wed, 17 Apr 2024 13:56:02 +0200 Subject: [PATCH 1/3] Return InetAddress from Path --- CHANGELOG.md | 5 +++- .../scion/jpan/AbstractDatagramChannel.java | 14 ++++------- src/main/java/org/scion/jpan/Path.java | 8 +++--- src/main/java/org/scion/jpan/RequestPath.java | 12 +++------ .../java/org/scion/jpan/ResponsePath.java | 5 ++-- .../java/org/scion/jpan/ScionService.java | 4 +-- .../jpan/internal/ScionHeaderParser.java | 10 +++++++- .../scion/jpan/PackageVisibilityHelper.java | 25 ++++++++++++++++--- .../jpan/api/DatagramChannelApiTest.java | 8 ++---- .../DatagramChannelMultiSendInetAddrTest.java | 4 +-- .../api/DatagramChannelMultiSendPathTest.java | 2 +- ...nnelMultiWriteConnectedInetSocketTest.java | 2 +- .../java/org/scion/jpan/api/SCMPTest.java | 9 +++++-- .../org/scion/jpan/api/ScionServiceTest.java | 2 +- .../java/org/scion/jpan/api/ScionTest.java | 7 ++++-- .../org/scion/jpan/demo/ScmpEchoDemo.java | 2 +- .../scion/jpan/testutil/PingPongHelper.java | 4 +-- 17 files changed, 74 insertions(+), 49 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a4b37d4c4..70a7661a0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -36,6 +36,10 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. - Cleaned up `DatagramChannel`: Fixed connect()/disconnect(), improved concurrency, fixed buffer resizing wrt MTU, general clean up. [#35](https://github.com/netsec-ethz/scion-java-client/pull/35) +- **BREAKING CHANGE**: Renamed project to `jpan`. + [#42](https://github.com/netsec-ethz/scion-java-client/pull/42) +- **BREAKING CHANGE**: `Path` now returns `InetAddress` instead of `byte[]` + [#43](https://github.com/netsec-ethz/scion-java-client/pull/43) ### Fixed - Fixed: SCMP problem when pinging local AS. @@ -54,7 +58,6 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. - Some cleanup related to hists file parser. [#42](https://github.com/netsec-ethz/scion-java-client/pull/42) ### Removed - - Removed all code related to DatagramSockets [#21](https://github.com/netsec-ethz/scion-java-client/pull/21) diff --git a/src/main/java/org/scion/jpan/AbstractDatagramChannel.java b/src/main/java/org/scion/jpan/AbstractDatagramChannel.java index fb3ff7787..2b87ee8ac 100644 --- a/src/main/java/org/scion/jpan/AbstractDatagramChannel.java +++ b/src/main/java/org/scion/jpan/AbstractDatagramChannel.java @@ -163,11 +163,10 @@ public InetSocketAddress getLocalAddress() throws IOException { } } - public SocketAddress getRemoteAddress() throws UnknownHostException { + public SocketAddress getRemoteAddress() { Path path = getConnectionPath(); if (path != null) { - InetAddress ip = InetAddress.getByAddress(path.getDestinationAddress()); - return new InetSocketAddress(ip, path.getDestinationPort()); + return new InetSocketAddress(path.getDestinationAddress(), path.getDestinationPort()); } return null; } @@ -532,10 +531,6 @@ protected void buildHeader( } } - long dstIA = path.getDestinationIsdAs(); - byte[] dstAddress = path.getDestinationAddress(); - int dstPort = path.getDestinationPort(); - byte[] rawPath = path.getRawPath(); ScionHeaderParser.write( buffer, @@ -543,13 +538,14 @@ protected void buildHeader( rawPath.length, srcIA, srcAddress, - dstIA, - dstAddress, + path.getDestinationIsdAs(), + path.getDestinationAddress().getAddress(), hdrType, cfgTrafficClass); ScionHeaderParser.writePath(buffer, rawPath); if (hdrType == InternalConstants.HdrTypes.UDP) { + int dstPort = path.getDestinationPort(); ScionHeaderParser.writeUdpOverlayHeader(buffer, payloadLength, srcPort, dstPort); } } diff --git a/src/main/java/org/scion/jpan/Path.java b/src/main/java/org/scion/jpan/Path.java index 56988f370..b9fb72cce 100644 --- a/src/main/java/org/scion/jpan/Path.java +++ b/src/main/java/org/scion/jpan/Path.java @@ -25,10 +25,10 @@ public abstract class Path { private final byte[] pathRaw; private final long dstIsdAs; - private final byte[] dstAddress; + private final InetAddress dstAddress; private final int dstPort; - protected Path(byte[] rawPath, long dstIsdAs, byte[] dstIP, int dstPort) { + protected Path(byte[] rawPath, long dstIsdAs, InetAddress dstIP, int dstPort) { this.pathRaw = rawPath; this.dstIsdAs = dstIsdAs; this.dstAddress = dstIP; @@ -45,7 +45,7 @@ public int getDestinationPort() { return dstPort; } - public byte[] getDestinationAddress() { + public InetAddress getDestinationAddress() { return dstAddress; } @@ -59,7 +59,7 @@ public String toString() { + "dstIsdAs=" + ScionUtil.toStringIA(dstIsdAs) + ", dstAddress=" - + Arrays.toString(dstAddress) + + dstAddress + ", dstPort=" + dstPort + ", pathRaw=" diff --git a/src/main/java/org/scion/jpan/RequestPath.java b/src/main/java/org/scion/jpan/RequestPath.java index 7c2e83cbe..976bed603 100644 --- a/src/main/java/org/scion/jpan/RequestPath.java +++ b/src/main/java/org/scion/jpan/RequestPath.java @@ -34,22 +34,16 @@ public class RequestPath extends Path { // We store the first hop separately to void creating unnecessary objects. private final InetSocketAddress firstHop; - static RequestPath create(Daemon.Path path, long dstIsdAs, byte[] dstIP, int dstPort) { + static RequestPath create(Daemon.Path path, long dstIsdAs, InetAddress dstIP, int dstPort) { return new RequestPath(path, dstIsdAs, dstIP, dstPort); } - private RequestPath(Daemon.Path path, long dstIsdAs, byte[] dstIP, int dstPort) { + private RequestPath(Daemon.Path path, long dstIsdAs, InetAddress dstIP, int dstPort) { super(path.getRaw().toByteArray(), dstIsdAs, dstIP, dstPort); this.pathProtoc = path; if (getRawPath().length == 0) { // local AS has path length 0 - try { - InetAddress address = InetAddress.getByAddress(getDestinationAddress()); - firstHop = new InetSocketAddress(address, getDestinationPort()); - } catch (UnknownHostException e) { - // This is impossible, an IP address cannot be unknown - throw new UncheckedIOException(e); - } + firstHop = new InetSocketAddress(getDestinationAddress(), getDestinationPort()); } else { firstHop = getFirstHopAddress(pathProtoc); } diff --git a/src/main/java/org/scion/jpan/ResponsePath.java b/src/main/java/org/scion/jpan/ResponsePath.java index b1f579f49..dcc143d59 100644 --- a/src/main/java/org/scion/jpan/ResponsePath.java +++ b/src/main/java/org/scion/jpan/ResponsePath.java @@ -14,6 +14,7 @@ package org.scion.jpan; +import java.net.InetAddress; import java.net.InetSocketAddress; import java.util.Arrays; @@ -37,7 +38,7 @@ public static ResponsePath create( byte[] srcIP, int srcPort, long dstIsdAs, - byte[] dstIP, + InetAddress dstIP, int dstPort, InetSocketAddress firstHopAddress) { return new ResponsePath( @@ -50,7 +51,7 @@ private ResponsePath( byte[] srcIP, int srcPort, long dstIsdAs, - byte[] dstIP, + InetAddress dstIP, int dstPort, InetSocketAddress firstHopAddress) { super(rawPath, dstIsdAs, dstIP, dstPort); diff --git a/src/main/java/org/scion/jpan/ScionService.java b/src/main/java/org/scion/jpan/ScionService.java index 30b15ea97..2416c7e96 100644 --- a/src/main/java/org/scion/jpan/ScionService.java +++ b/src/main/java/org/scion/jpan/ScionService.java @@ -311,7 +311,7 @@ public List getPaths(InetSocketAddress dstAddress) throws IOExcepti * @return All paths returned by the path service. */ public List getPaths(long dstIsdAs, InetSocketAddress dstAddress) { - return getPaths(dstIsdAs, dstAddress.getAddress().getAddress(), dstAddress.getPort()); + return getPaths(dstIsdAs, dstAddress.getAddress(), dstAddress.getPort()); } /** @@ -333,7 +333,7 @@ public List getPaths(RequestPath path) { * @param dstPort Destination port * @return All paths returned by the path service. */ - public List getPaths(long dstIsdAs, byte[] dstAddress, int dstPort) { + public List getPaths(long dstIsdAs, InetAddress dstAddress, int dstPort) { long srcIsdAs = getLocalIsdAs(); List paths = getPathList(srcIsdAs, dstIsdAs); if (paths.isEmpty()) { diff --git a/src/main/java/org/scion/jpan/internal/ScionHeaderParser.java b/src/main/java/org/scion/jpan/internal/ScionHeaderParser.java index c20459baa..30f80210f 100644 --- a/src/main/java/org/scion/jpan/internal/ScionHeaderParser.java +++ b/src/main/java/org/scion/jpan/internal/ScionHeaderParser.java @@ -100,11 +100,19 @@ public static ResponsePath extractResponsePath( int srcPort = Short.toUnsignedInt(data.getShort()); int dstPort = Short.toUnsignedInt(data.getShort()); + InetAddress srcIP; + try { + srcIP = InetAddress.getByAddress(bytesSrc); + } catch (UnknownHostException e) { + // this cannot happen + throw new IllegalStateException(e); + } + // rewind to original offset data.position(pos); // Swap src and dst. return ResponsePath.create( - path, dstIsdAs, bytesDst, dstPort, srcIsdAs, bytesSrc, srcPort, firstHopAddress); + path, dstIsdAs, bytesDst, dstPort, srcIsdAs, srcIP, srcPort, firstHopAddress); } /** diff --git a/src/test/java/org/scion/jpan/PackageVisibilityHelper.java b/src/test/java/org/scion/jpan/PackageVisibilityHelper.java index f94959f9b..96374b738 100644 --- a/src/test/java/org/scion/jpan/PackageVisibilityHelper.java +++ b/src/test/java/org/scion/jpan/PackageVisibilityHelper.java @@ -60,11 +60,25 @@ public static ResponsePath getResponsePath(ByteBuffer packet, InetSocketAddress public static RequestPath createDummyPath() { InetSocketAddress dstAddr = new InetSocketAddress(InetAddress.getLoopbackAddress(), 12345); - return createDummyPath(0, ExamplePacket.SRC_HOST, 55555, new byte[0], dstAddr); + try { + InetAddress dstIP = InetAddress.getByAddress(ExamplePacket.SRC_HOST); + return createDummyPath(0, dstIP, 55555, new byte[0], dstAddr); + } catch (UnknownHostException e) { + throw new IllegalStateException(e); + } } public static RequestPath createDummyPath( long dstIsdAs, byte[] dstHost, int dstPort, byte[] raw, InetSocketAddress firstHop) { + try { + return createDummyPath(dstIsdAs, InetAddress.getByAddress(dstHost), dstPort, raw, firstHop); + } catch (UnknownHostException e) { + throw new IllegalStateException(e); + } + } + + public static RequestPath createDummyPath( + long dstIsdAs, InetAddress dstHost, int dstPort, byte[] raw, InetSocketAddress firstHop) { ByteString bs = ByteString.copyFrom(raw); String firstHopString = firstHop.getHostString() + ":" + firstHop.getPort(); Daemon.Interface inter = @@ -86,13 +100,18 @@ public static ResponsePath createDummyResponsePath( byte[] dstIP, int dstPort, InetSocketAddress firstHop) { - return ResponsePath.create(raw, srcIsdAs, srcIP, srcPort, dstIsdAs, dstIP, dstPort, firstHop); + try { + InetAddress dst = InetAddress.getByAddress(dstIP); + return ResponsePath.create(raw, srcIsdAs, srcIP, srcPort, dstIsdAs, dst, dstPort, firstHop); + } catch (UnknownHostException e) { + throw new IllegalStateException(e); + } } public static RequestPath createRequestPath110_112( Daemon.Path.Builder builder, long dstIsdAs, - byte[] dstHost, + InetAddress dstHost, int dstPort, InetSocketAddress firstHop) { ByteString bs = ByteString.copyFrom(ExamplePacket.PATH_RAW_TINY_110_112); diff --git a/src/test/java/org/scion/jpan/api/DatagramChannelApiTest.java b/src/test/java/org/scion/jpan/api/DatagramChannelApiTest.java index 32db4c155..1e861efe6 100644 --- a/src/test/java/org/scion/jpan/api/DatagramChannelApiTest.java +++ b/src/test/java/org/scion/jpan/api/DatagramChannelApiTest.java @@ -156,11 +156,7 @@ void getLocalAddress_notLocalhost() throws IOException { RequestPath path = PackageVisibilityHelper.createDummyPath( - sAddr.getIsdAs(), - sAddr.getInetAddress().getAddress(), - dummyPort, - new byte[100], - firstHop); + sAddr.getIsdAs(), sAddr.getInetAddress(), dummyPort, new byte[100], firstHop); try (DatagramChannel channel = DatagramChannel.open()) { channel.connect(path); @@ -327,7 +323,7 @@ void isConnected_InetSocket() throws IOException { @Test void isConnected_Path() throws IOException { RequestPath path = PackageVisibilityHelper.createDummyPath(); - InetAddress ip = InetAddress.getByAddress(path.getDestinationAddress()); + InetAddress ip = path.getDestinationAddress(); InetSocketAddress address = new InetSocketAddress(ip, path.getDestinationPort()); try (DatagramChannel channel = DatagramChannel.open()) { assertFalse(channel.isConnected()); diff --git a/src/test/java/org/scion/jpan/api/DatagramChannelMultiSendInetAddrTest.java b/src/test/java/org/scion/jpan/api/DatagramChannelMultiSendInetAddrTest.java index a36414e7b..0623ec5d3 100644 --- a/src/test/java/org/scion/jpan/api/DatagramChannelMultiSendInetAddrTest.java +++ b/src/test/java/org/scion/jpan/api/DatagramChannelMultiSendInetAddrTest.java @@ -49,7 +49,7 @@ private void client(DatagramChannel channel, Path serverAddress, int id) throws String message = PingPongHelper.MSG + "-" + id; ByteBuffer sendBuf = ByteBuffer.wrap(message.getBytes()); // Test send() with InetAddress - InetAddress inetServerAddress = InetAddress.getByAddress(serverAddress.getDestinationAddress()); + InetAddress inetServerAddress = serverAddress.getDestinationAddress(); InetSocketAddress inetServerSocketAddress = new InetSocketAddress(inetServerAddress, serverAddress.getDestinationPort()); channel.send(sendBuf, inetServerSocketAddress); @@ -58,7 +58,7 @@ private void client(DatagramChannel channel, Path serverAddress, int id) throws ByteBuffer response = ByteBuffer.allocate(512); Path address = channel.receive(response); assertNotNull(address); - assertArrayEquals(serverAddress.getDestinationAddress(), address.getDestinationAddress()); + assertEquals(serverAddress.getDestinationAddress(), address.getDestinationAddress()); assertEquals(serverAddress.getDestinationPort(), address.getDestinationPort()); response.flip(); diff --git a/src/test/java/org/scion/jpan/api/DatagramChannelMultiSendPathTest.java b/src/test/java/org/scion/jpan/api/DatagramChannelMultiSendPathTest.java index 506ac575f..cb3e1235d 100644 --- a/src/test/java/org/scion/jpan/api/DatagramChannelMultiSendPathTest.java +++ b/src/test/java/org/scion/jpan/api/DatagramChannelMultiSendPathTest.java @@ -52,7 +52,7 @@ private void client(DatagramChannel channel, Path serverAddress, int id) throws ByteBuffer response = ByteBuffer.allocate(512); Path address = channel.receive(response); assertNotNull(address); - assertArrayEquals(serverAddress.getDestinationAddress(), address.getDestinationAddress()); + assertEquals(serverAddress.getDestinationAddress(), address.getDestinationAddress()); assertEquals(serverAddress.getDestinationPort(), address.getDestinationPort()); response.flip(); diff --git a/src/test/java/org/scion/jpan/api/DatagramChannelMultiWriteConnectedInetSocketTest.java b/src/test/java/org/scion/jpan/api/DatagramChannelMultiWriteConnectedInetSocketTest.java index e2c08bc4b..0b5aca4e1 100644 --- a/src/test/java/org/scion/jpan/api/DatagramChannelMultiWriteConnectedInetSocketTest.java +++ b/src/test/java/org/scion/jpan/api/DatagramChannelMultiWriteConnectedInetSocketTest.java @@ -50,7 +50,7 @@ private void client(DatagramChannel channel, Path serverAddress, int id) throws ByteBuffer sendBuf = ByteBuffer.wrap(message.getBytes()); channel.disconnect(); // Test send() with InetAddress - InetAddress inetAddress = InetAddress.getByAddress(serverAddress.getDestinationAddress()); + InetAddress inetAddress = serverAddress.getDestinationAddress(); InetSocketAddress inetServerSocketAddress = new InetSocketAddress(inetAddress, serverAddress.getDestinationPort()); channel.connect(inetServerSocketAddress); diff --git a/src/test/java/org/scion/jpan/api/SCMPTest.java b/src/test/java/org/scion/jpan/api/SCMPTest.java index 4ac7e185b..b8ca775d7 100644 --- a/src/test/java/org/scion/jpan/api/SCMPTest.java +++ b/src/test/java/org/scion/jpan/api/SCMPTest.java @@ -283,8 +283,13 @@ void traceroute_SCMP_error() throws IOException { private RequestPath getPathTo112() { ScionService service = Scion.defaultService(); long dstIA = ScionUtil.parseIA("1-ff00:0:112"); - List paths = service.getPaths(dstIA, new byte[] {0, 0, 0, 0}, 12345); - return paths.get(0); + try { + InetAddress zero = InetAddress.getByAddress(new byte[] {0, 0, 0, 0}); + List paths = service.getPaths(dstIA, zero, 12345); + return paths.get(0); + } catch (UnknownHostException e) { + throw new IllegalStateException(e); + } } private RequestPath getPathToLocalAS() { diff --git a/src/test/java/org/scion/jpan/api/ScionServiceTest.java b/src/test/java/org/scion/jpan/api/ScionServiceTest.java index 479a612ee..ae313e11d 100644 --- a/src/test/java/org/scion/jpan/api/ScionServiceTest.java +++ b/src/test/java/org/scion/jpan/api/ScionServiceTest.java @@ -191,7 +191,7 @@ void getPaths_localAS() throws IOException { // raw: {} assertEquals(1, paths.size()); RequestPath path = paths.get(0); - InetAddress addr = InetAddress.getByAddress(path.getDestinationAddress()); + InetAddress addr = path.getDestinationAddress(); InetSocketAddress sAddr = new InetSocketAddress(addr, path.getDestinationPort()); assertEquals(sAddr, path.getFirstHopAddress()); assertEquals(dstIA, path.getDestinationIsdAs()); diff --git a/src/test/java/org/scion/jpan/api/ScionTest.java b/src/test/java/org/scion/jpan/api/ScionTest.java index ed754d8fb..f89e6a771 100644 --- a/src/test/java/org/scion/jpan/api/ScionTest.java +++ b/src/test/java/org/scion/jpan/api/ScionTest.java @@ -18,6 +18,7 @@ import java.io.IOException; import java.net.Inet6Address; +import java.net.InetAddress; import java.net.InetSocketAddress; import java.util.List; import org.junit.jupiter.api.AfterAll; @@ -173,7 +174,8 @@ void newServiceWithDNS() throws IOException { MockNetwork.startTiny(MockNetwork.Mode.NAPTR); try (Scion.CloseableService ss = Scion.newServiceWithDNS(MockTopologyServer.TOPO_HOST)) { // destination address = 123.123.123.123 because we don´t care for getting a path - List paths = ss.getPaths(iaDst, new byte[] {123, 123, 123, 123}, 12345); + InetAddress ip123 = InetAddress.getByAddress(new byte[] {123, 123, 123, 123}); + List paths = ss.getPaths(iaDst, ip123, 12345); assertNotNull(paths); assertFalse(paths.isEmpty()); assertEquals(1, MockNetwork.getTopoServer().getAndResetCallCount()); @@ -192,7 +194,8 @@ void newServiceWithBootstrapServer() throws IOException { try (Scion.CloseableService ss = Scion.newServiceWithBootstrapServer(ToStringUtil.toAddressPort(topoAddr))) { // destination address = 123.123.123.123 because we don´t care for getting a path - List paths = ss.getPaths(iaDst, new byte[] {123, 123, 123, 123}, 12345); + InetAddress ip123 = InetAddress.getByAddress(new byte[] {123, 123, 123, 123}); + List paths = ss.getPaths(iaDst, ip123, 12345); assertNotNull(paths); assertFalse(paths.isEmpty()); assertEquals(1, MockNetwork.getTopoServer().getAndResetCallCount()); diff --git a/src/test/java/org/scion/jpan/demo/ScmpEchoDemo.java b/src/test/java/org/scion/jpan/demo/ScmpEchoDemo.java index 8c602f510..1ec3aed0e 100644 --- a/src/test/java/org/scion/jpan/demo/ScmpEchoDemo.java +++ b/src/test/java/org/scion/jpan/demo/ScmpEchoDemo.java @@ -113,7 +113,7 @@ private void runDemo(long dstIA, InetSocketAddress dstAddress) throws IOExceptio String millis = String.format("%.3f", msg.getNanoSeconds() / (double) 1_000_000); String echoMsgStr = msg.getSizeReceived() + " bytes from "; // TODO proper address - InetAddress addr = InetAddress.getByAddress(msg.getPath().getDestinationAddress()); + InetAddress addr = msg.getPath().getDestinationAddress(); echoMsgStr += ScionUtil.toStringIA(dstIA) + "," + addr.getHostAddress(); echoMsgStr += ": scmp_seq=" + msg.getSequenceNumber(); if (msg.isTimedOut()) { diff --git a/src/test/java/org/scion/jpan/testutil/PingPongHelper.java b/src/test/java/org/scion/jpan/testutil/PingPongHelper.java index af76e13be..08ea71670 100644 --- a/src/test/java/org/scion/jpan/testutil/PingPongHelper.java +++ b/src/test/java/org/scion/jpan/testutil/PingPongHelper.java @@ -75,7 +75,7 @@ private class ClientEndpoint extends AbstractChannelEndpoint { @Override public final void runImpl(DatagramChannel channel) throws IOException { if (connect) { - InetAddress inetAddress = InetAddress.getByAddress(path.getDestinationAddress()); + InetAddress inetAddress = path.getDestinationAddress(); InetSocketAddress iSAddress = new InetSocketAddress(inetAddress, path.getDestinationPort()); channel.connect(iSAddress); } @@ -139,7 +139,7 @@ public static void defaultClient(DatagramChannel channel, Path serverAddress, in ByteBuffer response = ByteBuffer.allocate(512); Path address = channel.receive(response); assertNotNull(address); - assertArrayEquals(serverAddress.getDestinationAddress(), address.getDestinationAddress()); + assertEquals(serverAddress.getDestinationAddress(), address.getDestinationAddress()); assertEquals(serverAddress.getDestinationPort(), address.getDestinationPort()); response.flip(); From bd8f57ef16843e159168d760dfefe7e5a7d65200 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tilmann=20Z=C3=A4schke?= Date: Wed, 17 Apr 2024 13:56:48 +0200 Subject: [PATCH 2/3] Return InetAddress from Path --- CHANGELOG.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 70a7661a0..6265a7dd9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -37,9 +37,9 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. fixed buffer resizing wrt MTU, general clean up. [#35](https://github.com/netsec-ethz/scion-java-client/pull/35) - **BREAKING CHANGE**: Renamed project to `jpan`. - [#42](https://github.com/netsec-ethz/scion-java-client/pull/42) -- **BREAKING CHANGE**: `Path` now returns `InetAddress` instead of `byte[]` [#43](https://github.com/netsec-ethz/scion-java-client/pull/43) +- **BREAKING CHANGE**: `Path` now returns `InetAddress` instead of `byte[]` + [#44](https://github.com/netsec-ethz/scion-java-client/pull/44) ### Fixed - Fixed: SCMP problem when pinging local AS. From e6daac7de27a2ca77695cb5f6d9ceee39a73b8b6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tilmann=20Z=C3=A4schke?= Date: Wed, 17 Apr 2024 15:53:14 +0200 Subject: [PATCH 3/3] Return InetAddress from Path --- .../java/org/scion/jpan/AbstractDatagramChannel.java | 8 ++++---- src/main/java/org/scion/jpan/ResponsePath.java | 11 +++++------ .../org/scion/jpan/internal/ScionHeaderParser.java | 4 +++- .../java/org/scion/jpan/PackageVisibilityHelper.java | 3 ++- 4 files changed, 14 insertions(+), 12 deletions(-) diff --git a/src/main/java/org/scion/jpan/AbstractDatagramChannel.java b/src/main/java/org/scion/jpan/AbstractDatagramChannel.java index 2b87ee8ac..bdec3ec99 100644 --- a/src/main/java/org/scion/jpan/AbstractDatagramChannel.java +++ b/src/main/java/org/scion/jpan/AbstractDatagramChannel.java @@ -500,7 +500,7 @@ protected void buildHeader( ensureBound(); buffer.clear(); long srcIA; - byte[] srcAddress; + InetAddress srcAddress; int srcPort; if (path instanceof ResponsePath) { // We could get source IA, address and port locally, but it seems cleaner @@ -518,9 +518,9 @@ protected void buildHeader( // elsewhere (from the service). // TODO cache this or add it to path object? - srcAddress = getOrCreateService().getExternalIP(path.getFirstHopAddress()).getAddress(); + srcAddress = getOrCreateService().getExternalIP(path.getFirstHopAddress()); } else { - srcAddress = localAddress.getAddress(); + srcAddress = localAddress; } srcPort = ((InetSocketAddress) channel.getLocalAddress()).getPort(); if (srcPort == 0) { @@ -537,7 +537,7 @@ protected void buildHeader( payloadLength, rawPath.length, srcIA, - srcAddress, + srcAddress.getAddress(), path.getDestinationIsdAs(), path.getDestinationAddress().getAddress(), hdrType, diff --git a/src/main/java/org/scion/jpan/ResponsePath.java b/src/main/java/org/scion/jpan/ResponsePath.java index dcc143d59..6c2efdcf6 100644 --- a/src/main/java/org/scion/jpan/ResponsePath.java +++ b/src/main/java/org/scion/jpan/ResponsePath.java @@ -16,7 +16,6 @@ import java.net.InetAddress; import java.net.InetSocketAddress; -import java.util.Arrays; /** * A ResponsePath is created/returned when receiving a packet. Besides being a Path, it contains @@ -29,13 +28,13 @@ public class ResponsePath extends Path { private final InetSocketAddress firstHopAddress; // The ResponsePath gets source information from the incoming packet. private final long srcIsdAs; - private final byte[] srcAddress; + private final InetAddress srcAddress; private final int srcPort; public static ResponsePath create( byte[] rawPath, long srcIsdAs, - byte[] srcIP, + InetAddress srcIP, int srcPort, long dstIsdAs, InetAddress dstIP, @@ -48,7 +47,7 @@ public static ResponsePath create( private ResponsePath( byte[] rawPath, long srcIsdAs, - byte[] srcIP, + InetAddress srcIP, int srcPort, long dstIsdAs, InetAddress dstIP, @@ -70,7 +69,7 @@ public long getSourceIsdAs() { return srcIsdAs; } - public byte[] getSourceAddress() { + public InetAddress getSourceAddress() { return srcAddress; } @@ -87,7 +86,7 @@ public String toString() { + ", srcIsdAs=" + srcIsdAs + ", srcAddress=" - + Arrays.toString(srcAddress) + + srcAddress + ", srcPort=" + srcPort + '}'; diff --git a/src/main/java/org/scion/jpan/internal/ScionHeaderParser.java b/src/main/java/org/scion/jpan/internal/ScionHeaderParser.java index 30f80210f..3b93148ca 100644 --- a/src/main/java/org/scion/jpan/internal/ScionHeaderParser.java +++ b/src/main/java/org/scion/jpan/internal/ScionHeaderParser.java @@ -101,8 +101,10 @@ public static ResponsePath extractResponsePath( int dstPort = Short.toUnsignedInt(data.getShort()); InetAddress srcIP; + InetAddress dstIP; try { srcIP = InetAddress.getByAddress(bytesSrc); + dstIP = InetAddress.getByAddress(bytesDst); } catch (UnknownHostException e) { // this cannot happen throw new IllegalStateException(e); @@ -112,7 +114,7 @@ public static ResponsePath extractResponsePath( data.position(pos); // Swap src and dst. return ResponsePath.create( - path, dstIsdAs, bytesDst, dstPort, srcIsdAs, srcIP, srcPort, firstHopAddress); + path, dstIsdAs, dstIP, dstPort, srcIsdAs, srcIP, srcPort, firstHopAddress); } /** diff --git a/src/test/java/org/scion/jpan/PackageVisibilityHelper.java b/src/test/java/org/scion/jpan/PackageVisibilityHelper.java index 96374b738..e4ce89abc 100644 --- a/src/test/java/org/scion/jpan/PackageVisibilityHelper.java +++ b/src/test/java/org/scion/jpan/PackageVisibilityHelper.java @@ -101,8 +101,9 @@ public static ResponsePath createDummyResponsePath( int dstPort, InetSocketAddress firstHop) { try { + InetAddress src = InetAddress.getByAddress(srcIP); InetAddress dst = InetAddress.getByAddress(dstIP); - return ResponsePath.create(raw, srcIsdAs, srcIP, srcPort, dstIsdAs, dst, dstPort, firstHop); + return ResponsePath.create(raw, srcIsdAs, src, srcPort, dstIsdAs, dst, dstPort, firstHop); } catch (UnknownHostException e) { throw new IllegalStateException(e); }