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 2021/12/01 14:56:48 UTC

[plc4x] branch develop updated: fix(plc4j): removed files in the "attic" of the raw-sockets module

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


The following commit(s) were added to refs/heads/develop by this push:
     new 37ebe6a  fix(plc4j): removed files in the "attic" of the raw-sockets module
37ebe6a is described below

commit 37ebe6af6dd89237d50f4c21b77560b402902db4
Author: cdutz <ch...@c-ware.de>
AuthorDate: Wed Dec 1 15:56:36 2021 +0100

    fix(plc4j): removed files in the "attic" of the raw-sockets module
---
 LICENSE                                            |   4 -
 .../utils/rawsockets/attic/RawEthernetSocket.java  | 154 -----
 .../java/utils/rawsockets/attic/RawIpSocket.java   | 637 ---------------------
 .../utils/rawsockets/attic/RawSocketListener.java  |  22 -
 .../utils/rawsockets/attic/RawIpSocketTest.java    |  96 ----
 5 files changed, 913 deletions(-)

diff --git a/LICENSE b/LICENSE
index 26a434a..e632bcf 100644
--- a/LICENSE
+++ b/LICENSE
@@ -207,10 +207,6 @@ The files:
 plc4j/transports/test/src/main/java/io/netty/channel/embedded/Plc4xEmbeddedChannel.java
 plc4j/transports/test/src/main/java/io/netty/channel/embedded/Plc4xEmbeddedEventLoop.java
 plc4j/utils/pcap-shared/src/main/java/org/apache/plc4x/java/utils/pcap/netty/exception/PcapException.java
-plc4j/utils/raw-sockets/src/main/java/org/apache/plc4x/java/utils/rawsockets/attic/RawEthernetSocket.java
-plc4j/utils/raw-sockets/src/main/java/org/apache/plc4x/java/utils/rawsockets/attic/RawIpSocket.java
-plc4j/utils/raw-sockets/src/main/java/org/apache/plc4x/java/utils/rawsockets/attic/RawSocketListener.java
-plc4j/utils/raw-sockets/src/test/java/org/apache/plc4x/java/utils/rawsockets/attic/RawIpSocketTest.java
 Are copyrighted by the The Netty Project which is distributed under the Apache 2.0 license.
 
 The files:
