You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@plc4x.apache.org by sr...@apache.org on 2022/08/10 10:17:03 UTC
[plc4x] branch develop updated (9a1fb1cef -> aae82e927)
This is an automated email from the ASF dual-hosted git repository.
sruehl pushed a change to branch develop
in repository https://gitbox.apache.org/repos/asf/plc4x.git
from 9a1fb1cef fix(plc4xpcapanalyzer): remove ! in the middle of responses and return it as a "single" response
new dde3b0173 fix(plc4xtools): set shutdown flag early to avoid corrupted files
new aae82e927 fix(plc4go/cbus): change handling of error responses
The 2 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails. The revisions
listed as "add" were already present in the repository and have only
been added to this reference.
Summary of changes:
plc4go/internal/cbus/MessageCodec.go | 102 ++++++++++++++++-----
.../knxnetip/readwrite/model/KnxManufacturer.go | 26 +++++-
plc4go/tools/plc4xbrowser/ui/common.go | 2 +-
plc4go/tools/plc4xpcapanalyzer/ui/common.go | 2 +-
4 files changed, 102 insertions(+), 30 deletions(-)
[plc4x] 01/02: fix(plc4xtools): set shutdown flag early to avoid corrupted files
Posted by sr...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
sruehl pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/plc4x.git
commit dde3b0173a6491c4a053c81fcf10c043662f4bb6
Author: Sebastian Rühl <sr...@apache.org>
AuthorDate: Wed Aug 10 12:06:00 2022 +0200
fix(plc4xtools): set shutdown flag early to avoid corrupted files
---
plc4go/tools/plc4xbrowser/ui/common.go | 2 +-
plc4go/tools/plc4xpcapanalyzer/ui/common.go | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/plc4go/tools/plc4xbrowser/ui/common.go b/plc4go/tools/plc4xbrowser/ui/common.go
index 84e31683b..78e5f7070 100644
--- a/plc4go/tools/plc4xbrowser/ui/common.go
+++ b/plc4go/tools/plc4xbrowser/ui/common.go
@@ -78,6 +78,6 @@ func Shutdown() {
for _, connection := range connections {
connection.Close()
}
- saveConfig()
hasShutdown = true
+ saveConfig()
}
diff --git a/plc4go/tools/plc4xpcapanalyzer/ui/common.go b/plc4go/tools/plc4xpcapanalyzer/ui/common.go
index c716a66d8..e144a4cb4 100644
--- a/plc4go/tools/plc4xpcapanalyzer/ui/common.go
+++ b/plc4go/tools/plc4xpcapanalyzer/ui/common.go
@@ -77,6 +77,6 @@ func Shutdown() {
if hasShutdown {
return
}
- saveConfig()
hasShutdown = true
+ saveConfig()
}
[plc4x] 02/02: fix(plc4go/cbus): change handling of error responses
Posted by sr...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
sruehl pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/plc4x.git
commit aae82e92772b97fae0d7aa48555d1a1a0d8542fe
Author: Sebastian Rühl <sr...@apache.org>
AuthorDate: Wed Aug 10 12:16:55 2022 +0200
fix(plc4go/cbus): change handling of error responses
---
plc4go/internal/cbus/MessageCodec.go | 102 ++++++++++++++++-----
.../knxnetip/readwrite/model/KnxManufacturer.go | 26 +++++-
2 files changed, 100 insertions(+), 28 deletions(-)
diff --git a/plc4go/internal/cbus/MessageCodec.go b/plc4go/internal/cbus/MessageCodec.go
index e83bcf42e..45ae578aa 100644
--- a/plc4go/internal/cbus/MessageCodec.go
+++ b/plc4go/internal/cbus/MessageCodec.go
@@ -40,6 +40,8 @@ type MessageCodec struct {
monitoredSALs chan readwriteModel.MonitoredSAL
lastPackageHash uint32
hashEncountered uint
+
+ currentlyReportedServerErrors uint
}
func NewMessageCodec(transportInstance transports.TransportInstance) *MessageCodec {
@@ -99,26 +101,37 @@ func (m *MessageCodec) Receive() (spi.Message, error) {
log.Trace().Msg("receiving")
ti := m.GetTransportInstance()
- if err := ti.FillBuffer(func(_ uint, currentByte byte, reader *bufio.Reader) bool {
- hitCr := currentByte == '\r'
- if hitCr {
- // Make sure we peek one more
- _, _ = reader.Peek(1)
- return false
+ // Fill the buffer
+ {
+ if err := ti.FillBuffer(func(_ uint, currentByte byte, reader *bufio.Reader) bool {
+ hitCr := currentByte == '\r'
+ if hitCr {
+ // Make sure we peek one more
+ _, _ = reader.Peek(1)
+ return false
+ }
+ return true
+ }); err != nil {
+ return nil, err
}
- return true
- }); err != nil {
- return nil, err
}
- readableBytes, err := ti.GetNumBytesAvailableInBuffer()
- if err != nil {
- log.Warn().Err(err).Msg("Got error reading")
- return nil, nil
- }
- if readableBytes == 0 {
- log.Trace().Msg("Nothing to read")
- return nil, nil
+
+ // Check how many readable bytes we have
+ var readableBytes uint32
+ {
+ numBytesAvailableInBuffer, err := ti.GetNumBytesAvailableInBuffer()
+ if err != nil {
+ log.Warn().Err(err).Msg("Got error reading")
+ return nil, nil
+ }
+ if numBytesAvailableInBuffer == 0 {
+ log.Trace().Msg("Nothing to read")
+ return nil, nil
+ }
+ readableBytes = numBytesAvailableInBuffer
}
+
+ // Check for an isolated error
if bytes, err := ti.PeekReadableBytes(1); err != nil && (bytes[0] == '!') {
_, _ = ti.Read(1)
return readwriteModel.CBusMessageParse(utils.NewReadBufferByteBased(bytes), true, m.requestContext, m.cbusOptions)
@@ -179,6 +192,7 @@ lookingForTheEnd:
return nil, nil
}
+ // Build length
packetLength := indexOfCR + 1
if pciResponse {
packetLength = indexOfLF + 1
@@ -189,16 +203,58 @@ lookingForTheEnd:
panic("Invalid state... Can not be response and request at the same time")
}
- read, err := ti.Read(uint32(packetLength))
- if err != nil {
- panic("Invalid state... If we have peeked that before we should be able to read that now")
+ // We need to ensure that there is no ! till the first /r
+ {
+ peekedBytes, err := ti.PeekReadableBytes(readableBytes)
+ if err != nil {
+ return nil, err
+ }
+ // We check in the current stream for reported errors
+ foundErrors := uint(0)
+ for _, peekedByte := range peekedBytes {
+ if peekedByte == '!' {
+ foundErrors++
+ }
+ if peekedByte == '\r' {
+ // We only look for errors within
+ }
+ }
+ // Now we report the errors one by one so for every request we get a proper rejection
+ if foundErrors > m.currentlyReportedServerErrors {
+ log.Debug().Msgf("We found %d errors in the current message. We have %d reported already", foundErrors, m.currentlyReportedServerErrors)
+ m.currentlyReportedServerErrors++
+ return readwriteModel.CBusMessageParse(utils.NewReadBufferByteBased([]byte{'!'}), true, m.requestContext, m.cbusOptions)
+ }
+ if foundErrors > 0 {
+ log.Debug().Msgf("We should have reported all errors by now (%d in total which we reported %d), so we resetting the count", foundErrors, m.currentlyReportedServerErrors)
+ m.currentlyReportedServerErrors = 0
+ }
+ log.Trace().Msgf("currentlyReportedServerErrors %d should be 0", m.currentlyReportedServerErrors)
+ }
+
+ var rawInput []byte
+ {
+ read, err := ti.Read(uint32(packetLength))
+ if err != nil {
+ panic("Invalid state... If we have peeked that before we should be able to read that now")
+ }
+ rawInput = read
+ }
+ var sanitizedInput []byte
+ // We remove every error marker we find
+ {
+ for _, b := range rawInput {
+ if b != '!' {
+ sanitizedInput = append(sanitizedInput, b)
+ }
+ }
}
- rb := utils.NewReadBufferByteBased(read)
+ rb := utils.NewReadBufferByteBased(sanitizedInput)
cBusMessage, err := readwriteModel.CBusMessageParse(rb, pciResponse, m.requestContext, m.cbusOptions)
if err != nil {
log.Debug().Err(err).Msg("First Parse Failed")
{ // Try SAL
- rb := utils.NewReadBufferByteBased(read)
+ rb := utils.NewReadBufferByteBased(sanitizedInput)
cBusMessage, secondErr := readwriteModel.CBusMessageParse(rb, pciResponse, readwriteModel.NewRequestContext(false), m.cbusOptions)
if secondErr == nil {
return cBusMessage, nil
@@ -209,7 +265,7 @@ lookingForTheEnd:
{ // Try MMI
requestContext := readwriteModel.NewRequestContext(false)
cbusOptions := readwriteModel.NewCBusOptions(false, false, false, false, false, false, false, false, false)
- rb := utils.NewReadBufferByteBased(read)
+ rb := utils.NewReadBufferByteBased(sanitizedInput)
cBusMessage, secondErr := readwriteModel.CBusMessageParse(rb, true, requestContext, cbusOptions)
if secondErr == nil {
return cBusMessage, nil
diff --git a/plc4go/protocols/knxnetip/readwrite/model/KnxManufacturer.go b/plc4go/protocols/knxnetip/readwrite/model/KnxManufacturer.go
index f02aad83a..8ab5a790f 100644
--- a/plc4go/protocols/knxnetip/readwrite/model/KnxManufacturer.go
+++ b/plc4go/protocols/knxnetip/readwrite/model/KnxManufacturer.go
@@ -631,8 +631,9 @@ const (
KnxManufacturer_M_GORDIC KnxManufacturer = 591
KnxManufacturer_M_DELTA_ELECTRONICS KnxManufacturer = 592
KnxManufacturer_M_SHANGHAI_LEWIN_INTELLIGENT_TECHNOLOGY_CO__LTD_ KnxManufacturer = 593
- KnxManufacturer_M_ABB___RESERVED KnxManufacturer = 594
- KnxManufacturer_M_BUSCH_JAEGER_ELEKTRO___RESERVED KnxManufacturer = 595
+ KnxManufacturer_M_KG_POWER KnxManufacturer = 594
+ KnxManufacturer_M_ABB___RESERVED KnxManufacturer = 595
+ KnxManufacturer_M_BUSCH_JAEGER_ELEKTRO___RESERVED KnxManufacturer = 596
)
var KnxManufacturerValues []KnxManufacturer
@@ -1234,6 +1235,7 @@ func init() {
KnxManufacturer_M_GORDIC,
KnxManufacturer_M_DELTA_ELECTRONICS,
KnxManufacturer_M_SHANGHAI_LEWIN_INTELLIGENT_TECHNOLOGY_CO__LTD_,
+ KnxManufacturer_M_KG_POWER,
KnxManufacturer_M_ABB___RESERVED,
KnxManufacturer_M_BUSCH_JAEGER_ELEKTRO___RESERVED,
}
@@ -3443,10 +3445,14 @@ func (e KnxManufacturer) Number() uint16 {
}
case 594:
{ /* '594' */
- return 43954
+ return 652
}
case 595:
{ /* '595' */
+ return 43954
+ }
+ case 596:
+ { /* '596' */
return 43959
}
case 6:
@@ -5845,10 +5851,14 @@ func (e KnxManufacturer) Name() string {
}
case 594:
{ /* '594' */
- return "ABB - reserved"
+ return "KG-POWER"
}
case 595:
{ /* '595' */
+ return "ABB - reserved"
+ }
+ case 596:
+ { /* '596' */
return "Busch-Jaeger Elektro - reserved"
}
case 6:
@@ -7145,8 +7155,10 @@ func KnxManufacturerByValue(value uint16) (enum KnxManufacturer, ok bool) {
case 593:
return KnxManufacturer_M_SHANGHAI_LEWIN_INTELLIGENT_TECHNOLOGY_CO__LTD_, true
case 594:
- return KnxManufacturer_M_ABB___RESERVED, true
+ return KnxManufacturer_M_KG_POWER, true
case 595:
+ return KnxManufacturer_M_ABB___RESERVED, true
+ case 596:
return KnxManufacturer_M_BUSCH_JAEGER_ELEKTRO___RESERVED, true
case 6:
return KnxManufacturer_M_BUSCH_JAEGER_ELEKTRO, true
@@ -8342,6 +8354,8 @@ func KnxManufacturerByName(value string) (enum KnxManufacturer, ok bool) {
return KnxManufacturer_M_DELTA_ELECTRONICS, true
case "M_SHANGHAI_LEWIN_INTELLIGENT_TECHNOLOGY_CO__LTD_":
return KnxManufacturer_M_SHANGHAI_LEWIN_INTELLIGENT_TECHNOLOGY_CO__LTD_, true
+ case "M_KG_POWER":
+ return KnxManufacturer_M_KG_POWER, true
case "M_ABB___RESERVED":
return KnxManufacturer_M_ABB___RESERVED, true
case "M_BUSCH_JAEGER_ELEKTRO___RESERVED":
@@ -9585,6 +9599,8 @@ func (e KnxManufacturer) PLC4XEnumName() string {
return "M_DELTA_ELECTRONICS"
case KnxManufacturer_M_SHANGHAI_LEWIN_INTELLIGENT_TECHNOLOGY_CO__LTD_:
return "M_SHANGHAI_LEWIN_INTELLIGENT_TECHNOLOGY_CO__LTD_"
+ case KnxManufacturer_M_KG_POWER:
+ return "M_KG_POWER"
case KnxManufacturer_M_ABB___RESERVED:
return "M_ABB___RESERVED"
case KnxManufacturer_M_BUSCH_JAEGER_ELEKTRO___RESERVED: