diff --git a/pkg/encoding/lorawan/mac.go b/pkg/encoding/lorawan/mac.go index ece8e44004..6338a32470 100644 --- a/pkg/encoding/lorawan/mac.go +++ b/pkg/encoding/lorawan/mac.go @@ -1430,6 +1430,12 @@ var DefaultMACCommands = MACCommandSpec{ UplinkLength: 6, AppendUplink: func(phy band.Band, b []byte, cmd *ttnpb.MACCommand) ([]byte, error) { pld := cmd.GetRelayNotifyNewEndDeviceReq() + if n := len(pld.DevAddr); n != 4 { + return nil, errExpectedLengthEncodedEqual("DevAddr", 4)(n) + } + devAddr := make([]byte, 4) + copyReverse(devAddr, pld.DevAddr) + b = append(b, devAddr...) var powerLevel uint16 if pld.Snr < -20 || pld.Snr > 11 { return nil, errExpectedBetween("SNR", -20, 11)(pld.Snr) @@ -1440,12 +1446,6 @@ var DefaultMACCommands = MACCommandSpec{ } powerLevel |= uint16(-pld.Rssi-15) & 0x7f << 5 b = byteutil.AppendUint16(b, powerLevel, 2) - if n := len(pld.DevAddr); n != 4 { - return nil, errExpectedLengthEncodedEqual("DevAddr", 4)(n) - } - devAddr := make([]byte, 4) - copyReverse(devAddr, pld.DevAddr) - b = append(b, devAddr...) return b, nil }, UnmarshalUplink: newMACUnmarshaler( @@ -1457,11 +1457,11 @@ var DefaultMACCommands = MACCommandSpec{ cmd.Payload = &ttnpb.MACCommand_RelayNotifyNewEndDeviceReq_{ RelayNotifyNewEndDeviceReq: req, } - powerLevel := byteutil.ParseUint16(b[0:2]) + req.DevAddr = make([]byte, 4) + copyReverse(req.DevAddr, b[0:4]) + powerLevel := byteutil.ParseUint16(b[4:6]) req.Snr = int32(powerLevel&0x1f) - 20 req.Rssi = -int32(powerLevel>>5&0x7f) - 15 - req.DevAddr = make([]byte, 4) - copyReverse(req.DevAddr, b[2:6]) return nil }, ), diff --git a/pkg/encoding/lorawan/mac_test.go b/pkg/encoding/lorawan/mac_test.go index 189fd73fc9..c5e4682e28 100644 --- a/pkg/encoding/lorawan/mac_test.go +++ b/pkg/encoding/lorawan/mac_test.go @@ -597,7 +597,7 @@ func TestLoRaWANEncodingMAC(t *testing.T) { Snr: 6, Rssi: -64, }, - []byte{0x46, 0x3a, 0x06, 0x44, 0x43, 0x42, 0x41}, + []byte{0x46, 0x44, 0x43, 0x42, 0x41, 0x3a, 0x06}, true, }, } {