diff --git a/plc4j/utils/raw-sockets/src/main/java/org/apache/plc4x/java/utils/rawsockets/attic/RawEthernetSocket.java b/plc4j/utils/raw-sockets/src/main/java/org/apache/plc4x/java/utils/rawsockets/attic/RawEthernetSocket.java
deleted file mode 100644
index 4add071..0000000
--- a/plc4j/utils/raw-sockets/src/main/java/org/apache/plc4x/java/utils/rawsockets/attic/RawEthernetSocket.java
+++ /dev/null
@@ -1,154 +0,0 @@
-/*
- * Copyright 2014 The Netty Project
- *
- * The Netty Project licenses this file to you under the Apache License,
- * version 2.0 (the "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at:
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.plc4x.java.utils.rawsockets.attic;
-
-import org.apache.plc4x.java.utils.pcap.netty.exception.PcapException;
-import org.pcap4j.core.*;
-import org.pcap4j.packet.*;
-import org.pcap4j.packet.namednumber.*;
-import org.pcap4j.util.LinkLayerAddress;
-import org.pcap4j.util.MacAddress;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.util.Arrays;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.concurrent.*;
-
-/**
- * The raw ethernet socket relies on a layer 3 IP protocol implementation for finding the
- * Network device able to connect to a given mac address. In Contrast to the {@link RawIpSocket}
- * the Layer 2 protocol does not support gateways and routers, so we don't need the logic
- * for looking up the default gateway, which makes this implementation a lot simpler.
- */
-public class RawEthernetSocket {
-
-    private static final Logger logger = LoggerFactory.getLogger(RawEthernetSocket.class);
-
-    private static final int SNAPLEN = 65536;
-    private static final int READ_TIMEOUT = 10;
-
-    // The EtherType of the protocol we will be communicating in.
-    private final EtherType etherType;
-
-    private PcapNetworkInterface nif;
-    private MacAddress remoteMacAddress;
-    private MacAddress localMacAddress;
-    private ExecutorService pool = Executors.newSingleThreadExecutor();
-    private PcapHandle receiveHandle;
-
-    private final List<RawSocketListener> listeners = new LinkedList<>();
-
-    public RawEthernetSocket(EtherType etherType) {
-        this.etherType = etherType;
-    }
-
-    public void connect(String localMacAddress, String remoteMacAddress) throws PcapException {
-        try {
-            pool = Executors.newScheduledThreadPool(2);
-
-            this.localMacAddress = MacAddress.getByName(localMacAddress);
-            this.remoteMacAddress = MacAddress.getByName(remoteMacAddress);
-            // Find out which network device is able to connect to the given mac address.
-            nif = null;
-            for (PcapNetworkInterface dev : Pcaps.findAllDevs()) {
-                if(!dev.isLoopBack()) {
-                    for (LinkLayerAddress macAddress : dev.getLinkLayerAddresses()) {
-                        if(Arrays.equals(macAddress.getAddress(), this.localMacAddress.getAddress())) {
-                            nif = dev;
-                        }
-                    }
-                }
-            }
-            if(nif == null) {
-                throw new PcapException(
-                    "Unable to find local network device with mac address " + remoteMacAddress);
-            }
-
-            // Setup receiving of packets and redirecting them to the corresponding listeners.
-            // Filter packets to contain only the ip protocol number of the current protocol.
-            receiveHandle = nif.openLive(SNAPLEN, PcapNetworkInterface.PromiscuousMode.PROMISCUOUS, READ_TIMEOUT);
-
-            // Set the filter.
-            String filterString = "ether proto " + etherType.valueAsString() +
-                " and ether src " + this.remoteMacAddress.toString() +
-                " and ether dst " + this.localMacAddress.toString();
-
-            receiveHandle.setFilter(filterString, BpfProgram.BpfCompileMode.OPTIMIZE);
-            PacketListener packetListener = packet -> {
-                for (RawSocketListener listener : listeners) {
-                    listener.packetReceived(packet.getRawData());
-                }
-            };
-
-            pool.execute(() -> {
-                try {
-                    receiveHandle.loop(-1, packetListener);
-                } catch (InterruptedException e) {
-                    Thread.currentThread().interrupt();
-                    logger.error("Error receiving packet for protocol {} from MAC address {}",
-                        etherType.valueAsString(), remoteMacAddress, e);
-                } catch (PcapNativeException | NotOpenException e) {
-                    logger.error("Error receiving packet for protocol {} from MAC address {}",
-                        etherType.valueAsString(), remoteMacAddress, e);
-                }
-            });
-        } catch (PcapNativeException | NotOpenException e) {
-            throw new PcapException("Error setting up RawSocket", e);
-        }
-    }
-
-    public void disconnect() throws PcapException {
-        // TODO: Terminate all the listeners and the thread pool.
-    }
-
-    public void write(byte[] rawData) throws PcapException {
-        try (PcapHandle sendHandle =
-                 nif.openLive(SNAPLEN, PcapNetworkInterface.PromiscuousMode.PROMISCUOUS, READ_TIMEOUT)) {
-            UnknownPacket.Builder packetBuilder = new UnknownPacket.Builder();
-            packetBuilder.rawData(rawData);
-
-            EthernetPacket.Builder etherBuilder = new EthernetPacket.Builder();
-            etherBuilder.dstAddr(remoteMacAddress)
-                .srcAddr(localMacAddress)
-                .type(etherType)
-                .paddingAtBuild(true);
-            etherBuilder.payloadBuilder(
-                new AbstractPacket.AbstractBuilder() {
-                    @Override
-                    public Packet build() {
-                        return packetBuilder.build();
-                    }
-                }
-            );
-
-            Packet p = etherBuilder.build();
-            sendHandle.sendPacket(p);
-        } catch (PcapNativeException | NotOpenException e) {
-            throw new PcapException("Error sending packet.", e);
-        }
-    }
-
-    public void addListener(RawSocketListener listener) {
-        listeners.add(listener);
-    }
-
-    public void removeListener(RawSocketListener listener) {
-        listeners.remove(listener);
-    }
-
-}
diff --git a/plc4j/utils/raw-sockets/src/main/java/org/apache/plc4x/java/utils/rawsockets/attic/RawIpSocket.java b/plc4j/utils/raw-sockets/src/main/java/org/apache/plc4x/java/utils/rawsockets/attic/RawIpSocket.java
deleted file mode 100644
index 92b4133..0000000
--- a/plc4j/utils/raw-sockets/src/main/java/org/apache/plc4x/java/utils/rawsockets/attic/RawIpSocket.java
+++ /dev/null
@@ -1,637 +0,0 @@
-/*
- * Copyright 2014 The Netty Project
- *
- * The Netty Project licenses this file to you under the Apache License,
- * version 2.0 (the "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at:
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.plc4x.java.utils.rawsockets.attic;
-
-import org.apache.commons.lang3.SystemUtils;
-import org.apache.plc4x.java.utils.pcap.netty.exception.PcapException;
-import org.pcap4j.core.*;
-import org.pcap4j.packet.*;
-import org.pcap4j.packet.namednumber.*;
-import org.pcap4j.util.ByteArrays;
-import org.pcap4j.util.LinkLayerAddress;
-import org.pcap4j.util.MacAddress;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.io.BufferedReader;
-import java.io.IOException;
-import java.io.InputStreamReader;
-import java.net.Inet4Address;
-import java.net.InetAddress;
-import java.net.UnknownHostException;
-import java.util.*;
-import java.util.concurrent.*;
-
-public class RawIpSocket {
-
-    private static final Logger logger = LoggerFactory.getLogger(RawIpSocket.class);
-
-    private static final int SNAPLEN = 65536;
-    private static final int READ_TIMEOUT = 10000;
-
-    private static final String GATEWAY_ONLY_NETMASK = "255.255.255.255";
-
-    private static final Map<InetAddress, MacAddress> arpCache = new HashMap<>();
-
-    // The id of the protocol we will be communicating in.
-    private final int protocolNumber;
-
-    private PcapNetworkInterface nif;
-    private InetAddress remoteIpAddress;
-    private MacAddress firstHopMacAddress;
-    private InetAddress localIpAddress;
-    private MacAddress localMacAddress;
-    private ExecutorService pool = Executors.newSingleThreadExecutor();
-    private PcapHandle receiveHandle;
-
-    private final List<RawSocketListener> listeners = new LinkedList<>();
-
-    public RawIpSocket(int protocolNumber) {
-        this.protocolNumber = protocolNumber;
-    }
-
-    public void connect(String remoteAddress) throws PcapException {
-        try {
-            pool = Executors.newScheduledThreadPool(2);
-
-            remoteIpAddress = InetAddress.getByName(remoteAddress);
-
-            // As we have to create the Ethernet packets ourselves, and
-            // in case of non local remote addresses we need to go through
-            // routers and gateways, we need do differentiate between the
-            // next ethernet node and the remote ip address.
-            //
-            // We therefore need to know the following information:
-            // 1. Can we connect to the remote directly (a) or do we
-            //    need a gateway (b)?
-            // 2. The local IP and Mac Address of our device
-            // 3a. The remote IP and Mac address of the target device
-            // 3b. The remote IP of the target device & the Mac address
-            //     of the gateway.
-
-            // Check if we can connect directly to the destination.
-            FirstHop firstHop = getFirstHop(remoteIpAddress);
-            if (firstHop == null) {
-                // If this wouldn't work, try to figure out the default
-                // gateway and use that as next hop.
-                InetAddress defaultGatewayAddress = getDefaultGatewayAddress();
-                if (defaultGatewayAddress != null) {
-                    firstHop = getFirstHop(defaultGatewayAddress);
-                    if (firstHop == null) {
-                        // If this didn't work, we simply can't reach the
-                        // destination and give up with an exception. Not
-                        // much we can do here.
-                        throw new PcapException("Unable to connect to " + remoteAddress);
-                    }
-                } else {
-                    throw new PcapException("Unable to connect to " + remoteAddress + " no default gateway");
-                }
-            }
-
-            nif = firstHop.networkInterface;
-
-            if (nif.isLoopBack()) {
-                throw new PcapException("Can't use RawSocket on loopback devices");
-            }
-
-            localMacAddress = MacAddress.getByAddress(firstHop.localMacAddress.getAddress());
-            localIpAddress = firstHop.localInetAddress;
-
-            firstHopMacAddress = MacAddress.getByAddress(firstHop.remoteMacAddress.getAddress());
-
-            // Setup receiving of packets and redirecting them to the corresponding listeners.
-            // Filter packets to contain only the ip protocol number of the current protocol.
-            receiveHandle = nif.openLive(SNAPLEN, PcapNetworkInterface.PromiscuousMode.PROMISCUOUS, READ_TIMEOUT);
-
-            // Set the filter.
-            String filterString = "ip protochain " + protocolNumber +
-                " and ether dst " + localMacAddress.toString() +
-                " and ip dst " + localIpAddress.getHostAddress() +
-                " and ether src " + firstHopMacAddress.toString() +
-                " and ip src " + remoteIpAddress.getHostAddress();
-
-            receiveHandle.setFilter(filterString, BpfProgram.BpfCompileMode.OPTIMIZE);
-            PacketListener packetListener = packet -> {
-                for (RawSocketListener listener : listeners) {
-                    listener.packetReceived(packet.getRawData());
-                }
-            };
-
-            pool.execute(() -> {
-                try {
-                    receiveHandle.loop(-1, packetListener);
-                } catch (InterruptedException e) {
-                    Thread.currentThread().interrupt();
-                    logger.error("Error receiving packet for protocol {} from MAC address {}",
-                        protocolNumber, firstHopMacAddress, e);
-                } catch (PcapNativeException | NotOpenException e) {
-                    logger.error("Error receiving packet for protocol {} from MAC address {}",
-                        protocolNumber, firstHopMacAddress, e);
-                }
-            });
-        } catch (PcapNativeException | NotOpenException | UnknownHostException e) {
-            throw new PcapException("Error setting up RawSocket", e);
-        }
-    }
-
-    public void disconnect() throws PcapException {
-        // TODO: Terminate all the listeners and the thread pool.
-    }
-
-    public void write(byte[] rawData) throws PcapException {
-        try (PcapHandle sendHandle =
-                 nif.openLive(SNAPLEN, PcapNetworkInterface.PromiscuousMode.PROMISCUOUS, READ_TIMEOUT)) {
-            UnknownPacket.Builder packetBuilder = new UnknownPacket.Builder();
-            packetBuilder.rawData(rawData);
-
-            IpV4Packet.Builder ipV4Builder = new IpV4Packet.Builder();
-            ipV4Builder
-                .version(IpVersion.IPV4)
-                .tos(IpV4Rfc791Tos.newInstance((byte) 0))
-                .ttl((byte) 100)
-                .protocol(new IpNumber((byte) protocolNumber, "plc4x"))
-                .srcAddr((Inet4Address) localIpAddress)
-                .dstAddr((Inet4Address) remoteIpAddress)
-                .payloadBuilder(packetBuilder)
-                .correctChecksumAtBuild(true)
-                .correctLengthAtBuild(true);
-            ipV4Builder.identification((short) 1);
-
-            EthernetPacket.Builder etherBuilder = new EthernetPacket.Builder();
-            etherBuilder.dstAddr(firstHopMacAddress)
-                .srcAddr(localMacAddress)
-                .type(EtherType.IPV4)
-                .paddingAtBuild(true);
-            etherBuilder.payloadBuilder(
-                new AbstractPacket.AbstractBuilder() {
-                    @Override
-                    public Packet build() {
-                        return ipV4Builder.build();
-                    }
-                }
-            );
-
-            Packet p = etherBuilder.build();
-            sendHandle.sendPacket(p);
-        } catch (PcapNativeException | NotOpenException e) {
-            throw new PcapException("Error sending packet.", e);
-        }
-    }
-
-    public void addListener(RawSocketListener listener) {
-        listeners.add(listener);
-    }
-
-    public void removeListener(RawSocketListener listener) {
-        listeners.remove(listener);
-    }
-
-    private MacAddress getMacAddress(PcapNetworkInterface dev, InetAddress localIpAddress, InetAddress remoteIpAddress) throws PcapException {
-        if (!arpCache.containsKey(remoteIpAddress)) {
-            MacAddress macAddress = lookupMacAddress(dev, localIpAddress, remoteIpAddress);
-            arpCache.put(remoteIpAddress, macAddress);
-            return macAddress;
-        }
-        return arpCache.get(remoteIpAddress);
-    }
-
-    private MacAddress lookupMacAddress(PcapNetworkInterface dev, InetAddress localIpAddress, InetAddress remoteIpAddress) throws PcapException {
-        try (PcapHandle receiveHandle =
-                 dev.openLive(SNAPLEN, PcapNetworkInterface.PromiscuousMode.PROMISCUOUS, READ_TIMEOUT);
-             PcapHandle sendHandle =
-                 dev.openLive(SNAPLEN, PcapNetworkInterface.PromiscuousMode.PROMISCUOUS, READ_TIMEOUT)){
-
-            try {
-                // Setup the filter to accept only the arp packets sent back to the current
-                // host from the address of the remote host we wanted to get the mac address
-                // from.
-                receiveHandle.setFilter(
-                    "arp and src host " + remoteIpAddress.getHostAddress()
-                        + " and dst host " + localIpAddress.getHostAddress(),
-                    BpfProgram.BpfCompileMode.OPTIMIZE
-                );
-
-                CompletableFuture<MacAddress> resolutionFuture = new CompletableFuture<>();
-                PacketListener listener
-                    = packet -> {
-                    if (packet.contains(ArpPacket.class)) {
-                        ArpPacket arp = packet.get(ArpPacket.class);
-                        if (arp.getHeader().getOperation().equals(ArpOperation.REPLY)) {
-                            resolutionFuture.complete(arp.getHeader().getSrcHardwareAddr());
-                        }
-                    }
-                };
-
-                pool.execute(() -> {
-                    try {
-                        receiveHandle.loop(-1, listener);
-                    } 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();
-                    }
-                });
-
-                MacAddress localMacAddress = MacAddress.getByAddress(
-                    dev.getLinkLayerAddresses().iterator().next().getAddress());
-                ArpPacket.Builder arpBuilder = new ArpPacket.Builder();
-                arpBuilder
-                    .hardwareType(ArpHardwareType.ETHERNET)
-                    .protocolType(EtherType.IPV4)
-                    .hardwareAddrLength((byte) MacAddress.SIZE_IN_BYTES)
-                    .protocolAddrLength((byte) ByteArrays.INET4_ADDRESS_SIZE_IN_BYTES)
-                    .operation(ArpOperation.REQUEST)
-                    .srcHardwareAddr(localMacAddress)
-                    .srcProtocolAddr(localIpAddress)
-                    .dstHardwareAddr(MacAddress.ETHER_BROADCAST_ADDRESS)
-                    .dstProtocolAddr(remoteIpAddress);
-
-                EthernetPacket.Builder etherBuilder = new EthernetPacket.Builder();
-                etherBuilder.dstAddr(MacAddress.ETHER_BROADCAST_ADDRESS)
-                    .srcAddr(localMacAddress)
-                    .type(EtherType.ARP)
-                    .payloadBuilder(arpBuilder)
-                    .paddingAtBuild(true);
-
-                Packet p = etherBuilder.build();
-                sendHandle.sendPacket(p);
-                try {
-                    return resolutionFuture.get(3000, TimeUnit.MILLISECONDS);
-                } catch (TimeoutException e) {
-                    logger.info("Couldn't resolve MAC address for ip address {}", remoteIpAddress.getHostAddress(), e);
-                    return null;
-                }
-            } finally {
-                if (sendHandle.isOpen()) {
-                    sendHandle.close();
-                }
-                if (receiveHandle.isOpen()) {
-                    // Terminate the receive loop first.
-                    receiveHandle.breakLoop();
-                    receiveHandle.close();
-                }
-            }
-        } catch (InterruptedException e) {
-            Thread.currentThread().interrupt();
-            throw new PcapException("Error looking up MAC address for ip address " +
-                remoteIpAddress.getHostAddress() + " on device " + dev.getName(), e);
-        } catch (PcapNativeException | ExecutionException | NotOpenException e) {
-            throw new PcapException("Error looking up MAC address for ip address " +
-                remoteIpAddress.getHostAddress() + " on device " + dev.getName(), e);
-        }
-    }
-
-    /**
-     * Iterate through all devices and find the first that would be able to connect to the given address
-     * because it's ip address and subnet mask would allow direct communication.
-     *
-     * @param remoteAddress address we want to connect to.
-     * @return PcapNetworkInterface interface that should be able to connect to the given address.
-     * @throws PcapException something went wrong.
-     */
-    private FirstHop getFirstHop(InetAddress remoteAddress) throws PcapException {
-        byte[] remoteIp = remoteAddress.getAddress();
-
-        // Iterate over all network interfaces.
-        try {
-            // First try if we can connect to the remote device directly.
-            for (PcapNetworkInterface dev : Pcaps.findAllDevs()) {
-                // Iterate over all addresses configured for this interface.
-                for (PcapAddress localAddress : dev.getAddresses()) {
-                    if(GATEWAY_ONLY_NETMASK.equals(localAddress.getNetmask().getHostAddress())) {
-                        return new FirstHop(dev, localAddress.getAddress(),
-                            dev.getLinkLayerAddresses().iterator().next(),
-                            getMacAddress(dev, localAddress.getAddress(), remoteAddress));
-                    }
-                    // Only check addresses matching the IP-version of the remote address.
-                    if (remoteAddress.getClass().equals(localAddress.getAddress().getClass())) {
-                        byte[] localIp = localAddress.getAddress().getAddress();
-                        byte[] netMask = localAddress.getNetmask().getAddress();
-                        boolean matches = true;
-                        // Iterate over all bytes of the address and see if they match
-                        // after applying the net mask filter.
-                        for (int i = 0; i < localIp.length; i++) {
-                            if ((localIp[i] & netMask[i]) != (remoteIp[i] & netMask[i])) {
-                                matches = false;
-                                break;
-                            }
-                        }
-                        // 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(),
-                                localMacAddress,
-                                getMacAddress(dev, localAddress.getAddress(), remoteAddress));
-                        }
-                    }
-                }
-            }
-            return null;
-        } catch (PcapNativeException e) {
-            throw new PcapException("Error finding a device to communicate with remote address.", e);
-        }
-    }
-
-    /**
-     * Unfortunately there is no way to get the ip address of the default gateway the
-     * system uses to route traffic to remote networks. Luckily the 'netstat' command
-     * is available on all systems and the only difference is the output. So in this
-     * case we fallback to executing this command and parsing it's output depending on
-     * the system it is run on.
-     *
-     * @return InetAddress representing the address of the internet gateway.
-     */
-    @SuppressWarnings("squid:S1313")
-    private InetAddress getDefaultGatewayAddress() {
-        try {
-            Runtime rt = Runtime.getRuntime();
-            String[] commands = {"netstat", "-rn"};
-            Process proc = rt.exec(commands);
-
-            BufferedReader stdInput = new BufferedReader(new InputStreamReader(proc.getInputStream()));
-
-            String linePrefix;
-            int gatewayColumn;
-            if (SystemUtils.IS_OS_WINDOWS) {
-                linePrefix = "0.0.0.0";
-                gatewayColumn = 2;
-            } else if (SystemUtils.IS_OS_MAC_OSX) {
-                linePrefix = "default";
-                gatewayColumn = 1;
-            } else if (SystemUtils.IS_OS_LINUX) {
-                linePrefix = "0.0.0.0";
-                gatewayColumn = 1;
-            } else {
-                return null;
-            }
-
-            String s;
-            while ((s = stdInput.readLine()) != null) {
-                if (s.trim().startsWith(linePrefix)) {
-                    String[] columns = s.trim().split("\\s+");
-                    return InetAddress.getByName(columns[gatewayColumn]);
-                }
-            }
-        } catch (IOException e) {
-            logger.debug("error caught", e);
-            return null;
-        }
-
-        // Command on all platforms: "netstat -rn"
-
-        /* Windows 7: line.trim().startsWith("0.0.0.0")
-
-===========================================================================
-Schnittstellenliste
- 14...00 1c 42 98 16 7d ......Intel(R) PRO/1000 MT-Netzwerkverbindung #2
- 11...00 1c 42 2e f3 40 ......Intel(R) PRO/1000 MT-Netzwerkverbindung
-  1...........................Software Loopback Interface 1
- 13...00 00 00 00 00 00 00 e0 Microsoft-ISATAP-Adapter
- 12...00 00 00 00 00 00 00 e0 Teredo Tunneling Pseudo-Interface
- 15...00 00 00 00 00 00 00 e0 Microsoft-ISATAP-Adapter #2
-===========================================================================
-
-IPv4-Routentabelle
-===========================================================================
-Aktive Routen:
-     Netzwerkziel    Netzwerkmaske          Gateway    Schnittstelle Metrik
-          0.0.0.0          0.0.0.0      10.211.55.1      10.211.55.3     10
-      10.211.55.0    255.255.255.0   Auf Verbindung       10.211.55.3    266
-      10.211.55.3  255.255.255.255   Auf Verbindung       10.211.55.3    266
-    10.211.55.255  255.255.255.255   Auf Verbindung       10.211.55.3    266
-        127.0.0.0        255.0.0.0   Auf Verbindung         127.0.0.1    306
-        127.0.0.1  255.255.255.255   Auf Verbindung         127.0.0.1    306
-  127.255.255.255  255.255.255.255   Auf Verbindung         127.0.0.1    306
-      192.168.0.0      255.255.0.0   Auf Verbindung      192.168.0.43    266
-     192.168.0.43  255.255.255.255   Auf Verbindung      192.168.0.43    266
-  192.168.255.255  255.255.255.255   Auf Verbindung      192.168.0.43    266
-        224.0.0.0        240.0.0.0   Auf Verbindung         127.0.0.1    306
-        224.0.0.0        240.0.0.0   Auf Verbindung       10.211.55.3    266
-        224.0.0.0        240.0.0.0   Auf Verbindung      192.168.0.43    266
-  255.255.255.255  255.255.255.255   Auf Verbindung         127.0.0.1    306
-  255.255.255.255  255.255.255.255   Auf Verbindung       10.211.55.3    266
-  255.255.255.255  255.255.255.255   Auf Verbindung      192.168.0.43    266
-===========================================================================
-Ständige Routen:
-  Keine
-
-IPv6-Routentabelle
-===========================================================================
-Aktive Routen:
- If Metrik Netzwerkziel             Gateway
- 11    266 ::/0                     fe80::21c:42ff:fe00:18
-  1    306 ::1/128                  Auf Verbindung
- 11     18 fdb2:2c26:f4e4::/64      Auf Verbindung
- 11    266 fdb2:2c26:f4e4:0:24b4:9398:1a69:664/128
-                                    Auf Verbindung
- 11    266 fdb2:2c26:f4e4:0:7147:34d4:e033:a879/128
-                                    Auf Verbindung
- 14     18 fdb2:2c26:f4e4:1::/64    Auf Verbindung
- 14    266 fdb2:2c26:f4e4:1:797d:18a9:3dd6:8105/128
-                                    Auf Verbindung
- 14    266 fdb2:2c26:f4e4:1:bcd1:eeb5:c8c1:cf05/128
-                                    Auf Verbindung
- 11    266 fe80::/64                Auf Verbindung
- 14    266 fe80::/64                Auf Verbindung
- 11    266 fe80::7147:34d4:e033:a879/128
-                                    Auf Verbindung
- 14    266 fe80::797d:18a9:3dd6:8105/128
-                                    Auf Verbindung
-  1    306 ff00::/8                 Auf Verbindung
- 11    266 ff00::/8                 Auf Verbindung
- 14    266 ff00::/8                 Auf Verbindung
-===========================================================================
-Ständige Routen:
-  Keine
-
-
-        Windows 10
-
-===========================================================================
-Schnittstellenliste
- 14...00 1c 42 98 16 7d ......Intel(R) PRO/1000 MT-Netzwerkverbindung #2
- 11...00 1c 42 2e f3 40 ......Intel(R) PRO/1000 MT-Netzwerkverbindung
-  1...........................Software Loopback Interface 1
- 13...00 00 00 00 00 00 00 e0 Microsoft-ISATAP-Adapter
- 12...00 00 00 00 00 00 00 e0 Teredo Tunneling Pseudo-Interface
- 15...00 00 00 00 00 00 00 e0 Microsoft-ISATAP-Adapter #2
-===========================================================================
-
-IPv4-Routentabelle
-===========================================================================
-Aktive Routen:
-     Netzwerkziel    Netzwerkmaske          Gateway    Schnittstelle Metrik
-          0.0.0.0          0.0.0.0      10.211.55.1      10.211.55.3     10
-      10.211.55.0    255.255.255.0   Auf Verbindung       10.211.55.3    266
-      10.211.55.3  255.255.255.255   Auf Verbindung       10.211.55.3    266
-    10.211.55.255  255.255.255.255   Auf Verbindung       10.211.55.3    266
-        127.0.0.0        255.0.0.0   Auf Verbindung         127.0.0.1    306
-        127.0.0.1  255.255.255.255   Auf Verbindung         127.0.0.1    306
-  127.255.255.255  255.255.255.255   Auf Verbindung         127.0.0.1    306
-      192.168.0.0      255.255.0.0   Auf Verbindung      192.168.0.43    266
-     192.168.0.43  255.255.255.255   Auf Verbindung      192.168.0.43    266
-  192.168.255.255  255.255.255.255   Auf Verbindung      192.168.0.43    266
-        224.0.0.0        240.0.0.0   Auf Verbindung         127.0.0.1    306
-        224.0.0.0        240.0.0.0   Auf Verbindung       10.211.55.3    266
-        224.0.0.0        240.0.0.0   Auf Verbindung      192.168.0.43    266
-  255.255.255.255  255.255.255.255   Auf Verbindung         127.0.0.1    306
-  255.255.255.255  255.255.255.255   Auf Verbindung       10.211.55.3    266
-  255.255.255.255  255.255.255.255   Auf Verbindung      192.168.0.43    266
-===========================================================================
-Ständige Routen:
-  Keine
-
-IPv6-Routentabelle
-===========================================================================
-Aktive Routen:
- If Metrik Netzwerkziel             Gateway
- 11    266 ::/0                     fe80::21c:42ff:fe00:18
-  1    306 ::1/128                  Auf Verbindung
- 11     18 fdb2:2c26:f4e4::/64      Auf Verbindung
- 11    266 fdb2:2c26:f4e4:0:24b4:9398:1a69:664/128
-                                    Auf Verbindung
- 11    266 fdb2:2c26:f4e4:0:7147:34d4:e033:a879/128
-                                    Auf Verbindung
- 14     18 fdb2:2c26:f4e4:1::/64    Auf Verbindung
- 14    266 fdb2:2c26:f4e4:1:797d:18a9:3dd6:8105/128
-                                    Auf Verbindung
- 14    266 fdb2:2c26:f4e4:1:bcd1:eeb5:c8c1:cf05/128
-                                    Auf Verbindung
- 11    266 fe80::/64                Auf Verbindung
- 14    266 fe80::/64                Auf Verbindung
- 11    266 fe80::7147:34d4:e033:a879/128
-                                    Auf Verbindung
- 14    266 fe80::797d:18a9:3dd6:8105/128
-                                    Auf Verbindung
-  1    306 ff00::/8                 Auf Verbindung
- 11    266 ff00::/8                 Auf Verbindung
- 14    266 ff00::/8                 Auf Verbindung
-===========================================================================
-Ständige Routen:
-  Keine
-
-
-        Ubuntu: line.trim().startsWith("0.0.0.0")
-
-Kernel IP routing table
-Destination     Gateway         Genmask         Flags   MSS Window  irtt Iface
-0.0.0.0         10.211.55.1     0.0.0.0         UG        0 0          0 enp0s5
-10.211.55.0     0.0.0.0         255.255.255.0   U         0 0          0 enp0s5
-169.254.0.0     0.0.0.0         255.255.0.0     U         0 0          0 enp0s5
-
-        Mac: line.trim().startsWith("default")
-
-Routing tables
-
-Internet:
-Destination        Gateway            Flags        Refs      Use   Netif Expire
-default            10.10.56.1         UGSc          109     1893     en0
-10.10.56/24        link#9             UCS             0        0     en0
-10.10.56.1/32      link#9             UCS             3        0     en0
-10.10.56.1         0:90:7f:a2:7a:a3   UHLWIir        39       16     en0   1188
-10.10.56.8/32      link#9             UCS             1        0     en0
-10.10.56.8         8c:85:90:18:6f:a9  UHLWI           0        5     lo0
-10.37.129/24       link#22            UC              1        0   vnic1
-10.211.55/24       link#21            UC              2        0   vnic0
-10.211.55.3        0:1c:42:2e:f3:40   UHLWIi          1        0   vnic0   1120
-10.211.55.4        0:1c:42:ec:9d:4d   UHLWI           0        0   vnic0   1075
-127                127.0.0.1          UCS             0        0     lo0
-127.0.0.1          127.0.0.1          UH             26   320774     lo0
-169.254            link#9             UCS             1        0     en0
-169.254            link#7             UCSI            0        0     en7
-169.254            link#20            UCSI            1        0     en8
-169.254.233.80/32  link#20            UCS             0        0     en8
-169.254.255.255    link#9             UHLSW           6       30     en0
-192.168.0/16       link#7             UCS             1        0     en7
-192.168.0.99/32    link#7             UCS             1        0     en7
-192.168.42.1       link#7             UHLWIi          1       10     en7
-224.0.0/4          link#9             UmCS            3        0     en0
-224.0.0/4          link#7             UmCSI           1        0     en7
-224.0.0/4          link#20            UmCSI           1        0     en8
-224.0.0.251        1:0:5e:0:0:fb      UHmLWI          0      106     en0
-224.0.0.252        1:0:5e:0:0:fc      UHmLWI          0       32     en0
-239.255.255.250    1:0:5e:7f:ff:fa    UHmLWI          0      124     en7
-239.255.255.250    1:0:5e:7f:ff:fa    UHmLWI          0      682     en0
-239.255.255.250    1:0:5e:7f:ff:fa    UHmLWI          0       64     en8
-255.255.255.255/32 link#9             UCS             0        0     en0
-255.255.255.255/32 link#7             UCSI            0        0     en7
-255.255.255.255/32 link#20            UCSI            0        0     en8
-
-Internet6:
-Destination                             Gateway                         Flags         Netif Expire
-default                                 fe80::%utun0                    UGcI          utun0
-default                                 fe80::%utun1                    UGcI          utun1
-::1                                     ::1                             UHL             lo0
-fe80::%lo0/64                           fe80::1%lo0                     UcI             lo0
-fe80::1%lo0                             link#1                          UHLI            lo0
-fe80::%en7/64                           link#7                          UCI             en7
-fe80::4a8:61b9:6131:3848%en7            48:65:ee:12:d2:c7               UHLI            lo0
-fe80::%en5/64                           link#8                          UCI             en5
-fe80::aede:48ff:fe00:1122%en5           ac:de:48:0:11:22                UHLI            lo0
-fe80::aede:48ff:fe33:4455%en5           ac:de:48:33:44:55               UHLWIi          en5
-fe80::%en0/64                           link#9                          UCI             en0
-fe80::10cf:c2ea:7baa:626b%en0           8c:85:90:18:6f:a9               UHLI            lo0
-fe80::%awdl0/64                         link#11                         UCI           awdl0
-fe80::cbd:62ff:fe3e:406c%awdl0          e:bd:62:3e:40:6c                UHLI            lo0
-fe80::%utun0/64                         fe80::3a17:f866:7728:6e8d%utun0 UcI           utun0
-fe80::3a17:f866:7728:6e8d%utun0         link#17                         UHLI            lo0
-fe80::%utun1/64                         fe80::eb7a:3ecf:562c:167b%utun1 UcI           utun1
-fe80::eb7a:3ecf:562c:167b%utun1         link#18                         UHLI            lo0
-fe80::%en8/64                           link#20                         UCI             en8
-fe80::415:f342:498d:14d2%en8            42:4d:7f:8a:b3:83               UHLI            lo0
-ff01::%lo0/32                           ::1                             UmCI            lo0
-ff01::%en7/32                           link#7                          UmCI            en7
-ff01::%en5/32                           link#8                          UmCI            en5
-ff01::%en0/32                           link#9                          UmCI            en0
-ff01::%awdl0/32                         link#11                         UmCI          awdl0
-ff01::%utun0/32                         fe80::3a17:f866:7728:6e8d%utun0 UmCI          utun0
-ff01::%utun1/32                         fe80::eb7a:3ecf:562c:167b%utun1 UmCI          utun1
-ff01::%en8/32                           link#20                         UmCI            en8
-ff02::%lo0/32                           ::1                             UmCI            lo0
-ff02::%en7/32                           link#7                          UmCI            en7
-ff02::%en5/32                           link#8                          UmCI            en5
-ff02::%en0/32                           link#9                          UmCI            en0
-ff02::%awdl0/32                         link#11                         UmCI          awdl0
-ff02::%utun0/32                         fe80::3a17:f866:7728:6e8d%utun0 UmCI          utun0
-ff02::%utun1/32                         fe80::eb7a:3ecf:562c:167b%utun1 UmCI          utun1
-ff02::%en8/32                           link#20                         UmCI            en8
-
-
-         */
-        return null;
-    }
-
-    private static class FirstHop {
-        private final PcapNetworkInterface networkInterface;
-        private final InetAddress localInetAddress;
-        private final LinkLayerAddress localMacAddress;
-        private final LinkLayerAddress remoteMacAddress;
-
-        private FirstHop(PcapNetworkInterface networkInterface, InetAddress localInetAddress, LinkLayerAddress localMacAddress,
-                         LinkLayerAddress remoteMacAddress) {
-            this.networkInterface = networkInterface;
-            this.localInetAddress = localInetAddress;
-            this.localMacAddress = localMacAddress;
-            this.remoteMacAddress = remoteMacAddress;
-        }
-    }
-
-}
diff --git a/plc4j/utils/raw-sockets/src/main/java/org/apache/plc4x/java/utils/rawsockets/attic/RawSocketListener.java b/plc4j/utils/raw-sockets/src/main/java/org/apache/plc4x/java/utils/rawsockets/attic/RawSocketListener.java
deleted file mode 100644
index ffad78e..0000000
--- a/plc4j/utils/raw-sockets/src/main/java/org/apache/plc4x/java/utils/rawsockets/attic/RawSocketListener.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * Copyright 2014 The Netty Project
- *
- * The Netty Project licenses this file to you under the Apache License,
- * version 2.0 (the "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at:
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.plc4x.java.utils.rawsockets.attic;
-
-public interface RawSocketListener {
-
-    void packetReceived(byte[] rawData);
-
-}
diff --git a/plc4j/utils/raw-sockets/src/test/java/org/apache/plc4x/java/utils/rawsockets/attic/RawIpSocketTest.java b/plc4j/utils/raw-sockets/src/test/java/org/apache/plc4x/java/utils/rawsockets/attic/RawIpSocketTest.java
deleted file mode 100644
index 7c85f49..0000000
--- a/plc4j/utils/raw-sockets/src/test/java/org/apache/plc4x/java/utils/rawsockets/attic/RawIpSocketTest.java
+++ /dev/null
@@ -1,96 +0,0 @@
-/*
- * Copyright 2014 The Netty Project
- *
- * The Netty Project licenses this file to you under the Apache License,
- * version 2.0 (the "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at:
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.plc4x.java.utils.rawsockets.attic;
-
-import org.apache.plc4x.test.RequirePcap;
-import org.junit.jupiter.api.Disabled;
-import org.junit.jupiter.api.Test;
-import org.pcap4j.core.PcapAddress;
-import org.pcap4j.core.PcapNetworkInterface;
-import org.pcap4j.core.Pcaps;
-
-import java.net.Inet4Address;
-import java.util.Arrays;
-import java.util.concurrent.CompletableFuture;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.TimeoutException;
-
-import static org.junit.jupiter.api.Assertions.assertNotNull;
-import static org.junit.jupiter.api.Assertions.fail;
-
-public class RawIpSocketTest {
-
-    @Test
-    @Disabled("Need to make tests run in Docker container first as this test requires libpcap or the entrie application to be run as 'root'")
-    @RequirePcap
-    public void testPingPacket() throws Exception {
-        // Protocol number 1 = ICMP (Ping)
-        RawIpSocket rawIpSocket = new RawIpSocket(1);
-
-        CompletableFuture<Boolean> result = new CompletableFuture<>();
-        // Simply print the result to the console
-        rawIpSocket.addListener(rawData -> {
-            System.out.println("Got response:");
-            System.out.println(Arrays.toString(rawData));
-            result.complete(true);
-        });
-
-        // Connect to the remote address
-        // This doesn't really connect in the usual sense, it
-        // does the ARP MAC address lookup and sets up the listener
-        // to accept packets sent from that mac address to the
-        // current machines with the given IP protocol id.
-        // In this test we simply look for a real network device
-        // (The loopback device doesn't have a MAC address)
-        // and ping itself.
-        for (PcapNetworkInterface dev : Pcaps.findAllDevs()) {
-            System.out.println("Trying to read on device " + dev);
-            if (!dev.getLinkLayerAddresses().isEmpty()) {
-                for (PcapAddress pcapAddress : dev.getAddresses()) {
-                    if (pcapAddress.getAddress() instanceof Inet4Address) {
-                        System.out.println("Trying to connect on PcapAddress " + pcapAddress);
-                        rawIpSocket.connect("plc4x.apache.org");
-                    }
-                }
-            }
-        }
-        // On travis we won't have any interface at all so we don't need to run there
-        assertNotNull(rawIpSocket);
-
-        // Simple ICMP (Ping packet)
-        byte[] rawData = new byte[]{
-            // Type (ICMP Ping Request) & Code (just 0)
-            (byte) 0x08, (byte) 0x00,
-            // Checksum
-            (byte) 0xe3, (byte) 0xe5,
-            // Identifier
-            (byte) 0x00, (byte) 0x01,
-            // Sequence Number
-            (byte) 0x00, (byte) 0x00,
-            // Payload (Just random data that was used to fit to the checksum)
-            (byte) 0x00, (byte) 0x01, (byte) 0x02, (byte) 0x03, (byte) 0x04, (byte) 0x05, (byte) 0x06, (byte) 0x07, (byte) 0x08, (byte) 0x09};
-
-        // Write the raw packet to the remote host.
-        rawIpSocket.write(rawData);
-
-        try {
-            result.get(3, TimeUnit.SECONDS);
-        } catch (TimeoutException e) {
-            fail("Request timed out.");
-        }
-    }
-
-}