forked from zephyrproject-rtos/zephyr
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathlw_priv.c
148 lines (137 loc) · 5.59 KB
/
lw_priv.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
/*
* Copyright (c) 2020 Manivannan Sadhasivam <mani@kernel.org>
*
* SPDX-License-Identifier: Apache-2.0
*/
#include <errno.h>
#include <zephyr.h>
#include "lw_priv.h"
#include <LoRaMac.h>
static const char *const status2str[] = {
[LORAMAC_STATUS_OK] = "OK",
[LORAMAC_STATUS_BUSY] = "Busy",
[LORAMAC_STATUS_SERVICE_UNKNOWN] = "Service unknown",
[LORAMAC_STATUS_PARAMETER_INVALID] = "Parameter invalid",
[LORAMAC_STATUS_FREQUENCY_INVALID] = "Frequency invalid",
[LORAMAC_STATUS_DATARATE_INVALID] = "Datarate invalid",
[LORAMAC_STATUS_FREQ_AND_DR_INVALID] = "Frequency or datarate invalid",
[LORAMAC_STATUS_NO_NETWORK_JOINED] = "No network joined",
[LORAMAC_STATUS_LENGTH_ERROR] = "Length error",
[LORAMAC_STATUS_REGION_NOT_SUPPORTED] = "Region not supported",
[LORAMAC_STATUS_SKIPPED_APP_DATA] = "Skipped APP data",
[LORAMAC_STATUS_DUTYCYCLE_RESTRICTED] = "Duty-cycle restricted",
[LORAMAC_STATUS_NO_CHANNEL_FOUND] = "No channel found",
[LORAMAC_STATUS_NO_FREE_CHANNEL_FOUND] = "No free channel found",
[LORAMAC_STATUS_BUSY_BEACON_RESERVED_TIME] =
"Busy beacon reserved time",
[LORAMAC_STATUS_BUSY_PING_SLOT_WINDOW_TIME] =
"Busy ping-slot window time",
[LORAMAC_STATUS_BUSY_UPLINK_COLLISION] = "Busy uplink collision",
[LORAMAC_STATUS_CRYPTO_ERROR] = "Crypto error",
[LORAMAC_STATUS_FCNT_HANDLER_ERROR] = "FCnt handler error",
[LORAMAC_STATUS_MAC_COMMAD_ERROR] = "MAC command error",
[LORAMAC_STATUS_CLASS_B_ERROR] = "ClassB error",
[LORAMAC_STATUS_CONFIRM_QUEUE_ERROR] = "Confirm queue error",
[LORAMAC_STATUS_MC_GROUP_UNDEFINED] = "Multicast group undefined",
[LORAMAC_STATUS_ERROR] = "Unknown error",
};
const char *lorawan_status2str(unsigned int status)
{
if (status < ARRAY_SIZE(status2str)) {
return status2str[status];
} else {
return "Unknown status!";
}
}
static const char *const eventinfo2str[] = {
[LORAMAC_EVENT_INFO_STATUS_OK] = "OK",
[LORAMAC_EVENT_INFO_STATUS_ERROR] = "Error",
[LORAMAC_EVENT_INFO_STATUS_TX_TIMEOUT] = "Tx timeout",
[LORAMAC_EVENT_INFO_STATUS_RX1_TIMEOUT] = "Rx 1 timeout",
[LORAMAC_EVENT_INFO_STATUS_RX2_TIMEOUT] = "Rx 2 timeout",
[LORAMAC_EVENT_INFO_STATUS_RX1_ERROR] = "Rx1 error",
[LORAMAC_EVENT_INFO_STATUS_RX2_ERROR] = "Rx2 error",
[LORAMAC_EVENT_INFO_STATUS_JOIN_FAIL] = "Join failed",
[LORAMAC_EVENT_INFO_STATUS_DOWNLINK_REPEATED] = "Downlink repeated",
[LORAMAC_EVENT_INFO_STATUS_TX_DR_PAYLOAD_SIZE_ERROR] =
"Tx DR payload size error",
[LORAMAC_EVENT_INFO_STATUS_ADDRESS_FAIL] = "Address fail",
[LORAMAC_EVENT_INFO_STATUS_MIC_FAIL] = "MIC fail",
[LORAMAC_EVENT_INFO_STATUS_MULTICAST_FAIL] = "Multicast fail",
[LORAMAC_EVENT_INFO_STATUS_BEACON_LOCKED] = "Beacon locked",
[LORAMAC_EVENT_INFO_STATUS_BEACON_LOST] = "Beacon lost",
[LORAMAC_EVENT_INFO_STATUS_BEACON_NOT_FOUND] = "Beacon not found",
};
const char *lorawan_eventinfo2str(unsigned int status)
{
if (status < ARRAY_SIZE(eventinfo2str)) {
return eventinfo2str[status];
} else {
return "Unknown event!";
}
}
/*
* MAC status and Event status to Zephyr error code conversion.
* Direct mapping is not possible as statuses often indicate the domain from
* which the error originated rather than its cause or meaning. -EINVAL has been
* used as a general error code because those usually result from incorrect
* configuration.
*/
static const int status2errno[] = {
[LORAMAC_STATUS_BUSY] = -EBUSY,
[LORAMAC_STATUS_SERVICE_UNKNOWN] = -ENOPROTOOPT,
[LORAMAC_STATUS_PARAMETER_INVALID] = -EINVAL,
[LORAMAC_STATUS_FREQUENCY_INVALID] = -EINVAL,
[LORAMAC_STATUS_DATARATE_INVALID] = -EINVAL,
[LORAMAC_STATUS_FREQ_AND_DR_INVALID] = -EINVAL,
[LORAMAC_STATUS_NO_NETWORK_JOINED] = -ENOTCONN,
[LORAMAC_STATUS_LENGTH_ERROR] = -EMSGSIZE,
[LORAMAC_STATUS_REGION_NOT_SUPPORTED] = -EPFNOSUPPORT,
[LORAMAC_STATUS_SKIPPED_APP_DATA] = -EMSGSIZE,
[LORAMAC_STATUS_DUTYCYCLE_RESTRICTED] = -ECONNREFUSED,
[LORAMAC_STATUS_NO_CHANNEL_FOUND] = -ENOTCONN,
[LORAMAC_STATUS_NO_FREE_CHANNEL_FOUND] = -ENOTCONN,
[LORAMAC_STATUS_BUSY_BEACON_RESERVED_TIME] = -EBUSY,
[LORAMAC_STATUS_BUSY_PING_SLOT_WINDOW_TIME] = -EBUSY,
[LORAMAC_STATUS_BUSY_UPLINK_COLLISION] = -EBUSY,
[LORAMAC_STATUS_CRYPTO_ERROR] = -EINVAL,
[LORAMAC_STATUS_FCNT_HANDLER_ERROR] = -EINVAL,
[LORAMAC_STATUS_MAC_COMMAD_ERROR] = -EINVAL,
[LORAMAC_STATUS_CLASS_B_ERROR] = -EINVAL,
[LORAMAC_STATUS_CONFIRM_QUEUE_ERROR] = -EINVAL,
[LORAMAC_STATUS_MC_GROUP_UNDEFINED] = -EINVAL,
};
const int lorawan_status2errno(unsigned int status)
{
if (status < ARRAY_SIZE(status2errno) && status2errno[status] != 0) {
return status2errno[status];
} else {
return status == LORAMAC_STATUS_OK ? 0 : -EINVAL;
}
}
static const int eventinfo2errno[] = {
[LORAMAC_EVENT_INFO_STATUS_ERROR] = -EINVAL,
[LORAMAC_EVENT_INFO_STATUS_TX_TIMEOUT] = -ETIMEDOUT,
[LORAMAC_EVENT_INFO_STATUS_RX1_TIMEOUT] = -ETIMEDOUT,
[LORAMAC_EVENT_INFO_STATUS_RX2_TIMEOUT] = -ETIMEDOUT,
[LORAMAC_EVENT_INFO_STATUS_RX1_ERROR] = -EINVAL,
[LORAMAC_EVENT_INFO_STATUS_RX2_ERROR] = -EINVAL,
[LORAMAC_EVENT_INFO_STATUS_JOIN_FAIL] = -EINVAL,
[LORAMAC_EVENT_INFO_STATUS_DOWNLINK_REPEATED] = -ECONNRESET,
[LORAMAC_EVENT_INFO_STATUS_TX_DR_PAYLOAD_SIZE_ERROR] = -EMSGSIZE,
[LORAMAC_EVENT_INFO_STATUS_ADDRESS_FAIL] = -EACCES,
[LORAMAC_EVENT_INFO_STATUS_MIC_FAIL] = -EACCES,
[LORAMAC_EVENT_INFO_STATUS_MULTICAST_FAIL] = -EINVAL,
[LORAMAC_EVENT_INFO_STATUS_BEACON_LOCKED] = -EINVAL,
[LORAMAC_EVENT_INFO_STATUS_BEACON_LOST] = -EINVAL,
[LORAMAC_EVENT_INFO_STATUS_BEACON_NOT_FOUND] = -EINVAL,
};
const int lorawan_eventinfo2errno(unsigned int status)
{
if (status < ARRAY_SIZE(eventinfo2errno) &&
eventinfo2errno[status] != 0) {
return eventinfo2errno[status];
} else {
return status == LORAMAC_EVENT_INFO_STATUS_OK ? 0 : -EINVAL;
}
}