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 2023/02/23 20:33:50 UTC

[plc4x] 03/03: chore(driver/eip): Continued getting the ParserSerializer tests working in Go for EIP

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 1f5fbd5f21e988182a79d08f84dd7d268fb6899b
Author: Christofer Dutz <ch...@c-ware.de>
AuthorDate: Thu Feb 23 21:33:35 2023 +0100

    chore(driver/eip): Continued getting the ParserSerializer tests working in Go for EIP
---
 .../testing/protocols/eip/DriverTestsuite.xml      |   2 +-
 .../eip/ParserSerializerTestsuiteLittleEndian.xml  |   2 +-
 .../bacnetip/readwrite/model/BACnetVendorId.go     |  32 +++
 .../eip/readwrite/model/CIPDataTypeCode.go         | 276 ++++++++++++++++++++-
 plc4go/spi/utils/WriteBufferByteBased.go           |  31 +--
 .../java/bacnetip/readwrite/BACnetVendorId.java    |   2 +
 .../plc4x/java/eip/readwrite/CIPDataTypeCode.java  |  27 +-
 .../java/eip/base/protocol/EipProtocolLogic.java   |   6 +-
 .../eip/src/main/resources/protocols/eip/eip.mspec |  28 ++-
 .../resources/protocols/eip/DriverTestsuite.xml    |   2 +-
 .../eip/ParserSerializerTestsuiteLittleEndian.xml  |   2 +-
 11 files changed, 366 insertions(+), 44 deletions(-)

diff --git a/plc4go/assets/testing/protocols/eip/DriverTestsuite.xml b/plc4go/assets/testing/protocols/eip/DriverTestsuite.xml
index d8e9f8b3c6..66d1049691 100644
--- a/plc4go/assets/testing/protocols/eip/DriverTestsuite.xml
+++ b/plc4go/assets/testing/protocols/eip/DriverTestsuite.xml
@@ -376,7 +376,7 @@
                         <data>
                           <CIPData>
                             <dataType>
-                              <CIPDataTypeCode dataType="uint" bitLength="16" stringRepresentation="STRING36">672</CIPDataTypeCode>
+                              <CIPDataTypeCode dataType="uint" bitLength="16" stringRepresentation="STRUCTURED">672</CIPDataTypeCode>
                             </dataType>
                             <data dataType="byte" bitLength="720">0xce0f2b000000556d6d2c2049206e6f772073656520796f7520696e207468652077697265736861726b20636170747572650000000000000000000000000000000000000000000000000000000000000000000000000000000000</data>
                           </CIPData>
diff --git a/plc4go/assets/testing/protocols/eip/ParserSerializerTestsuiteLittleEndian.xml b/plc4go/assets/testing/protocols/eip/ParserSerializerTestsuiteLittleEndian.xml
index de96f703ad..db0d33ea91 100644
--- a/plc4go/assets/testing/protocols/eip/ParserSerializerTestsuiteLittleEndian.xml
+++ b/plc4go/assets/testing/protocols/eip/ParserSerializerTestsuiteLittleEndian.xml
@@ -907,7 +907,7 @@
                       <data>
                         <CIPData>
                           <dataType>
-                            <CIPDataTypeCode dataType="uint" bitLength="16" stringRepresentation="STRING36">672</CIPDataTypeCode>
+                            <CIPDataTypeCode dataType="uint" bitLength="16" stringRepresentation="STRUCTURED">672</CIPDataTypeCode>
                           </dataType>
                           <data dataType="byte" bitLength="720">0xce0f2b000000556d6d2c2049206e6f772073656520796f7520696e207468652077697265736861726b20636170747572650000000000000000000000000000000000000000000000000000000000000000000000000000000000</data>
                         </CIPData>
diff --git a/plc4go/protocols/bacnetip/readwrite/model/BACnetVendorId.go b/plc4go/protocols/bacnetip/readwrite/model/BACnetVendorId.go
index 6d10136ee0..ee884e7dbe 100644
--- a/plc4go/protocols/bacnetip/readwrite/model/BACnetVendorId.go
+++ b/plc4go/protocols/bacnetip/readwrite/model/BACnetVendorId.go
@@ -1435,6 +1435,8 @@ const (
 	BACnetVendorId_THING_WAREHOUSELLC                                                           BACnetVendorId = 1404
 	BACnetVendorId_INNOFRIENDS_GMBH                                                             BACnetVendorId = 1405
 	BACnetVendorId_METRONICAKP_SPJ                                                              BACnetVendorId = 1406
+	BACnetVendorId_TECHKNAVE                                                                    BACnetVendorId = 1407
+	BACnetVendorId_ELSNER_ELEKTRONIK                                                            BACnetVendorId = 1408
 	BACnetVendorId_UNKNOWN_VENDOR                                                               BACnetVendorId = 0xFFFF
 )
 
