Skip to content

Commit 0e86fa2

Browse files
author
Cruz Monrreal
authored
Merge pull request #6692 from kivaisan/remove_singleton
Lora: Remove singleton pattern
2 parents b33ab74 + 2b2ce30 commit 0e86fa2

File tree

9 files changed

+289
-243
lines changed

9 files changed

+289
-243
lines changed

features/lorawan/LoRaWANInterface.cpp

Lines changed: 20 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -23,14 +23,9 @@
2323

2424
using namespace events;
2525

26-
inline LoRaWANStack& stk_obj()
27-
{
28-
return LoRaWANStack::get_lorawan_stack();
29-
}
30-
3126
LoRaWANInterface::LoRaWANInterface(LoRaRadio& radio)
3227
{
33-
stk_obj().bind_radio_driver(radio);
28+
_lw_stack.bind_radio_driver(radio);
3429
}
3530

3631
LoRaWANInterface::~LoRaWANInterface()
@@ -39,95 +34,95 @@ LoRaWANInterface::~LoRaWANInterface()
3934

4035
lorawan_status_t LoRaWANInterface::initialize(EventQueue *queue)
4136
{
42-
return stk_obj().initialize_mac_layer(queue);
37+
return _lw_stack.initialize_mac_layer(queue);
4338
}
4439

4540
lorawan_status_t LoRaWANInterface::connect()
4641
{
47-
return stk_obj().connect();
42+
return _lw_stack.connect();
4843
}
4944

5045
lorawan_status_t LoRaWANInterface::connect(const lorawan_connect_t &connect)
5146
{
52-
return stk_obj().connect(connect);
47+
return _lw_stack.connect(connect);
5348
}
5449

5550
lorawan_status_t LoRaWANInterface::disconnect()
5651
{
57-
return stk_obj().shutdown();
52+
return _lw_stack.shutdown();
5853
}
5954

6055
lorawan_status_t LoRaWANInterface::add_link_check_request()
6156
{
62-
return stk_obj().set_link_check_request();
57+
return _lw_stack.set_link_check_request();
6358
}
6459

6560
void LoRaWANInterface::remove_link_check_request()
6661
{
67-
stk_obj().remove_link_check_request();
62+
_lw_stack.remove_link_check_request();
6863
}
6964

7065
lorawan_status_t LoRaWANInterface::set_datarate(uint8_t data_rate)
7166
{
72-
return stk_obj().set_channel_data_rate(data_rate);
67+
return _lw_stack.set_channel_data_rate(data_rate);
7368
}
7469

7570
lorawan_status_t LoRaWANInterface::set_confirmed_msg_retries(uint8_t count)
7671
{
77-
return stk_obj().set_confirmed_msg_retry(count);
72+
return _lw_stack.set_confirmed_msg_retry(count);
7873
}
7974

8075
lorawan_status_t LoRaWANInterface::enable_adaptive_datarate()
8176
{
82-
return stk_obj().enable_adaptive_datarate(true);
77+
return _lw_stack.enable_adaptive_datarate(true);
8378
}
8479

8580
lorawan_status_t LoRaWANInterface::disable_adaptive_datarate()
8681
{
87-
return stk_obj().enable_adaptive_datarate(false);
82+
return _lw_stack.enable_adaptive_datarate(false);
8883
}
8984

9085
lorawan_status_t LoRaWANInterface::set_channel_plan(const lorawan_channelplan_t &channel_plan)
9186
{
92-
return stk_obj().add_channels(channel_plan);
87+
return _lw_stack.add_channels(channel_plan);
9388
}
9489

9590
lorawan_status_t LoRaWANInterface::get_channel_plan(lorawan_channelplan_t &channel_plan)
9691
{
97-
return stk_obj().get_enabled_channels(channel_plan);
92+
return _lw_stack.get_enabled_channels(channel_plan);
9893
}
9994

10095
lorawan_status_t LoRaWANInterface::remove_channel(uint8_t id)
10196
{
102-
return stk_obj().remove_a_channel(id);
97+
return _lw_stack.remove_a_channel(id);
10398
}
10499

105100
lorawan_status_t LoRaWANInterface::remove_channel_plan()
106101
{
107-
return stk_obj().drop_channel_list();
102+
return _lw_stack.drop_channel_list();
108103
}
109104

110105
int16_t LoRaWANInterface::send(uint8_t port, const uint8_t* data, uint16_t length, int flags)
111106
{
112-
return stk_obj().handle_tx(port, data, length, flags);
107+
return _lw_stack.handle_tx(port, data, length, flags);
113108
}
114109

