This is an automated email from the ASF dual-hosted git repository. cdutz pushed a commit to branch fix/cdutz/reenable-golang-driver-testsuites in repository https://gitbox.apache.org/repos/asf/plc4x.git
commit b6b336122408203b98c9ed85b4cd516d2c5667df Author: Christofer Dutz <[email protected]> AuthorDate: Mon Feb 20 08:07:32 2023 +0100 chore(driver/eip): Minor updates to the Java version of the EIP driver --- .../org/apache/plc4x/java/eip/base/EIPDriver.java | 14 ++--- .../java/eip/base/protocol/EipProtocolLogic.java | 61 ++++++++-------------- 2 files changed, 30 insertions(+), 45 deletions(-) diff --git a/plc4j/drivers/eip/src/main/java/org/apache/plc4x/java/eip/base/EIPDriver.java b/plc4j/drivers/eip/src/main/java/org/apache/plc4x/java/eip/base/EIPDriver.java index 26904599e1..6859e87df1 100644 --- a/plc4j/drivers/eip/src/main/java/org/apache/plc4x/java/eip/base/EIPDriver.java +++ b/plc4j/drivers/eip/src/main/java/org/apache/plc4x/java/eip/base/EIPDriver.java @@ -25,7 +25,6 @@ import org.apache.plc4x.java.eip.base.configuration.EIPConfiguration; import org.apache.plc4x.java.eip.base.tag.EipTag; import org.apache.plc4x.java.eip.base.protocol.EipProtocolLogic; import org.apache.plc4x.java.eip.base.tag.EipTagHandler; -import org.apache.plc4x.java.eip.logix.LogixDriver; import org.apache.plc4x.java.eip.readwrite.EipPacket; import org.apache.plc4x.java.eip.readwrite.IntegerEncoding; import org.apache.plc4x.java.spi.configuration.ConfigurationFactory; @@ -106,7 +105,7 @@ public class EIPDriver extends GeneratedDriverBase<EipPacket> { .withProtocol(EipProtocolLogic.class) .withPacketSizeEstimator(ByteLengthEstimator.class) .withParserArgs(IntegerEncoding.BIG_ENDIAN, true) - .withCorruptPacketRemover(LogixDriver.CorruptPackageCleaner.class) + .withCorruptPacketRemover(CorruptPackageCleaner.class) .bigEndian() .build(); } else { @@ -114,7 +113,7 @@ public class EIPDriver extends GeneratedDriverBase<EipPacket> { .withProtocol(EipProtocolLogic.class) .withPacketSizeEstimator(ByteLengthEstimator.class) .withParserArgs(IntegerEncoding.LITTLE_ENDIAN, true) - .withCorruptPacketRemover(LogixDriver.CorruptPackageCleaner.class) + .withCorruptPacketRemover(CorruptPackageCleaner.class) .littleEndian() .build(); } @@ -209,13 +208,16 @@ public class EIPDriver extends GeneratedDriverBase<EipPacket> { } /** Estimate the Length of a Packet */ - public static class ByteLengthEstimator implements ToIntFunction<ByteBuf> { + public class ByteLengthEstimator implements ToIntFunction<ByteBuf> { @Override public int applyAsInt(ByteBuf byteBuf) { if (byteBuf.readableBytes() >= 4) { //Second byte for the size and then add the header size 24 - int size = byteBuf.getUnsignedShort(byteBuf.readerIndex()+2)+24; - return size; + if (configuration.getByteOrder() == IntegerEncoding.BIG_ENDIAN) { + return byteBuf.getUnsignedShort(byteBuf.readerIndex() + 2) + 24; + } else { + return byteBuf.getUnsignedShortLE(byteBuf.readerIndex() + 2) + 24; + } } return -1; } diff --git a/plc4j/drivers/eip/src/main/java/org/apache/plc4x/java/eip/base/protocol/EipProtocolLogic.java b/plc4j/drivers/eip/src/main/java/org/apache/plc4x/java/eip/base/protocol/EipProtocolLogic.java index 9cf8021d10..f53cde2fc2 100644 --- a/plc4j/drivers/eip/src/main/java/org/apache/plc4x/java/eip/base/protocol/EipProtocolLogic.java +++ b/plc4j/drivers/eip/src/main/java/org/apache/plc4x/java/eip/base/protocol/EipProtocolLogic.java @@ -74,7 +74,7 @@ public class EipProtocolLogic extends Plc4xProtocolBase<EipPacket> implements Ha private boolean useMessageRouter = false; - private List<PathSegment> routingAddress = new ArrayList<>(); + private final List<PathSegment> routingAddress = new ArrayList<>(); short connectionPathSize = 0; private final int connectionSerialNumber = ThreadLocalRandom.current().nextInt(); @@ -164,6 +164,7 @@ public class EipProtocolLogic extends Plc4xProtocolBase<EipPacket> implements Ha private void listServices(ConversationContext<EipPacket> context) { logger.debug("Sending List Services packet to confirm CIP Encapsulation is available"); + // TODO: It seems that we're only doing this request in order to find out, if we can do CIP encapsulation, however this value is never really used anywhere. ListServicesRequest listServicesRequest = new ListServicesRequest( EMPTY_SESSION_HANDLE, CIPStatus.Success.getValue(), @@ -253,7 +254,6 @@ public class EipProtocolLogic extends Plc4xProtocolBase<EipPacket> implements Ha } else { throw new PlcRuntimeException("Got status code while polling for supported CIP services [" + p.getStatus() + "]"); } - }); } @@ -319,7 +319,7 @@ public class EipProtocolLogic extends Plc4xProtocolBase<EipPacket> implements Ha true, this.configuration.getByteOrder() ), - (long) 2113537, + 2113537L, new NetworkConnectionParameters( 4002, false, @@ -331,7 +331,7 @@ public class EipProtocolLogic extends Plc4xProtocolBase<EipPacket> implements Ha new TransportType(true, (byte) 2, (byte) 3, this.configuration.getByteOrder()), this.connectionPathSize, this.routingAddress, - (int) 0, + 0, this.configuration.getByteOrder() ), this.configuration.getByteOrder() @@ -524,6 +524,7 @@ public class EipProtocolLogic extends Plc4xProtocolBase<EipPacket> implements Ha } } + // TODO: This seems to be blocking here ... we should probably do this asynchronously PlcReadResponse readResponse = new DefaultPlcReadResponse(readRequest, values); future.complete(readResponse); @@ -656,7 +657,6 @@ public class EipProtocolLogic extends Plc4xProtocolBase<EipPacket> implements Ha } Services services = new Services(offsets, requests, -1, this.configuration.getByteOrder()); MultipleServiceRequest serviceRequest = new MultipleServiceRequest(services, services.getLengthInBytes(), this.configuration.getByteOrder()); - int ss = serviceRequest.getLengthInBytes(); typeIds.add(new ConnectedDataItem(this.sequenceCount, serviceRequest, this.configuration.getByteOrder())); } @@ -712,7 +712,6 @@ public class EipProtocolLogic extends Plc4xProtocolBase<EipPacket> implements Ha final Pattern RESOURCE_ADDRESS_PATTERN = Pattern.compile("([.\\[\\]])*([A-Za-z_0-9]+){1}"); Matcher matcher = RESOURCE_ADDRESS_PATTERN.matcher(tag); List<PathSegment> segments = new LinkedList<>(); - String tagWithoutQualifiers = ""; int lengthBytes = 0; while (matcher.find()) { String identifier = matcher.group(2); @@ -728,12 +727,10 @@ public class EipProtocolLogic extends Plc4xProtocolBase<EipPacket> implements Ha default: newSegment = new DataSegment(new AnsiExtendedSymbolSegment(identifier, (short) 0, order), order); segments.add(newSegment); - tagWithoutQualifiers += identifier; } } else { newSegment = new DataSegment(new AnsiExtendedSymbolSegment(identifier, (short) 0, order), order); segments.add(newSegment); - tagWithoutQualifiers += identifier; } lengthBytes += newSegment.getLengthInBytes(); @@ -743,7 +740,7 @@ public class EipProtocolLogic extends Plc4xProtocolBase<EipPacket> implements Ha for (PathSegment segment : segments) { segment.serialize(buffer); } - return buffer.getData(); + return buffer.getBytes(); } private PlcReadResponse decodeReadResponse(CipService p, PlcReadRequest readRequest) { @@ -769,7 +766,7 @@ public class EipProtocolLogic extends Plc4xProtocolBase<EipPacket> implements Ha int nb = responses.getServiceNb(); List<CipService> arr = new ArrayList<>(nb); ReadBufferByteBased read = new ReadBufferByteBased(responses.getServicesData(), org.apache.plc4x.java.spi.generation.ByteOrder.LITTLE_ENDIAN); - int total = (int) read.getTotalBytes(); + int total = read.getTotalBytes(); for (int i = 0; i < nb; i++) { int length = 0; int offset = responses.getOffsets().get(i) - responses.getOffsets().get(0); //Substract first offset as we only have the service in the buffer (not servicesNb and offsets) @@ -778,8 +775,7 @@ public class EipProtocolLogic extends Plc4xProtocolBase<EipPacket> implements Ha } else { length = responses.getOffsets().get(i + 1) - offset - responses.getOffsets().get(0); //Calculate length with offsets (substracting first offset) } - ReadBuffer serviceBuf = new ReadBufferByteBased(read.getBytes(offset, offset + length), org.apache.plc4x.java.spi.generation.ByteOrder.LITTLE_ENDIAN); - CipService service = null; + CipService service; try { service = CipService.staticParse(read, false, length, this.configuration.getByteOrder()); arr.add(service); @@ -862,8 +858,8 @@ public class EipProtocolLogic extends Plc4xProtocolBase<EipPacket> implements Ha index += type.getSize(); break; case STRUCTURED: { - Short structuredType = Short.reverseBytes(data.getShort(0)); - Short structuredLen = Short.reverseBytes(data.getShort(STRING_LEN_OFFSET)); + short structuredType = Short.reverseBytes(data.getShort(0)); + short structuredLen = Short.reverseBytes(data.getShort(STRING_LEN_OFFSET)); if (structuredType == CIPStructTypeCode.STRING.getValue()) { // Length offset is 2, data offset is 6 list.add(new PlcSTRING(StandardCharsets @@ -875,6 +871,7 @@ public class EipProtocolLogic extends Plc4xProtocolBase<EipPacket> implements Ha // TODO: return as type STRUCT with structuredType to let user // apps/progs handle it. } + // TODO: This will fall-though to "default" } default: return null; @@ -898,8 +895,8 @@ public class EipProtocolLogic extends Plc4xProtocolBase<EipPacket> implements Ha case STRING36: case STRING: case STRUCTURED: { - Short structuredType = Short.reverseBytes(data.getShort(0)); - Short structuredLen = Short.reverseBytes(data.getShort(STRING_LEN_OFFSET)); + short structuredType = Short.reverseBytes(data.getShort(0)); + short structuredLen = Short.reverseBytes(data.getShort(STRING_LEN_OFFSET)); if (structuredType == CIPStructTypeCode.STRING.getValue()) { // Length offset is 2, data offset is 6 return new PlcSTRING(StandardCharsets @@ -908,6 +905,7 @@ public class EipProtocolLogic extends Plc4xProtocolBase<EipPacket> implements Ha else { // This is a different type of STRUCTURED data } + // TODO: This will fall-though to "default" } default: return null; @@ -936,10 +934,7 @@ public class EipProtocolLogic extends Plc4xProtocolBase<EipPacket> implements Ha final EipTag field = (EipTag) request.getTag(fieldName); final PlcValue value = request.getPlcValue(fieldName); String tag = field.getTag(); - int elements = 1; - if (field.getElementNb() > 1) { - elements = field.getElementNb(); - } + int elements = Math.max(field.getElementNb(), 1); byte[] data = encodeValue(value, field.getType(), (short) elements); CipWriteRequest writeReq = null; @@ -1008,6 +1003,7 @@ public class EipProtocolLogic extends Plc4xProtocolBase<EipPacket> implements Ha } } + // TODO: This seems to be blocking here ... we should probably do this asynchronously PlcWriteResponse response = new DefaultPlcWriteResponse(writeRequest, values); future.complete(response); return future; @@ -1021,10 +1017,7 @@ public class EipProtocolLogic extends Plc4xProtocolBase<EipPacket> implements Ha final EipTag field = (EipTag) request.getTag(fieldName); final PlcValue value = request.getPlcValue(fieldName); String tag = field.getTag(); - int elements = 1; - if (field.getElementNb() > 1) { - elements = field.getElementNb(); - } + int elements = Math.max(field.getElementNb(), 1); byte[] data = encodeValue(value, field.getType(), (short) elements); try { @@ -1170,10 +1163,7 @@ public class EipProtocolLogic extends Plc4xProtocolBase<EipPacket> implements Ha final EipTag field = (EipTag) request.getTag(fieldName); final PlcValue value = request.getPlcValue(fieldName); String tag = field.getTag(); - int elements = 1; - if (field.getElementNb() > 1) { - elements = field.getElementNb(); - } + int elements = Math.max(field.getElementNb(), 1); byte[] data = encodeValue(value, field.getType(), (short) elements); try { @@ -1245,9 +1235,6 @@ public class EipProtocolLogic extends Plc4xProtocolBase<EipPacket> implements Ha Services data = new Services(offsets, serviceArr, -1, this.configuration.getByteOrder()); //Encapsulate the data - PathSegment classSegment = new LogicalSegment(new ClassID((byte) 0, (short) 6, this.configuration.getByteOrder()), this.configuration.getByteOrder()); - PathSegment instanceSegment = new LogicalSegment(new InstanceID((byte) 0, (short) 1, this.configuration.getByteOrder()), this.configuration.getByteOrder()); - ConnectedDataItem exchange = new ConnectedDataItem( this.sequenceCount, new MultipleServiceRequest(data, -1, this.configuration.getByteOrder()), @@ -1317,7 +1304,6 @@ public class EipProtocolLogic extends Plc4xProtocolBase<EipPacket> implements Ha if (p instanceof CipWriteResponse) { CipWriteResponse resp = (CipWriteResponse) p; String fieldName = writeRequest.getTagNames().iterator().next(); - EipTag field = (EipTag) writeRequest.getTag(fieldName); responses.put(fieldName, decodeResponseCode(resp.getStatus())); return new DefaultPlcWriteResponse(writeRequest, responses); } else if (p instanceof MultipleServiceResponse) { @@ -1325,17 +1311,16 @@ public class EipProtocolLogic extends Plc4xProtocolBase<EipPacket> implements Ha int nb = resp.getServiceNb(); List<CipService> arr = new ArrayList<>(nb); ReadBufferByteBased read = new ReadBufferByteBased(resp.getServicesData()); - int total = (int) read.getTotalBytes(); + int total = read.getTotalBytes(); for (int i = 0; i < nb; i++) { - int length = 0; + int length; int offset = resp.getOffsets().get(i); if (offset == nb - 1) { length = total - offset; //Get the rest if last } else { length = resp.getOffsets().get(i + 1) - offset; //Calculate length with offsets } - ReadBuffer serviceBuf = new ReadBufferByteBased(read.getBytes(offset, length), org.apache.plc4x.java.spi.generation.ByteOrder.LITTLE_ENDIAN); - CipService service = null; + CipService service; try { service = CipService.staticParse(read, false, length, this.configuration.getByteOrder()); arr.add(service); @@ -1347,8 +1332,6 @@ public class EipProtocolLogic extends Plc4xProtocolBase<EipPacket> implements Ha Iterator<String> it = writeRequest.getTagNames().iterator(); for (int i = 0; i < nb && it.hasNext(); i++) { String fieldName = it.next(); - EipTag field = (EipTag) writeRequest.getTag(fieldName); - PlcValue plcValue = null; if (services.getServices().get(i) instanceof CipWriteResponse) { CipWriteResponse writeResponse = (CipWriteResponse) services.getServices().get(i); PlcResponseCode code = decodeResponseCode(writeResponse.getStatus()); @@ -1409,6 +1392,6 @@ public class EipProtocolLogic extends Plc4xProtocolBase<EipPacket> implements Ha @Override public void close(ConversationContext<EipPacket> context) { - return; } + }
