MCPcopy Create free account
hub / github.com/TheThingsNetwork/lorawan-stack / decodeDownlink

Function decodeDownlink

cmd/ttn-lw-cli/commands/lorawan.go:166–218  ·  view source on GitHub ↗
(msg *ttnpb.Message, config lorawanConfig)

Source from the content-addressed store, hash-verified

164}
165
166func decodeDownlink(msg *ttnpb.Message, config lorawanConfig) (*lorawanDecodedFrame, error) {
167 pld := msg.GetMacPayload()
168 devAddr := types.MustDevAddr(pld.FHdr.DevAddr).OrZero()
169 macBuf := getMacBuffer(pld)
170 cmdsInFOpts := len(pld.FHdr.FOpts) > 0
171 if len(macBuf) > 0 && (!cmdsInFOpts || macspec.EncryptFOpts(config.MACVersion)) && !config.NwkSKey.IsZero() {
172 logger.Debug("Decrypting MAC buffer")
173 encOpts := macspec.EncryptionOptions(config.MACVersion, macspec.DownlinkFrame, pld.FPort, cmdsInFOpts)
174 for msb := range uint32(0xffff) {
175 fCnt := msb<<16 | pld.FHdr.FCnt
176 macBuf, err := crypto.DecryptDownlink(config.NwkSKey, devAddr, fCnt, macBuf, encOpts...)
177 if err == nil {
178 setMacBuffer(pld, macBuf)
179 break
180 }
181 logger.WithField("f_cnt", fCnt).Debug("Failed attempt to decrypt MAC buffer")
182 }
183 }
184 var macCommands []*ttnpb.MACCommand
185 for r := bytes.NewReader(macBuf); r.Len() > 0; {
186 cmd := &ttnpb.MACCommand{}
187 if err := lorawan.DefaultMACCommands.ReadDownlink(config.Band, r, cmd); err != nil {
188 logger.WithError(err).Warn("Failed to read MAC command")
189 } else {
190 macCommands = append(macCommands, cmd)
191 }
192 }
193 if pld.FPort > 0 {
194 if config.AppSKey.IsZero() {
195 logger.Warn("No AppSKey provided, skipping application payload decryption")
196 } else {
197 logger.Debug("Decrypting application payload")
198 buf, err := crypto.DecryptDownlink(config.AppSKey, devAddr, pld.FHdr.FCnt, pld.FrmPayload)
199 if err != nil {
200 logger.WithField("f_cnt", pld.FHdr.FCnt).Debug("Failed attempt to decrypt FrmPayload")
201 } else {
202 pld.FrmPayload = buf
203 }
204 }
205 }
206
207 msg.Payload = &ttnpb.Message_MacPayload{
208 MacPayload: pld,
209 }
210
211 if !config.FNwkSIntKey.IsZero() {
212 logger.Debug("Verification of the uplink message MIC is not implemented yet")
213 }
214 return &lorawanDecodedFrame{
215 Message: msg,
216 MACCommands: macCommands,
217 }, nil
218}
219
220func decodeFrame(msg *ttnpb.Message, config lorawanConfig) (*lorawanDecodedFrame, error) {
221 switch msg.MHdr.MType {

Callers 1

decodeFrameFunction · 0.85

Calls 15

MustDevAddrFunction · 0.92
EncryptFOptsFunction · 0.92
EncryptionOptionsFunction · 0.92
DecryptDownlinkFunction · 0.92
getMacBufferFunction · 0.85
setMacBufferFunction · 0.85
ReadDownlinkMethod · 0.80
IsZeroMethod · 0.65
DebugMethod · 0.65
WithFieldMethod · 0.65
WarnMethod · 0.65
WithErrorMethod · 0.65

Tested by

no test coverage detected