@@ -2841,6 +2843,8 @@ func init() {
 		BACnetVendorId_THING_WAREHOUSELLC,
 		BACnetVendorId_INNOFRIENDS_GMBH,
 		BACnetVendorId_METRONICAKP_SPJ,
+		BACnetVendorId_TECHKNAVE,
+		BACnetVendorId_ELSNER_ELEKTRONIK,
 		BACnetVendorId_UNKNOWN_VENDOR,
 	}
 }
@@ -4659,6 +4663,14 @@ func (e BACnetVendorId) VendorId() uint16 {
 		{ /* '1406' */
 			return 1406
 		}
+	case 1407:
+		{ /* '1407' */
+			return 1407
+		}
+	case 1408:
+		{ /* '1408' */
+			return 1408
+		}
 	case 141:
 		{ /* '141' */
 			return 141
@@ -10273,6 +10285,14 @@ func (e BACnetVendorId) VendorName() string {
 		{ /* '1406' */
 			return "Metronic AKP Sp. J."
 		}
+	case 1407:
+		{ /* '1407' */
+			return "Techknave"
+		}
+	case 1408:
+		{ /* '1408' */
+			return "Elsner Elektronik"
+		}
 	case 141:
 		{ /* '141' */
 			return "Yaskawa America, Inc."
@@ -14980,6 +15000,10 @@ func BACnetVendorIdByValue(value uint16) (enum BACnetVendorId, ok bool) {
 		return BACnetVendorId_INNOFRIENDS_GMBH, true
 	case 1406:
 		return BACnetVendorId_METRONICAKP_SPJ, true
+	case 1407:
+		return BACnetVendorId_TECHKNAVE, true
+	case 1408:
+		return BACnetVendorId_ELSNER_ELEKTRONIK, true
 	case 141:
 		return BACnetVendorId_YASKAWA_AMERICA_INC, true
 	case 142:
@@ -17784,6 +17808,10 @@ func BACnetVendorIdByName(value string) (enum BACnetVendorId, ok bool) {
 		return BACnetVendorId_INNOFRIENDS_GMBH, true
 	case "METRONICAKP_SPJ":
 		return BACnetVendorId_METRONICAKP_SPJ, true
+	case "TECHKNAVE":
+		return BACnetVendorId_TECHKNAVE, true
+	case "ELSNER_ELEKTRONIK":
+		return BACnetVendorId_ELSNER_ELEKTRONIK, true
 	case "YASKAWA_AMERICA_INC":
 		return BACnetVendorId_YASKAWA_AMERICA_INC, true
 	case "DEO_SCONTROLSYSTEMS_GMBH":
@@ -20645,6 +20673,10 @@ func (e BACnetVendorId) PLC4XEnumName() string {
 		return "INNOFRIENDS_GMBH"
 	case BACnetVendorId_METRONICAKP_SPJ:
 		return "METRONICAKP_SPJ"
+	case BACnetVendorId_TECHKNAVE:
+		return "TECHKNAVE"
+	case BACnetVendorId_ELSNER_ELEKTRONIK:
+		return "ELSNER_ELEKTRONIK"
 	case BACnetVendorId_YASKAWA_AMERICA_INC:
 		return "YASKAWA_AMERICA_INC"
 	case BACnetVendorId_DEO_SCONTROLSYSTEMS_GMBH:
diff --git a/plc4go/protocols/eip/readwrite/model/CIPDataTypeCode.go b/plc4go/protocols/eip/readwrite/model/CIPDataTypeCode.go
index 467236e33b..57065693ef 100644
--- a/plc4go/protocols/eip/readwrite/model/CIPDataTypeCode.go
+++ b/plc4go/protocols/eip/readwrite/model/CIPDataTypeCode.go
@@ -36,16 +36,37 @@ type ICIPDataTypeCode interface {
 }
 
 const (
-	CIPDataTypeCode_BOOL       CIPDataTypeCode = 0x00C1
-	CIPDataTypeCode_SINT       CIPDataTypeCode = 0x00C2
-	CIPDataTypeCode_INT        CIPDataTypeCode = 0x00C3
-	CIPDataTypeCode_DINT       CIPDataTypeCode = 0x00C4
-	CIPDataTypeCode_LINT       CIPDataTypeCode = 0x00C5
-	CIPDataTypeCode_REAL       CIPDataTypeCode = 0x00CA
-	CIPDataTypeCode_DWORD      CIPDataTypeCode = 0x00D3
-	CIPDataTypeCode_STRUCTURED CIPDataTypeCode = 0x02A0
-	CIPDataTypeCode_STRING     CIPDataTypeCode = 0x02A0
-	CIPDataTypeCode_STRING36   CIPDataTypeCode = 0x02A0
+	CIPDataTypeCode_BOOL          CIPDataTypeCode = 0x00C1
+	CIPDataTypeCode_SINT          CIPDataTypeCode = 0x00C2
+	CIPDataTypeCode_INT           CIPDataTypeCode = 0x00C3
+	CIPDataTypeCode_DINT          CIPDataTypeCode = 0x00C4
+	CIPDataTypeCode_LINT          CIPDataTypeCode = 0x00C5
+	CIPDataTypeCode_USINT         CIPDataTypeCode = 0x00C6
+	CIPDataTypeCode_UINT          CIPDataTypeCode = 0x00C7
+	CIPDataTypeCode_UDINT         CIPDataTypeCode = 0x00C8
+	CIPDataTypeCode_ULINT         CIPDataTypeCode = 0x00C9
+	CIPDataTypeCode_REAL          CIPDataTypeCode = 0x00CA
+	CIPDataTypeCode_LREAL         CIPDataTypeCode = 0x00CB
+	CIPDataTypeCode_STIME         CIPDataTypeCode = 0x00CC
+	CIPDataTypeCode_DATE          CIPDataTypeCode = 0x00CD
+	CIPDataTypeCode_TIME_OF_DAY   CIPDataTypeCode = 0x00CE
+	CIPDataTypeCode_DATE_AND_TIME CIPDataTypeCode = 0x00CF
+	CIPDataTypeCode_STRING        CIPDataTypeCode = 0x00D0
+	CIPDataTypeCode_BYTE          CIPDataTypeCode = 0x00D1
+	CIPDataTypeCode_WORD          CIPDataTypeCode = 0x00D2
+	CIPDataTypeCode_DWORD         CIPDataTypeCode = 0x00D3
+	CIPDataTypeCode_LWORD         CIPDataTypeCode = 0x00D3
+	CIPDataTypeCode_STRING2       CIPDataTypeCode = 0x00D5
+	CIPDataTypeCode_FTIME         CIPDataTypeCode = 0x00D6
+	CIPDataTypeCode_LTIME         CIPDataTypeCode = 0x00D7
+	CIPDataTypeCode_ITIME         CIPDataTypeCode = 0x00D8
+	CIPDataTypeCode_STRINGN       CIPDataTypeCode = 0x00D9
+	CIPDataTypeCode_SHORT_STRING  CIPDataTypeCode = 0x00DA
+	CIPDataTypeCode_TIME          CIPDataTypeCode = 0x00DB
+	CIPDataTypeCode_EPATH         CIPDataTypeCode = 0x00DC
+	CIPDataTypeCode_ENGUNIT       CIPDataTypeCode = 0x00DD
+	CIPDataTypeCode_STRINGI       CIPDataTypeCode = 0x00DD
+	CIPDataTypeCode_STRUCTURED    CIPDataTypeCode = 0x02A0
 )
 
 var CIPDataTypeCodeValues []CIPDataTypeCode
@@ -58,11 +79,32 @@ func init() {
 		CIPDataTypeCode_INT,
 		CIPDataTypeCode_DINT,
 		CIPDataTypeCode_LINT,
+		CIPDataTypeCode_USINT,
+		CIPDataTypeCode_UINT,
+		CIPDataTypeCode_UDINT,
+		CIPDataTypeCode_ULINT,
 		CIPDataTypeCode_REAL,
+		CIPDataTypeCode_LREAL,
+		CIPDataTypeCode_STIME,
+		CIPDataTypeCode_DATE,
+		CIPDataTypeCode_TIME_OF_DAY,
+		CIPDataTypeCode_DATE_AND_TIME,
+		CIPDataTypeCode_STRING,
+		CIPDataTypeCode_BYTE,
+		CIPDataTypeCode_WORD,
 		CIPDataTypeCode_DWORD,
+		CIPDataTypeCode_LWORD,
+		CIPDataTypeCode_STRING2,
+		CIPDataTypeCode_FTIME,
+		CIPDataTypeCode_LTIME,
+		CIPDataTypeCode_ITIME,
+		CIPDataTypeCode_STRINGN,
+		CIPDataTypeCode_SHORT_STRING,
+		CIPDataTypeCode_TIME,
+		CIPDataTypeCode_EPATH,
+		CIPDataTypeCode_ENGUNIT,
+		CIPDataTypeCode_STRINGI,
 		CIPDataTypeCode_STRUCTURED,
-		CIPDataTypeCode_STRING,
-		CIPDataTypeCode_STRING36,
 	}
 }
 
@@ -88,14 +130,98 @@ func (e CIPDataTypeCode) Size() uint8 {
 		{ /* '0X00C5' */
 			return 8
 		}
+	case 0x00C6:
+		{ /* '0X00C6' */
+			return 1
+		}
+	case 0x00C7:
+		{ /* '0X00C7' */
+			return 2
+		}
+	case 0x00C8:
+		{ /* '0X00C8' */
+			return 4
+		}
+	case 0x00C9:
+		{ /* '0X00C9' */
+			return 8
+		}
 	case 0x00CA:
 		{ /* '0X00CA' */
 			return 4
 		}
+	case 0x00CB:
+		{ /* '0X00CB' */
+			return 8
+		}
+	case 0x00CC:
+		{ /* '0X00CC' */
+			return 4
+		}
+	case 0x00CD:
+		{ /* '0X00CD' */
+			return 2
+		}
+	case 0x00CE:
+		{ /* '0X00CE' */
+			return 4
+		}
+	case 0x00CF:
+		{ /* '0X00CF' */
+			return 6
+		}
+	case 0x00D0:
+		{ /* '0X00D0' */
+			return 0
+		}
+	case 0x00D1:
+		{ /* '0X00D1' */
+			return 1
+		}
+	case 0x00D2:
+		{ /* '0X00D2' */
+			return 2
+		}
 	case 0x00D3:
 		{ /* '0X00D3' */
 			return 4
 		}
+	case 0x00D5:
+		{ /* '0X00D5' */
+			return 0
+		}
+	case 0x00D6:
+		{ /* '0X00D6' */
+			return 4
+		}
+	case 0x00D7:
+		{ /* '0X00D7' */
+			return 8
+		}
+	case 0x00D8:
+		{ /* '0X00D8' */
+			return 2
+		}
+	case 0x00D9:
+		{ /* '0X00D9' */
+			return 0
+		}
+	case 0x00DA:
+		{ /* '0X00DA' */
+			return 0
+		}
+	case 0x00DB:
+		{ /* '0X00DB' */
+			return 4
+		}
+	case 0x00DC:
+		{ /* '0X00DC' */
+			return 0
+		}
+	case 0x00DD:
+		{ /* '0X00DD' */
+			return 0
+		}
 	case 0x02A0:
 		{ /* '0X02A0' */
 			return 88
@@ -127,10 +253,52 @@ func CIPDataTypeCodeByValue(value uint16) (enum CIPDataTypeCode, ok bool) {
 		return CIPDataTypeCode_DINT, true
 	case 0x00C5:
 		return CIPDataTypeCode_LINT, true
+	case 0x00C6:
+		return CIPDataTypeCode_USINT, true
+	case 0x00C7:
+		return CIPDataTypeCode_UINT, true
+	case 0x00C8:
+		return CIPDataTypeCode_UDINT, true
+	case 0x00C9:
+		return CIPDataTypeCode_ULINT, true
 	case 0x00CA:
 		return CIPDataTypeCode_REAL, true
+	case 0x00CB:
+		return CIPDataTypeCode_LREAL, true
+	case 0x00CC:
+		return CIPDataTypeCode_STIME, true
+	case 0x00CD:
+		return CIPDataTypeCode_DATE, true
+	case 0x00CE:
+		return CIPDataTypeCode_TIME_OF_DAY, true
+	case 0x00CF:
+		return CIPDataTypeCode_DATE_AND_TIME, true
+	case 0x00D0:
+		return CIPDataTypeCode_STRING, true
+	case 0x00D1:
+		return CIPDataTypeCode_BYTE, true
+	case 0x00D2:
+		return CIPDataTypeCode_WORD, true
 	case 0x00D3:
 		return CIPDataTypeCode_DWORD, true
+	case 0x00D5:
+		return CIPDataTypeCode_STRING2, true
+	case 0x00D6:
+		return CIPDataTypeCode_FTIME, true
+	case 0x00D7:
+		return CIPDataTypeCode_LTIME, true
+	case 0x00D8:
+		return CIPDataTypeCode_ITIME, true
+	case 0x00D9:
+		return CIPDataTypeCode_STRINGN, true
+	case 0x00DA:
+		return CIPDataTypeCode_SHORT_STRING, true
+	case 0x00DB:
+		return CIPDataTypeCode_TIME, true
+	case 0x00DC:
+		return CIPDataTypeCode_EPATH, true
+	case 0x00DD:
+		return CIPDataTypeCode_ENGUNIT, true
 	case 0x02A0:
 		return CIPDataTypeCode_STRUCTURED, true
 	}
@@ -149,10 +317,52 @@ func CIPDataTypeCodeByName(value string) (enum CIPDataTypeCode, ok bool) {
 		return CIPDataTypeCode_DINT, true
 	case "LINT":
 		return CIPDataTypeCode_LINT, true
+	case "USINT":
+		return CIPDataTypeCode_USINT, true
+	case "UINT":
+		return CIPDataTypeCode_UINT, true
+	case "UDINT":
+		return CIPDataTypeCode_UDINT, true
+	case "ULINT":
+		return CIPDataTypeCode_ULINT, true
 	case "REAL":
 		return CIPDataTypeCode_REAL, true
+	case "LREAL":
+		return CIPDataTypeCode_LREAL, true
+	case "STIME":
+		return CIPDataTypeCode_STIME, true
+	case "DATE":
+		return CIPDataTypeCode_DATE, true
+	case "TIME_OF_DAY":
+		return CIPDataTypeCode_TIME_OF_DAY, true
+	case "DATE_AND_TIME":
+		return CIPDataTypeCode_DATE_AND_TIME, true
+	case "STRING":
+		return CIPDataTypeCode_STRING, true
+	case "BYTE":
+		return CIPDataTypeCode_BYTE, true
+	case "WORD":
+		return CIPDataTypeCode_WORD, true
 	case "DWORD":
 		return CIPDataTypeCode_DWORD, true
+	case "STRING2":
+		return CIPDataTypeCode_STRING2, true
+	case "FTIME":
+		return CIPDataTypeCode_FTIME, true
+	case "LTIME":
+		return CIPDataTypeCode_LTIME, true
+	case "ITIME":
+		return CIPDataTypeCode_ITIME, true
+	case "STRINGN":
+		return CIPDataTypeCode_STRINGN, true
+	case "SHORT_STRING":
+		return CIPDataTypeCode_SHORT_STRING, true
+	case "TIME":
+		return CIPDataTypeCode_TIME, true
+	case "EPATH":
+		return CIPDataTypeCode_EPATH, true
+	case "ENGUNIT":
+		return CIPDataTypeCode_ENGUNIT, true
 	case "STRUCTURED":
 		return CIPDataTypeCode_STRUCTURED, true
 	}
@@ -228,10 +438,52 @@ func (e CIPDataTypeCode) PLC4XEnumName() string {
 		return "DINT"
 	case CIPDataTypeCode_LINT:
 		return "LINT"
+	case CIPDataTypeCode_USINT:
+		return "USINT"
+	case CIPDataTypeCode_UINT:
+		return "UINT"
+	case CIPDataTypeCode_UDINT:
+		return "UDINT"
+	case CIPDataTypeCode_ULINT:
+		return "ULINT"
 	case CIPDataTypeCode_REAL:
 		return "REAL"
+	case CIPDataTypeCode_LREAL:
+		return "LREAL"
+	case CIPDataTypeCode_STIME:
+		return "STIME"
+	case CIPDataTypeCode_DATE:
+		return "DATE"
+	case CIPDataTypeCode_TIME_OF_DAY:
+		return "TIME_OF_DAY"
+	case CIPDataTypeCode_DATE_AND_TIME:
+		return "DATE_AND_TIME"
+	case CIPDataTypeCode_STRING:
+		return "STRING"
+	case CIPDataTypeCode_BYTE:
+		return "BYTE"
+	case CIPDataTypeCode_WORD:
+		return "WORD"
 	case CIPDataTypeCode_DWORD:
 		return "DWORD"
+	case CIPDataTypeCode_STRING2:
+		return "STRING2"
+	case CIPDataTypeCode_FTIME:
+		return "FTIME"
+	case CIPDataTypeCode_LTIME:
+		return "LTIME"
+	case CIPDataTypeCode_ITIME:
+		return "ITIME"
+	case CIPDataTypeCode_STRINGN:
+		return "STRINGN"
+	case CIPDataTypeCode_SHORT_STRING:
+		return "SHORT_STRING"
+	case CIPDataTypeCode_TIME:
+		return "TIME"
+	case CIPDataTypeCode_EPATH:
+		return "EPATH"
+	case CIPDataTypeCode_ENGUNIT:
+		return "ENGUNIT"
 	case CIPDataTypeCode_STRUCTURED:
 		return "STRUCTURED"
 	}
diff --git a/plc4go/spi/utils/WriteBufferByteBased.go b/plc4go/spi/utils/WriteBufferByteBased.go
index b740f0a3ee..506cad0507 100644
--- a/plc4go/spi/utils/WriteBufferByteBased.go
+++ b/plc4go/spi/utils/WriteBufferByteBased.go
@@ -25,6 +25,7 @@ import (
 	"encoding/binary"
 	"math"
 	"math/big"
+	"math/bits"
 	"regexp"
 	"strings"
 
@@ -146,9 +147,8 @@ func (wb *byteWriteBuffer) WriteUint8(_ string, bitLength uint8, value uint8, _
 func (wb *byteWriteBuffer) WriteUint16(_ string, bitLength uint8, value uint16, _ ...WithWriterArgs) error {
 	wb.move(uint(bitLength))
 	if wb.byteOrder == binary.LittleEndian {
-		// TODO: indirection till we have a native LE implementation
-		// TODO: validate that this produces the desired result
-		return binary.Write(wb.data, wb.byteOrder, value)
+		reverseValue := bits.ReverseBytes64(uint64(value)) >> (64 - bitLength)
+		return wb.writer.WriteBits(reverseValue, bitLength)
 	}
 	return wb.writer.WriteBits(uint64(value), bitLength)
 }
@@ -156,9 +156,8 @@ func (wb *byteWriteBuffer) WriteUint16(_ string, bitLength uint8, value uint16,
 func (wb *byteWriteBuffer) WriteUint32(_ string, bitLength uint8, value uint32, _ ...WithWriterArgs) error {
 	wb.move(uint(bitLength))
 	if wb.byteOrder == binary.LittleEndian {
-		// TODO: indirection till we have a native LE implementation
-		// TODO: validate that this produces the desired result
-		return binary.Write(wb.data, wb.byteOrder, value)
+		reverseValue := bits.ReverseBytes64(uint64(value)) >> (64 - bitLength)
+		return wb.writer.WriteBits(reverseValue, bitLength)
 	}
 	return wb.writer.WriteBits(uint64(value), bitLength)
 }
@@ -166,9 +165,8 @@ func (wb *byteWriteBuffer) WriteUint32(_ string, bitLength uint8, value uint32,
 func (wb *byteWriteBuffer) WriteUint64(_ string, bitLength uint8, value uint64, _ ...WithWriterArgs) error {
 	wb.move(uint(bitLength))
 	if wb.byteOrder == binary.LittleEndian {
-		// TODO: indirection till we have a native LE implementation
-		// TODO: validate that this produces the desired result
-		return binary.Write(wb.data, wb.byteOrder, value)
+		reverseValue := bits.ReverseBytes64(value) >> (64 - bitLength)
+		return wb.writer.WriteBits(reverseValue, bitLength)
 	}
 	return wb.writer.WriteBits(value, bitLength)
 }
@@ -181,9 +179,8 @@ func (wb *byteWriteBuffer) WriteInt8(_ string, bitLength uint8, value int8, _ ..
 func (wb *byteWriteBuffer) WriteInt16(_ string, bitLength uint8, value int16, _ ...WithWriterArgs) error {
 	wb.move(uint(bitLength))
 	if wb.byteOrder == binary.LittleEndian {
-		// TODO: indirection till we have a native LE implementation
-		// TODO: validate that this produces the desired result
-		return binary.Write(wb.data, wb.byteOrder, value)
+		reverseValue := bits.ReverseBytes64(uint64(value)) >> (64 - bitLength)
+		return wb.writer.WriteBits(reverseValue, bitLength)
 	}
 	return wb.writer.WriteBits(uint64(value), bitLength)
 }
@@ -191,9 +188,8 @@ func (wb *byteWriteBuffer) WriteInt16(_ string, bitLength uint8, value int16, _
 func (wb *byteWriteBuffer) WriteInt32(_ string, bitLength uint8, value int32, _ ...WithWriterArgs) error {
 	wb.move(uint(bitLength))
 	if wb.byteOrder == binary.LittleEndian {
-		// TODO: indirection till we have a native LE implementation
-		// TODO: validate that this produces the desired result
-		return binary.Write(wb.data, wb.byteOrder, value)
+		reverseValue := bits.ReverseBytes64(uint64(value)) >> (64 - bitLength)
+		return wb.writer.WriteBits(reverseValue, bitLength)
 	}
 	return wb.writer.WriteBits(uint64(value), bitLength)
 }
@@ -201,9 +197,8 @@ func (wb *byteWriteBuffer) WriteInt32(_ string, bitLength uint8, value int32, _
 func (wb *byteWriteBuffer) WriteInt64(_ string, bitLength uint8, value int64, _ ...WithWriterArgs) error {
 	wb.move(uint(bitLength))
 	if wb.byteOrder == binary.LittleEndian {
-		// TODO: indirection till we have a native LE implementation
-		// TODO: validate that this produces the desired result
-		return binary.Write(wb.data, wb.byteOrder, value)
+		reverseValue := bits.ReverseBytes64(uint64(value)) >> (64 - bitLength)
+		return wb.writer.WriteBits(reverseValue, bitLength)
 	}
 	return wb.writer.WriteBits(uint64(value), bitLength)
 }
diff --git a/plc4j/drivers/bacnet/src/main/generated/org/apache/plc4x/java/bacnetip/readwrite/BACnetVendorId.java b/plc4j/drivers/bacnet/src/main/generated/org/apache/plc4x/java/bacnetip/readwrite/BACnetVendorId.java
index 3ad63e9cba..3a8b12ea1b 100644
--- a/plc4j/drivers/bacnet/src/main/generated/org/apache/plc4x/java/bacnetip/readwrite/BACnetVendorId.java
+++ b/plc4j/drivers/bacnet/src/main/generated/org/apache/plc4x/java/bacnetip/readwrite/BACnetVendorId.java
@@ -1615,6 +1615,8 @@ public enum BACnetVendorId {
   THING_WAREHOUSELLC((int) 1404, (int) 1404, (String) "Thing Warehouse LLC"),
   INNOFRIENDS_GMBH((int) 1405, (int) 1405, (String) "Innofriends GmbH"),
   METRONICAKP_SPJ((int) 1406, (int) 1406, (String) "Metronic AKP Sp. J."),
+  TECHKNAVE((int) 1407, (int) 1407, (String) "Techknave"),
+  ELSNER_ELEKTRONIK((int) 1408, (int) 1408, (String) "Elsner Elektronik"),
   UNKNOWN_VENDOR((int) 0xFFFF, (int) 0xFFFF, (String) "Unknown");
   private static final Map<Integer, BACnetVendorId> map;
 
diff --git a/plc4j/drivers/eip/src/main/generated/org/apache/plc4x/java/eip/readwrite/CIPDataTypeCode.java b/plc4j/drivers/eip/src/main/generated/org/apache/plc4x/java/eip/readwrite/CIPDataTypeCode.java
index a28dd21246..6a0eb9a133 100644
--- a/plc4j/drivers/eip/src/main/generated/org/apache/plc4x/java/eip/readwrite/CIPDataTypeCode.java
+++ b/plc4j/drivers/eip/src/main/generated/org/apache/plc4x/java/eip/readwrite/CIPDataTypeCode.java
@@ -31,11 +31,32 @@ public enum CIPDataTypeCode {
   INT((int) 0X00C3, (short) 2),
   DINT((int) 0X00C4, (short) 4),
   LINT((int) 0X00C5, (short) 8),
+  USINT((int) 0X00C6, (short) 1),
+  UINT((int) 0X00C7, (short) 2),
+  UDINT((int) 0X00C8, (short) 4),
+  ULINT((int) 0X00C9, (short) 8),
   REAL((int) 0X00CA, (short) 4),
+  LREAL((int) 0X00CB, (short) 8),
+  STIME((int) 0X00CC, (short) 4),
+  DATE((int) 0X00CD, (short) 2),
+  TIME_OF_DAY((int) 0X00CE, (short) 4),
+  DATE_AND_TIME((int) 0X00CF, (short) 6),
+  STRING((int) 0X00D0, (short) 0),
+  BYTE((int) 0X00D1, (short) 1),
+  WORD((int) 0X00D2, (short) 2),
   DWORD((int) 0X00D3, (short) 4),
-  STRUCTURED((int) 0X02A0, (short) 88),
-  STRING((int) 0X02A0, (short) 88),
-  STRING36((int) 0X02A0, (short) 40);
+  LWORD((int) 0X00D3, (short) 8),
+  STRING2((int) 0X00D5, (short) 0),
+  FTIME((int) 0X00D6, (short) 4),
+  LTIME((int) 0X00D7, (short) 8),
+  ITIME((int) 0X00D8, (short) 2),
+  STRINGN((int) 0X00D9, (short) 0),
+  SHORT_STRING((int) 0X00DA, (short) 0),
+  TIME((int) 0X00DB, (short) 4),
+  EPATH((int) 0X00DC, (short) 0),
+  ENGUNIT((int) 0X00DD, (short) 0),
+  STRINGI((int) 0X00DD, (short) 0),
+  STRUCTURED((int) 0X02A0, (short) 88);
   private static final Map<Integer, CIPDataTypeCode> map;
 
   static {
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 2a350c25c4..171953116a 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
@@ -830,7 +830,6 @@ public class EipProtocolLogic extends Plc4xProtocolBase<EipPacket> implements Ha
                     return new PlcREAL(swap(data.getFloat(0)));
                 case BOOL:
                     return new PlcBOOL(data.getBoolean(0));
-                case STRING36:
                 case STRING:
                 case STRUCTURED: {
                     short structuredType = Short.reverseBytes(data.getShort(0));
@@ -1244,13 +1243,10 @@ public class EipProtocolLogic extends Plc4xProtocolBase<EipPacket> implements Ha
                 buffer.putLong(value.getLong());
                 break;
             case STRING:
-            case STRING36:
+            case STRUCTURED:
                 buffer.putInt(value.getString().length());
                 buffer.put(value.getString().getBytes(), 0, value.getString().length());
                 break;
-            case STRUCTURED:
-                // Need to handle
-                break;
             default:
                 break;
         }
diff --git a/protocols/eip/src/main/resources/protocols/eip/eip.mspec b/protocols/eip/src/main/resources/protocols/eip/eip.mspec
index 03ff51373e..c29dd75f82 100644
--- a/protocols/eip/src/main/resources/protocols/eip/eip.mspec
+++ b/protocols/eip/src/main/resources/protocols/eip/eip.mspec
@@ -356,11 +356,35 @@
     ['0X00C3'   INT             ['2']]
     ['0X00C4'   DINT            ['4']]
     ['0X00C5'   LINT            ['8']]
+    ['0X00C6'   USINT           ['1']]
+    ['0X00C7'   UINT            ['2']]
+    ['0X00C8'   UDINT           ['4']]
+    ['0X00C9'   ULINT           ['8']]
     ['0X00CA'   REAL            ['4']]
+    ['0X00CB'   LREAL           ['8']]
+    ['0X00CC'   STIME           ['4']] // Synchronous time information
+    ['0X00CD'   DATE            ['2']]
+    ['0X00CE'   TIME_OF_DAY     ['4']]
+    ['0X00CF'   DATE_AND_TIME   ['6']]
+    ['0X00D0'   STRING          ['0']] // Character string, 1-byte per character, 2-byte length
+    ['0X00D1'   BYTE            ['1']]
+    ['0X00D2'   WORD            ['2']]
     ['0X00D3'   DWORD           ['4']]
+    ['0X00D3'   LWORD           ['8']]
+    ['0X00D5'   STRING2         ['0']] // Character string, 2-bytes per character
+    ['0X00D6'   FTIME           ['4']] // Duration - high resolution
+    ['0X00D7'   LTIME           ['8']] // Duration - long
+    ['0X00D8'   ITIME           ['2']] // Duration - short
+    ['0X00D9'   STRINGN         ['0']] // Character string, n-bytes per character
+    ['0X00DA'   SHORT_STRING    ['0']] // Character string, 1-byte per character, 1-byte length
+    ['0X00DB'   TIME            ['4']] // Duration - milliseconds
+    ['0X00DC'   EPATH           ['0']] // CIP path segments
+    ['0X00DD'   ENGUNIT         ['0']] // Engineering units
+    ['0X00DD'   STRINGI         ['0']] // International character string
+    // ARRAY
     ['0X02A0'   STRUCTURED      ['88']]
-    ['0X02A0'   STRING          ['88']]
-    ['0X02A0'   STRING36        ['40']]
+    //['0X02A0'   STRING          ['88']]
+    //['0X02A0'   STRING36        ['40']]
     //TODO: -1 is not a valid value for uint
     //['-1'       UNKNOWN         ['-1']]
 
diff --git a/protocols/eip/src/test/resources/protocols/eip/DriverTestsuite.xml b/protocols/eip/src/test/resources/protocols/eip/DriverTestsuite.xml
index d8e9f8b3c6..66d1049691 100644
--- a/protocols/eip/src/test/resources/protocols/eip/DriverTestsuite.xml
+++ b/protocols/eip/src/test/resources/protocols/eip/DriverTestsuite.xml
@@ -376,7 +376,7 @@
                         <data>
                           <CIPData>
                             <dataType>
-                              <CIPDataTypeCode dataType="uint" bitLength="16" stringRepresentation="STRING36">672</CIPDataTypeCode>
+                              <CIPDataTypeCode dataType="uint" bitLength="16" stringRepresentation="STRUCTURED">672</CIPDataTypeCode>
                             </dataType>
                             <data dataType="byte" bitLength="720">0xce0f2b000000556d6d2c2049206e6f772073656520796f7520696e207468652077697265736861726b20636170747572650000000000000000000000000000000000000000000000000000000000000000000000000000000000</data>
                           </CIPData>
diff --git a/protocols/eip/src/test/resources/protocols/eip/ParserSerializerTestsuiteLittleEndian.xml b/protocols/eip/src/test/resources/protocols/eip/ParserSerializerTestsuiteLittleEndian.xml
index de96f703ad..db0d33ea91 100644
--- a/protocols/eip/src/test/resources/protocols/eip/ParserSerializerTestsuiteLittleEndian.xml
+++ b/protocols/eip/src/test/resources/protocols/eip/ParserSerializerTestsuiteLittleEndian.xml
@@ -907,7 +907,7 @@
                       <data>
                         <CIPData>
                           <dataType>
-                            <CIPDataTypeCode dataType="uint" bitLength="16" stringRepresentation="STRING36">672</CIPDataTypeCode>
+                            <CIPDataTypeCode dataType="uint" bitLength="16" stringRepresentation="STRUCTURED">672</CIPDataTypeCode>
                           </dataType>
                           <data dataType="byte" bitLength="720">0xce0f2b000000556d6d2c2049206e6f772073656520796f7520696e207468652077697265736861726b20636170747572650000000000000000000000000000000000000000000000000000000000000000000000000000000000</data>
                         </CIPData>