Configure golangci-lint and fix warnings
This commit is contained in:
parent
ecd1846975
commit
2e467b3d2e
20 changed files with 915 additions and 559 deletions
|
|
@ -33,6 +33,7 @@ type PortHandler struct {
|
|||
|
||||
func (p *PortHandler) MainLoop() {
|
||||
count := 0
|
||||
|
||||
for {
|
||||
go p.Receive()
|
||||
|
||||
|
|
@ -40,9 +41,12 @@ func (p *PortHandler) MainLoop() {
|
|||
case command := <-p.commandChan:
|
||||
if command == nil {
|
||||
log.Infof("command channel has been closed. stopping execution.")
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
log.Debugf("received command %v", command)
|
||||
|
||||
response, err := p.processor.Process(command)
|
||||
if err != nil {
|
||||
log.Errorf("error processing command: %v", err)
|
||||
|
|
@ -61,68 +65,62 @@ func (p *PortHandler) MainLoop() {
|
|||
|
||||
// Receive a request and generate a request data structure
|
||||
func (p *PortHandler) Receive() {
|
||||
header, err := shared.ReceiveBytes(p.port, 1, waitForInitialByte)
|
||||
if err != nil {
|
||||
if err := p.receiveHandshake(); err != nil {
|
||||
p.errors <- err
|
||||
return
|
||||
}
|
||||
if header[0] != shared.HandshakeByte {
|
||||
p.errors <- fmt.Errorf(
|
||||
"unexpected byte 0x%x expected 0x%x",
|
||||
header[0],
|
||||
shared.HandshakeByte,
|
||||
)
|
||||
return
|
||||
}
|
||||
|
||||
tries := maxTriesPerBlock
|
||||
return
|
||||
}
|
||||
|
||||
var command *datastructures.SignerRequest
|
||||
for {
|
||||
if tries <= 0 {
|
||||
p.errors <- errors.New("tried reading block too often")
|
||||
break
|
||||
}
|
||||
tries--
|
||||
|
||||
for tries := maxTriesPerBlock; tries > 0; tries-- {
|
||||
if err := shared.SendBytes(p.port, []byte{shared.AckByte}); err != nil {
|
||||
p.errors <- fmt.Errorf("could not write ACK byte: %v", err)
|
||||
break
|
||||
p.errors <- fmt.Errorf("could not write ACK byte: %w", err)
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
lengthBytes, err := shared.ReceiveBytes(p.port, shared.LengthFieldSize, waitForLengthBytes)
|
||||
if err != nil {
|
||||
p.errors <- fmt.Errorf("could not read lenght bytes: %v", err)
|
||||
break
|
||||
p.errors <- fmt.Errorf("could not read length bytes: %w", err)
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
blockLength := datastructures.Decode24BitLength(lengthBytes)
|
||||
|
||||
blockData, err := shared.ReceiveBytes(p.port, blockLength, waitForBlock)
|
||||
if err != nil {
|
||||
p.errors <- fmt.Errorf("could not read data block: %v", err)
|
||||
p.errors <- fmt.Errorf("could not read data block: %w", err)
|
||||
if !p.requestResend() {
|
||||
break
|
||||
return
|
||||
}
|
||||
|
||||
continue
|
||||
}
|
||||
|
||||
checkSum, err := shared.ReceiveBytes(p.port, shared.CheckSumFieldSize, waitForChecksumByte)
|
||||
if err != nil {
|
||||
p.errors <- fmt.Errorf("could not read checksum byte: %v", err)
|
||||
break
|
||||
p.errors <- fmt.Errorf("could not read checksum byte: %w", err)
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
calculated := datastructures.CalculateXorCheckSum([][]byte{lengthBytes, blockData})
|
||||
if checkSum[0] != calculated {
|
||||
p.errors <- fmt.Errorf("CRC error. expected 0x%02x, got 0x%02x", calculated, checkSum[0])
|
||||
if !p.requestResend() {
|
||||
break
|
||||
return
|
||||
}
|
||||
|
||||
continue
|
||||
}
|
||||
|
||||
trailer, err := shared.ReceiveBytes(p.port, shared.TrailerFieldSize, waitForTrailerBytes)
|
||||
if err != nil {
|
||||
p.errors <- fmt.Errorf("could not read trailer bytes: %v", err)
|
||||
break
|
||||
p.errors <- fmt.Errorf("could not read trailer bytes: %w", err)
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
if string(trailer) != shared.MagicTrailer {
|
||||
|
|
@ -131,70 +129,99 @@ func (p *PortHandler) Receive() {
|
|||
shared.MagicTrailer,
|
||||
trailer,
|
||||
)
|
||||
|
||||
if !p.requestResend() {
|
||||
break
|
||||
}
|
||||
|
||||
continue
|
||||
}
|
||||
|
||||
command, err = datastructures.SignerRequestFromData(blockData)
|
||||
if err != nil {
|
||||
p.errors <- fmt.Errorf("failed to parse block as signer request: %v", err)
|
||||
break
|
||||
p.errors <- fmt.Errorf("failed to parse block as signer request: %w", err)
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
if err := shared.SendBytes(p.port, []byte{shared.AckByte}); err != nil {
|
||||
p.errors <- fmt.Errorf("failed to send ACK byte: %v", err)
|
||||
break
|
||||
p.errors <- fmt.Errorf("failed to send ACK byte: %w", err)
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
p.commandChan <- command
|
||||
break
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
p.errors <- errors.New("tried reading block too often")
|
||||
}
|
||||
|
||||
func (p *PortHandler) receiveHandshake() error {
|
||||
header, err := shared.ReceiveBytes(p.port, 1, waitForInitialByte)
|
||||
if err != nil {
|
||||
return fmt.Errorf("could not receive initial byte: %w", err)
|
||||
}
|
||||
|
||||
if header[0] != shared.HandshakeByte {
|
||||
return fmt.Errorf(
|
||||
"unexpected byte 0x%x expected 0x%x",
|
||||
header[0],
|
||||
shared.HandshakeByte,
|
||||
)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (p *PortHandler) requestResend() bool {
|
||||
if err := shared.SendBytes(p.port, []byte{shared.ResendByte}); err != nil {
|
||||
p.errors <- err
|
||||
|
||||
return false
|
||||
}
|
||||
|
||||
return true
|
||||
}
|
||||
|
||||
// Send a response to the client
|
||||
func (p *PortHandler) SendResponse(response *datastructures.SignerResponse) error {
|
||||
if err := shared.SendBytes(p.port, []byte{shared.HandshakeByte}); err != nil {
|
||||
return err
|
||||
return fmt.Errorf("could not send handshake: %w", err)
|
||||
}
|
||||
|
||||
if ack, err := shared.ReceiveBytes(p.port, 1, waitForHandShake); err != nil {
|
||||
return err
|
||||
return fmt.Errorf("could not receive ACK: %w", err)
|
||||
} else if ack[0] != shared.AckByte {
|
||||
return errors.New(fmt.Sprintf("invalid ack byte 0x%02x", ack[0]))
|
||||
return fmt.Errorf("invalid ack byte 0x%02x", ack[0])
|
||||
}
|
||||
|
||||
tryAgain := true
|
||||
for tryAgain {
|
||||
data := response.Serialize()
|
||||
if err := shared.SendBytes(p.port, data); err != nil {
|
||||
return err
|
||||
return fmt.Errorf("could not send data block: %w", err)
|
||||
}
|
||||
|
||||
checksum := datastructures.CalculateXorCheckSum([][]byte{data})
|
||||
if err := shared.SendBytes(p.port, []byte{checksum}); err != nil {
|
||||
return err
|
||||
return fmt.Errorf("could not send checksum: %w", err)
|
||||
}
|
||||
|
||||
if err := shared.SendBytes(p.port, []byte(shared.MagicTrailer)); err != nil {
|
||||
return err
|
||||
return fmt.Errorf("could not send trailer: %w", err)
|
||||
}
|
||||
|
||||
if ack, err := shared.ReceiveBytes(p.port, 1, waitForHandShake); err != nil {
|
||||
return err
|
||||
} else if ack[0] == shared.AckByte {
|
||||
ack, err := shared.ReceiveBytes(p.port, 1, waitForHandShake)
|
||||
if err != nil {
|
||||
return fmt.Errorf("could not receive ACK: %w", err)
|
||||
}
|
||||
|
||||
if ack[0] == shared.AckByte {
|
||||
tryAgain = false
|
||||
} else if ack[0] != 0x11 {
|
||||
return errors.New(fmt.Sprintf("invalid ack byte 0x%02x", ack[0]))
|
||||
} else {
|
||||
return fmt.Errorf("invalid ack byte 0x%02x", ack[0])
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -203,6 +230,7 @@ func (p *PortHandler) SendResponse(response *datastructures.SignerResponse) erro
|
|||
|
||||
func NewSignerProcess(port io.ReadWriteCloser) *PortHandler {
|
||||
errorChan := make(chan error)
|
||||
|
||||
return &PortHandler{
|
||||
port: port,
|
||||
errors: errorChan,
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue