You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@plc4x.apache.org by ld...@apache.org on 2020/05/11 11:29:13 UTC

[plc4x] branch feature/profinet updated: Make ethernet sender field configurable.

This is an automated email from the ASF dual-hosted git repository.

ldywicki pushed a commit to branch feature/profinet
in repository https://gitbox.apache.org/repos/asf/plc4x.git


The following commit(s) were added to refs/heads/feature/profinet by this push:
     new 64985bd  Make ethernet sender field configurable.
64985bd is described below

commit 64985bd4b9fa4f4d99f05fe9df8a4c41218561ff
Author: Ɓukasz Dywicki <lu...@code-house.org>
AuthorDate: Mon May 11 13:28:33 2020 +0200

    Make ethernet sender field configurable.
    
    It should be read from interface name, but for now its fine.
---
 sandbox/test-java-profinet-driver/pom.xml          |  5 +++
 .../java/profinet/dcp/ProfinetDCPPlcDriver.java    |  2 +-
 .../dcp/configuration/ProfinetConfiguration.java   | 40 ++++++++++++++++++++++
 .../dcp/protocol/ProfinetDCPProtocolLogic.java     | 15 ++++++--
 4 files changed, 58 insertions(+), 4 deletions(-)

diff --git a/sandbox/test-java-profinet-driver/pom.xml b/sandbox/test-java-profinet-driver/pom.xml
index ff10fcc..af07ecb 100644
--- a/sandbox/test-java-profinet-driver/pom.xml
+++ b/sandbox/test-java-profinet-driver/pom.xml
@@ -108,6 +108,11 @@
       <version>1.0.2.RELEASE</version>
     </dependency>
 
+    <dependency>
+      <groupId>commons-codec</groupId>
+      <artifactId>commons-codec</artifactId>
+    </dependency>
+
     <!-- Logging -->
     <dependency>
       <groupId>org.slf4j</groupId>
diff --git a/sandbox/test-java-profinet-driver/src/main/java/org/apache/plc4x/java/profinet/dcp/ProfinetDCPPlcDriver.java b/sandbox/test-java-profinet-driver/src/main/java/org/apache/plc4x/java/profinet/dcp/ProfinetDCPPlcDriver.java
index 1c611ed..b3d77b4 100644
--- a/sandbox/test-java-profinet-driver/src/main/java/org/apache/plc4x/java/profinet/dcp/ProfinetDCPPlcDriver.java
+++ b/sandbox/test-java-profinet-driver/src/main/java/org/apache/plc4x/java/profinet/dcp/ProfinetDCPPlcDriver.java
@@ -96,7 +96,7 @@ public class ProfinetDCPPlcDriver extends GeneratedDriverBase<EthernetFrame> {
 
 
     public static void main(String[] args) throws Exception {
-        PlcConnection connection = new PlcDriverManager().getConnection("profinet-dcp:raw://ens2f1");
+        PlcConnection connection = new PlcDriverManager().getConnection("profinet-dcp:raw://ens2f1?sender=00:10:18:6c:4c:e2");
         //connection.connect();
     }
 
diff --git a/sandbox/test-java-profinet-driver/src/main/java/org/apache/plc4x/java/profinet/dcp/configuration/ProfinetConfiguration.java b/sandbox/test-java-profinet-driver/src/main/java/org/apache/plc4x/java/profinet/dcp/configuration/ProfinetConfiguration.java
index c9c87c7..2b7ed59 100644
--- a/sandbox/test-java-profinet-driver/src/main/java/org/apache/plc4x/java/profinet/dcp/configuration/ProfinetConfiguration.java
+++ b/sandbox/test-java-profinet-driver/src/main/java/org/apache/plc4x/java/profinet/dcp/configuration/ProfinetConfiguration.java
@@ -18,13 +18,33 @@
  */
 package org.apache.plc4x.java.profinet.dcp.configuration;
 
+import java.util.stream.Stream;
+import org.apache.commons.lang3.ArrayUtils;
+import org.apache.plc4x.java.profinet.dcp.readwrite.MacAddress;
 import org.apache.plc4x.java.spi.configuration.Configuration;
+import org.apache.plc4x.java.spi.configuration.ConfigurationParameterConverter;
+import org.apache.plc4x.java.spi.configuration.annotations.ConfigurationParameter;
+import org.apache.plc4x.java.spi.configuration.annotations.ParameterConverter;
+import org.apache.plc4x.java.spi.configuration.annotations.Required;
 import org.apache.plc4x.java.transport.rawsocket.RawSocketTransportConfiguration;
 import org.apache.plc4x.java.utils.pcap.netty.handlers.PacketHandler;
 import org.pcap4j.packet.Packet;
 
 public class ProfinetConfiguration implements Configuration, RawSocketTransportConfiguration {
 
+    @Required
+    @ConfigurationParameter
+    @ParameterConverter(MacAddressConverter.class)
+    protected MacAddress sender;
+
+    public void setSender(MacAddress sender) {
+        this.sender = sender;
+    }
+
+    public MacAddress getSender() {
+        return sender;
+    }
+
     @Override
     public boolean getSupportVlans() {
         return false;
@@ -50,4 +70,24 @@ public class ProfinetConfiguration implements Configuration, RawSocketTransportC
             }
         };
     }
+
+    public static class MacAddressConverter implements ConfigurationParameterConverter<MacAddress> {
+        @Override
+        public Class<MacAddress> getType() {
+            return MacAddress.class;
+        }
+
+        @Override
+        public MacAddress convert(String value) {
+            String[] split = value.split(":");
+            short[] segments = ArrayUtils.toPrimitive(Stream.of(split).map(segment -> Integer.parseInt(segment, 16))
+                .map(Integer::shortValue).toArray(Short[]::new));
+
+            if (segments.length != 6) {
+                throw new IllegalArgumentException("Value " + value + " is not valid MAC address");
+            }
+
+            return new MacAddress(segments[0], segments[1], segments[2], segments[3], segments[4], segments[5]);
+        }
+    }
 }
diff --git a/sandbox/test-java-profinet-driver/src/main/java/org/apache/plc4x/java/profinet/dcp/protocol/ProfinetDCPProtocolLogic.java b/sandbox/test-java-profinet-driver/src/main/java/org/apache/plc4x/java/profinet/dcp/protocol/ProfinetDCPProtocolLogic.java
index dd170ce..e4921f2 100644
--- a/sandbox/test-java-profinet-driver/src/main/java/org/apache/plc4x/java/profinet/dcp/protocol/ProfinetDCPProtocolLogic.java
+++ b/sandbox/test-java-profinet-driver/src/main/java/org/apache/plc4x/java/profinet/dcp/protocol/ProfinetDCPProtocolLogic.java
@@ -20,6 +20,7 @@ package org.apache.plc4x.java.profinet.dcp.protocol;
 
 import java.time.Duration;
 import java.util.concurrent.atomic.AtomicInteger;
+import org.apache.plc4x.java.profinet.dcp.configuration.ProfinetConfiguration;
 import org.apache.plc4x.java.profinet.dcp.readwrite.AllSelector;
 import org.apache.plc4x.java.profinet.dcp.readwrite.DCPBlock;
 import org.apache.plc4x.java.profinet.dcp.readwrite.DcpIdentRequestPDU;
@@ -36,22 +37,29 @@ import org.apache.plc4x.java.profinet.dcp.readwrite.types.DCPServiceType;
 import org.apache.plc4x.java.profinet.dcp.readwrite.types.FrameType;
 import org.apache.plc4x.java.spi.ConversationContext;
 import org.apache.plc4x.java.spi.Plc4xProtocolBase;
+import org.apache.plc4x.java.spi.configuration.HasConfiguration;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 /**
  * Driver logic for handling Profinet-DCP packets.
  */
-public class ProfinetDCPProtocolLogic extends Plc4xProtocolBase<EthernetFrame> {
+public class ProfinetDCPProtocolLogic extends Plc4xProtocolBase<EthernetFrame> implements
+    HasConfiguration<ProfinetConfiguration> {
 
     public static MacAddress PROFINET_BROADCAST = createAddress(0x01, 0x0E, 0xCF, 0x00, 0x00, 0x00);
-    public static MacAddress TEST_ADDRESS = createAddress(0x08, 0x00, 0x27, 0x10, 0xFF, 0x10);
     public static int PN_DCP = 0x8892;
 
     public static final Duration REQUEST_TIMEOUT = Duration.ofMillis(10000);
     private final Logger logger = LoggerFactory.getLogger(ProfinetDCPProtocolLogic.class);
 
     private AtomicInteger invokeId = new AtomicInteger(0);
+    private ProfinetConfiguration configuration;
+
+    @Override
+    public void setConfiguration(ProfinetConfiguration configuration) {
+        this.configuration = configuration;
+    }
 
     @Override
     public void onConnect(ConversationContext<EthernetFrame> context) {
@@ -63,7 +71,7 @@ public class ProfinetDCPProtocolLogic extends Plc4xProtocolBase<EthernetFrame> {
         int dcpDataLength = blocks[0].getLengthInBytes();
 
         DcpIdentRequestPDU requestPDU = new DcpIdentRequestPDU(serviceId, serviceType, xid, responseDelay, dcpDataLength, blocks);
-        EthernetFrame ethernetFrame = new EthernetFrame(PROFINET_BROADCAST, TEST_ADDRESS, PN_DCP,
+        EthernetFrame ethernetFrame = new EthernetFrame(PROFINET_BROADCAST, configuration.getSender(), PN_DCP,
             new ProfinetFrame(FrameType.IDENTIFY_MULTICAST_REQUEST, requestPDU));
 
         // this is broadcast thus reply might come from multiple participants
@@ -117,4 +125,5 @@ public class ProfinetDCPProtocolLogic extends Plc4xProtocolBase<EthernetFrame> {
     public final static MacAddress createAddress(int octet1, int octet2, int octet3, int octet4, int octet5, int octet6) {
         return new MacAddress((short) octet1, (short) octet2, (short) octet3, (short) octet4, (short) octet5, (short) octet6);
     }
+
 }