115110
int16_t LoRaWANInterface::receive(uint8_t port, uint8_t* data, uint16_t length, int flags)
116111
{
117-
return stk_obj().handle_rx(data, length, port, flags, true);
112+
return _lw_stack.handle_rx(data, length, port, flags, true);
118113
}
119114

120115
int16_t LoRaWANInterface::receive(uint8_t* data, uint16_t length, uint8_t& port, int& flags)
121116
{
122-
return stk_obj().handle_rx(data, length, port, flags, false);
117+
return _lw_stack.handle_rx(data, length, port, flags, false);
123118
}
124119

125120
lorawan_status_t LoRaWANInterface::add_app_callbacks(lorawan_app_callbacks_t *callbacks)
126121
{
127-
return stk_obj().set_lora_callbacks(callbacks);
122+
return _lw_stack.set_lora_callbacks(callbacks);
128123
}
129124

130125
lorawan_status_t LoRaWANInterface::set_device_class(const device_class_t device_class)
131126
{
132-
return stk_obj().set_device_class(device_class);
127+
return _lw_stack.set_device_class(device_class);
133128
}

features/lorawan/LoRaWANInterface.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -434,6 +434,9 @@ class LoRaWANInterface: public LoRaWANBase {
434434
* or other negative error code if request failed.
435435
*/
436436
virtual lorawan_status_t set_device_class(const device_class_t device_class);
437+
438+
private:
439+
LoRaWANStack _lw_stack;
437440
};
438441

439442
#endif /* LORAWANINTERFACE_H_ */

features/lorawan/LoRaWANStack.cpp

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -103,19 +103,9 @@ LoRaWANStack::LoRaWANStack()
103103
LoRaMacPrimitives.mlme_indication = callback(this, &LoRaWANStack::mlme_indication_handler);
104104
}
105105

106-
LoRaWANStack::~LoRaWANStack()
107-
{
108-
}
109-
110106
/*****************************************************************************
111107
* Public member functions *
112108
****************************************************************************/
113-
LoRaWANStack& LoRaWANStack::get_lorawan_stack()
114-
{
115-
static LoRaWANStack _lw_stack;
116-
return _lw_stack;
117-
}
118-
119109
void LoRaWANStack::bind_radio_driver(LoRaRadio& radio)
120110
{
121111
_loramac.bind_radio_driver(radio);

features/lorawan/LoRaWANStack.h

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ class LoRaWANStack: private mbed::NonCopyable<LoRaWANStack> {
7070
} device_states_t;
7171

7272
public:
73-
static LoRaWANStack& get_lorawan_stack();
73+
LoRaWANStack();
7474

7575
/** Binds radio driver to PHY layer.
7676
*
@@ -396,9 +396,6 @@ class LoRaWANStack: private mbed::NonCopyable<LoRaWANStack> {
396396
lorawan_status_t set_device_class(const device_class_t& device_class);
397397

398398
private:
399-
LoRaWANStack();
400-
~LoRaWANStack();
401-
402399
/**
403400
* Checks if the user provided port is valid or not
404401
*/
@@ -465,7 +462,6 @@ class LoRaWANStack: private mbed::NonCopyable<LoRaWANStack> {
465462
void send_automatic_uplink_message(const uint8_t port);
466463

467464
private:
468-
469465
LoRaMac _loramac;
470466
loramac_primitives_t LoRaMacPrimitives;
471467

features/lorawan/lorastack/mac/LoRaMac.cpp

Lines changed: 61 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@ SPDX-License-Identifier: BSD-3-Clause
2424
#include <stdlib.h>
2525

2626
#include "LoRaMac.h"
27-
#include "LoRaMacCrypto.h"
2827

2928
#if defined(FEATURE_COMMON_PAL)
3029
#include "mbed_trace.h"
@@ -37,6 +36,13 @@ SPDX-License-Identifier: BSD-3-Clause
3736

3837
using namespace events;
3938

39+
40+
/*
41+
* LoRaWAN spec 6.2: AppKey is AES-128 key
42+
*/
43+
#define APPKEY_KEY_LENGTH 128
44+
45+
4046
/*!
4147
* Maximum length of the fOpts field
4248
*/
@@ -311,17 +317,22 @@ void LoRaMac::on_radio_rx_done(uint8_t *payload, uint16_t size, int16_t rssi,
311317
return;
312318
}
313319

314-
if (0 != decrypt_join_frame(payload + 1, size - 1,
315-
_params.keys.app_key,
316-
_params.payload + 1)) {
320+
if (0 != _lora_crypto.decrypt_join_frame(payload + 1,
321+
size - 1,
322+
_params.keys.app_key,
323+
APPKEY_KEY_LENGTH,
324+
_params.payload + 1)) {
317325
_mcps_indication.status = LORAMAC_EVENT_INFO_STATUS_CRYPTO_FAIL;
318326
return;
319327
}
320328

321329
_params.payload[0] = mac_hdr.value;
322330

323-
if (0 != compute_join_frame_mic(_params.payload, size - LORAMAC_MFR_LEN,
324-
_params.keys.app_key, &mic)) {
331+
if (0 != _lora_crypto.compute_join_frame_mic(_params.payload,
332+
size - LORAMAC_MFR_LEN,
333+
_params.keys.app_key,
334+
APPKEY_KEY_LENGTH,
335+
&mic)) {
325336
_mcps_indication.status = LORAMAC_EVENT_INFO_STATUS_CRYPTO_FAIL;
326337
return;
327338
}
@@ -333,11 +344,12 @@ void LoRaMac::on_radio_rx_done(uint8_t *payload, uint16_t size, int16_t rssi,
333344

334345
if (mic_rx == mic) {
335346

336-
if (0 != compute_skeys_for_join_frame(_params.keys.app_key,
337-
_params.payload + 1,
338-
_params.dev_nonce,
339-
_params.keys.nwk_skey,
340-
_params.keys.app_skey)) {
347+
if (0 != _lora_crypto.compute_skeys_for_join_frame(_params.keys.app_key,
348+
APPKEY_KEY_LENGTH,
349+
_params.payload + 1,
350+
_params.dev_nonce,
351+
_params.keys.nwk_skey,
352+
_params.keys.app_skey)) {
341353
_mcps_indication.status = LORAMAC_EVENT_INFO_STATUS_CRYPTO_FAIL;
342354
return;
343355
}
@@ -436,15 +448,17 @@ void LoRaMac::on_radio_rx_done(uint8_t *payload, uint16_t size, int16_t rssi,
436448

437449
if (sequence_counter_diff < (1 << 15)) {
438450
downlink_counter += sequence_counter_diff;
439-
compute_mic(payload, size - LORAMAC_MFR_LEN, nwk_skey,
440-
address, DOWN_LINK, downlink_counter, &mic);
451+
_lora_crypto.compute_mic(payload, size - LORAMAC_MFR_LEN,
452+
nwk_skey, sizeof(_params.keys.nwk_skey)*8, // sizeof nws_skey must be the same as _params.keys.nwk_skey
453+
address, DOWN_LINK, downlink_counter, &mic);
441454
if (mic_rx == mic) {
442455
is_mic_ok = true;
443456
}
444457
} else {
445458
uint32_t downlink_counter_tmp = downlink_counter + 0x10000 + (int16_t)sequence_counter_diff;
446-
compute_mic(payload, size - LORAMAC_MFR_LEN, nwk_skey,
447-
address, DOWN_LINK, downlink_counter_tmp, &mic);
459+
_lora_crypto.compute_mic(payload, size - LORAMAC_MFR_LEN,
460+
nwk_skey, sizeof(_params.keys.nwk_skey)*8, // sizeof nws_skey must be the same as _params.keys.nwk_skey
461+
address, DOWN_LINK, downlink_counter_tmp, &mic);
448462

449463
if (mic_rx == mic ) {
450464
is_mic_ok = true;
@@ -539,13 +553,14 @@ void LoRaMac::on_radio_rx_done(uint8_t *payload, uint16_t size, int16_t rssi,
539553

540554
if (port == 0) {
541555
if (fctrl.bits.fopts_len == 0) {
542-
if (0 != decrypt_payload(payload + app_payload_start_index,
543-
frame_len,
544-
nwk_skey,
545-
address,
546-
DOWN_LINK,
547-
downlink_counter,
548-
_params.payload)) {
556+
if (0 != _lora_crypto.decrypt_payload(payload + app_payload_start_index,
557+
frame_len,
558+
nwk_skey,
559+
sizeof(_params.keys.nwk_skey)*8, // sizeof nws_skey must be the same as _params.keys.nwk_skey
560+
address,
561+
DOWN_LINK,
562+
downlink_counter,
563+
_params.payload)) {
549564
_mcps_indication.status = LORAMAC_EVENT_INFO_STATUS_CRYPTO_FAIL;
550565
}
551566

@@ -575,13 +590,14 @@ void LoRaMac::on_radio_rx_done(uint8_t *payload, uint16_t size, int16_t rssi,
575590
}
576591
}
577592

578-
if (0 != decrypt_payload(payload + app_payload_start_index,
579-
frame_len,
580-
app_skey,
581-
address,
582-
DOWN_LINK,
583-
downlink_counter,
584-
_params.payload)) {
593+
if (0 != _lora_crypto.decrypt_payload(payload + app_payload_start_index,
594+
frame_len,
595+
app_skey,
596+
sizeof(_params.keys.app_skey)*8, // sizeof app_skey must be the same as _params.keys.app_skey
597+
address,
598+
DOWN_LINK,
599+
downlink_counter,
600+
_params.payload)) {
585601
_mcps_indication.status = LORAMAC_EVENT_INFO_STATUS_CRYPTO_FAIL;
586602
}
587603

@@ -1563,9 +1579,11 @@ lorawan_status_t LoRaMac::prepare_frame(loramac_mhdr_t *machdr,
15631579
_params.buffer[_params.buffer_pkt_len++] = _params.dev_nonce & 0xFF;
15641580
_params.buffer[_params.buffer_pkt_len++] = (_params.dev_nonce >> 8) & 0xFF;
15651581

1566-
if (0 != compute_join_frame_mic(_params.buffer,
1567-
_params.buffer_pkt_len & 0xFF,
1568-
_params.keys.app_key, &mic)) {
1582+
if (0 != _lora_crypto.compute_join_frame_mic(_params.buffer,
1583+
_params.buffer_pkt_len & 0xFF,
1584+
_params.keys.app_key,
1585+
APPKEY_KEY_LENGTH,
1586+
&mic)) {
15691587
return LORAWAN_STATUS_CRYPTO_FAIL;
15701588
}
15711589

@@ -1646,23 +1664,27 @@ lorawan_status_t LoRaMac::prepare_frame(loramac_mhdr_t *machdr,
16461664
_params.buffer[pkt_header_len++] = frame_port;
16471665

16481666
uint8_t *key = _params.keys.app_skey;
1667+
uint32_t key_length = sizeof(_params.keys.app_skey)*8;
16491668
if (frame_port == 0) {
16501669
mac_commands.clear_command_buffer();
16511670
key = _params.keys.nwk_skey;
1671+
key_length = sizeof(_params.keys.nwk_skey)*8;
16521672
}
1653-
if (0 != encrypt_payload((uint8_t*) payload, _params.payload_length,
1654-
key, _params.dev_addr, UP_LINK,
1655-
_params.ul_frame_counter,
1656-
&_params.buffer[pkt_header_len])) {
1673+
if (0 != _lora_crypto.encrypt_payload((uint8_t*) payload, _params.payload_length,
1674+
key, key_length,
1675+
_params.dev_addr, UP_LINK,
1676+
_params.ul_frame_counter,
1677+
&_params.buffer[pkt_header_len])) {
16571678
status = LORAWAN_STATUS_CRYPTO_FAIL;
16581679
}
16591680
}
16601681

16611682
_params.buffer_pkt_len = pkt_header_len + _params.payload_length;
16621683

1663-
if (0 != compute_mic(_params.buffer, _params.buffer_pkt_len,
1664-
_params.keys.nwk_skey, _params.dev_addr,
1665-
UP_LINK, _params.ul_frame_counter, &mic)) {
1684+
if (0 != _lora_crypto.compute_mic(_params.buffer, _params.buffer_pkt_len,
1685+
_params.keys.nwk_skey, sizeof(_params.keys.nwk_skey)*8,
1686+
_params.dev_addr,
1687+
UP_LINK, _params.ul_frame_counter, &mic)) {
16661688
status = LORAWAN_STATUS_CRYPTO_FAIL;
16671689
}
16681690

features/lorawan/lorastack/mac/LoRaMac.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,8 @@
5050

5151
#include "LoRaMacChannelPlan.h"
5252
#include "LoRaMacCommand.h"
53+
#include "LoRaMacCrypto.h"
54+
5355

5456
class LoRaMac {
5557

@@ -542,6 +544,11 @@ class LoRaMac {
542544
*/
543545
LoRaMacChannelPlan channel_plan;
544546

547+
/**
548+
* Crypto handling subsystem
549+
*/
550+
LoRaMacCrypto _lora_crypto;
551+
545552
/**
546553
* Central MAC layer data storage
547554
*/

0 commit comments

Comments
 (0)