You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@plc4x.apache.org by cd...@apache.org on 2019/08/18 13:07:10 UTC
[plc4x] 02/03: Cherry Picked some of the changes regarding
Raw-Sockets: Raw Socket works now reasonaly well, I think.
This is an automated email from the ASF dual-hosted git repository.
cdutz pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/plc4x.git
commit 91b481277ad27ea2286657f4c2d215a65f0dd454
Author: Christofer Dutz <ch...@c-ware.de>
AuthorDate: Sun Aug 18 14:53:52 2019 +0200
Cherry Picked some of the changes regarding Raw-Sockets: Raw Socket works now reasonaly well, I think.
---
.../plc4x/java/utils/rawsockets/RawIpSocket.java | 27 +++++++++----
.../utils/rawsockets/netty/RawSocketChannel.java | 45 +++++++++++++++++++---
2 files changed, 59 insertions(+), 13 deletions(-)
diff --git a/plc4j/utils/raw-sockets/src/main/java/org/apache/plc4x/java/utils/rawsockets/RawIpSocket.java b/plc4j/utils/raw-sockets/src/main/java/org/apache/plc4x/java/utils/rawsockets/RawIpSocket.java
index 0215e3b..804fa6a 100644
--- a/plc4j/utils/raw-sockets/src/main/java/org/apache/plc4x/java/utils/rawsockets/RawIpSocket.java
+++ b/plc4j/utils/raw-sockets/src/main/java/org/apache/plc4x/java/utils/rawsockets/RawIpSocket.java
@@ -22,6 +22,7 @@ import org.pcap4j.packet.namednumber.*;
import org.pcap4j.util.ByteArrays;
import org.pcap4j.util.LinkLayerAddress;
import org.pcap4j.util.MacAddress;
+import org.pcap4j.util.NifSelector;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -31,10 +32,7 @@ import java.io.InputStreamReader;
import java.net.Inet4Address;
import java.net.InetAddress;
import java.net.UnknownHostException;
-import java.util.HashMap;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
import java.util.concurrent.*;
public class RawIpSocket {
@@ -42,7 +40,7 @@ public class RawIpSocket {
private static final Logger logger = LoggerFactory.getLogger(RawIpSocket.class);
private static final int SNAPLEN = 65536;
- private static final int READ_TIMEOUT = 10;
+ private static final int READ_TIMEOUT = 10000;
private static final String GATEWAY_ONLY_NETMASK = "255.255.255.255";
@@ -236,8 +234,11 @@ public class RawIpSocket {
pool.execute(() -> {
try {
receiveHandle.loop(-1, listener);
- } catch (PcapNativeException | InterruptedException | NotOpenException e) {
+ } catch (PcapNativeException | NotOpenException e) {
logger.error("Error receiving ARP lookup", e);
+ } catch (InterruptedException e) {
+ logger.error("Interrupted! Error receiving ARP lookup", e);
+ Thread.currentThread().interrupt();
}
});
@@ -296,6 +297,14 @@ public class RawIpSocket {
private FirstHop getFirstHop(InetAddress remoteAddress) throws RawSocketException {
byte[] remoteIp = remoteAddress.getAddress();
// Iterate over all network interfaces.
+
+
+// try {
+// new NifSelector().selectNetworkInterface().getLinkLayerAddresses();
+// } catch (IOException e) {
+// e.printStackTrace();
+// }
+
try {
// First try if we can connect to the remote device directly.
for (PcapNetworkInterface dev : Pcaps.findAllDevs()) {
@@ -322,8 +331,12 @@ public class RawIpSocket {
// If the current address would be able to connect to the remote
// address, return this device.
if (matches) {
+ if (dev.getLinkLayerAddresses().isEmpty()) {
+ continue;
+ }
+ LinkLayerAddress localMacAddress = dev.getLinkLayerAddresses().iterator().next();
return new FirstHop(dev, localAddress.getAddress(),
- dev.getLinkLayerAddresses().iterator().next(),
+ localMacAddress,
getMacAddress(dev, localAddress.getAddress(), remoteAddress));
}
}
diff --git a/plc4j/utils/raw-sockets/src/main/java/org/apache/plc4x/java/utils/rawsockets/netty/RawSocketChannel.java b/plc4j/utils/raw-sockets/src/main/java/org/apache/plc4x/java/utils/rawsockets/netty/RawSocketChannel.java
index 1665686..680e8c6 100644
--- a/plc4j/utils/raw-sockets/src/main/java/org/apache/plc4x/java/utils/rawsockets/netty/RawSocketChannel.java
+++ b/plc4j/utils/raw-sockets/src/main/java/org/apache/plc4x/java/utils/rawsockets/netty/RawSocketChannel.java
@@ -19,19 +19,34 @@ under the License.
package org.apache.plc4x.java.utils.rawsockets.netty;
import io.netty.channel.*;
+import io.netty.channel.oio.OioByteStreamChannel;
+import org.apache.commons.lang3.NotImplementedException;
+import org.apache.plc4x.java.utils.rawsockets.RawIpSocket;
+import org.pcap4j.core.PcapHandle;
+import org.pcap4j.core.PcapNetworkInterface;
+import org.pcap4j.core.Pcaps;
import java.net.SocketAddress;
-public class RawSocketChannel extends AbstractChannel {
+public class RawSocketChannel extends OioByteStreamChannel {
private static final ChannelMetadata METADATA = new ChannelMetadata(false, 16);
+ PcapHandle handle;
+
protected class RawByteUnsafe extends AbstractChannel.AbstractUnsafe {
@Override
public void connect(SocketAddress remoteAddress, SocketAddress localAddress, ChannelPromise promise) {
- //getPipeline()
- promise.setSuccess();
+ // Connect?!
+ try {
+ doConnect(remoteAddress, localAddress);
+ pipeline().fireChannelActive();
+ promise.setSuccess();
+ } catch (Exception e) {
+ promise.setFailure(e);
+ }
}
+
}
public RawSocketChannel() {
@@ -49,6 +64,12 @@ public class RawSocketChannel extends AbstractChannel {
}
@Override
+ protected void doConnect(SocketAddress remoteAddress, SocketAddress localAddress) throws Exception {
+ PcapNetworkInterface nif = Pcaps.findAllDevs().get(0);
+ this.handle = nif.openLive(65536, PcapNetworkInterface.PromiscuousMode.PROMISCUOUS, 10);
+ }
+
+ @Override
protected SocketAddress localAddress0() {
return null;
}
@@ -65,17 +86,19 @@ public class RawSocketChannel extends AbstractChannel {
@Override
protected void doDisconnect() throws Exception {
- System.out.println("disconnect");
+ throw new NotImplementedException("");
}
@Override
protected void doClose() throws Exception {
- System.out.println("close");
+ if (this.handle != null) {
+ this.handle.close();
+ }
}
@Override
protected void doBeginRead() throws Exception {
- System.out.println("beginRead");
+ this.handle.getNextRawPacketEx();
}
@Override
@@ -103,4 +126,14 @@ public class RawSocketChannel extends AbstractChannel {
return METADATA;
}
+ @Override
+ protected boolean isInputShutdown() {
+ return false;
+ }
+
+ @Override
+ protected ChannelFuture shutdownInput() {
+ return null;
+ }
+
}