Skip to content

Commit 3739734

Browse files
committed
Support for ThreadX and NetX Duo
1 parent b8024ea commit 3739734

File tree

11 files changed

+258
-117
lines changed

11 files changed

+258
-117
lines changed

Makefile

Lines changed: 93 additions & 94 deletions
Large diffs are not rendered by default.

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,7 @@ topic.
115115
| `DEBUG` | | Compiler debugging flag to use (default `-ggdb`) |
116116
| `OPTIM` | | The optimizer flag to use (default `-O3`) |
117117
| `HOST` | | The target host tuple, for cross-compilation (default unset, i.e. native targeting) |
118-
| `RUNTIME` | | The target runtime ecosystem -- default unset, `FreeRTOS-lwIP` and `Linux-lwIP` are recognized |
118+
| `RUNTIME` | | The target runtime ecosystem -- default unset, `FreeRTOS-lwIP`, `Linux-lwIP` and `ThreadX-NetXDuo` are recognized |
119119
| `C_WARNFLAGS` | | The warning flags to use (overriding the generally applicable defaults) |
120120
| `STATIC` | | Build statically linked unit tests |
121121
| `STRIPPED` | | Strip binaries of debugging symbols |

build.bat

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
cls
2+
make ^
3+
CC=d:/mingw/rx/4.8.2a/bin/gcc ^
4+
AR=d:/mingw/rx/4.8.2a/bin/ar ^
5+
STATIC=1 ^
6+
OPTIM=-O2 ^
7+
RUNTIME=ThreadX-NetXDuo ^
8+
THREADX_TOP=../../../bsp/xlogic/rx72n/ ^
9+
NEED_THREADX_TYPES=1 ^
10+
THREADX_TYPES_TOP=../../../bsp/src/common ^
11+
NETXDUO_TOP=../../../bsp/src/ethernet ^
12+
EXTRA_CFLAGS="-Bd:/mingw/rx/4.8.2a/bin -gstabs -g3 -std=gnu99 -mbig-endian-data -fno-leading-underscore -ftabstop=4 -fno-common -fno-use-linker-plugin -fno-leading-underscore -fstrict-volatile-bitfields -D_REENT_SMALL" ^
13+
C_WARNFLAGS="-Wdeclaration-after-statement -Wmissing-prototypes -Wnested-externs -Wredundant-decls -Wshadow -Wstrict-prototypes -Wundef -Wno-format -Wno-main -Wno-maybe-uninitialized -Wno-parentheses -Wno-strict-aliasing" ^
14+
V=1
15+
16+
REM d:/mingw/rx/4.8.2a/bin/gcc -Bd:/mingw/rx/4.8.2a/bin
17+
REM d:/mingw/rx/4.8.2a/bin/objcopy.exe -I elf32-rx-be-ns
18+
REM d:/mingw/rx/4.8.2a/bin/ld -Ld:/mingw/rx/4.8.2a/lib --warn-common --oformat=elf32-rx-be

src/json/load_config.c

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,10 @@
3333

3434
#ifdef WOLFSENTRY_LWIP
3535
#include "lwip/sockets.h"
36+
#elif defined(WOLFSENTRY_NETXDUO)
37+
#include "nxd_bsd.h"
38+
/* undef OK this conflicts with the _OK macros in wolfsentry_errcodes.h */
39+
#undef OK
3640
#else
3741
#include <arpa/inet.h>
3842
#include <sys/socket.h>
@@ -1294,7 +1298,7 @@ static wolfsentry_errcode_t handle_user_value_clause(struct wolfsentry_json_proc
12941298
WOLFSENTRY_ERROR_RERETURN(ret);
12951299
case JSON_FALSE:
12961300
ret = wolfsentry_user_value_store_bool(
1297-
JPS_WOLFSENTRY_CONTEXT_ARGS_OUT,
1301+
JPS_WOLFSENTRY_CONTEXT_ARGS_OUT,
12981302
jps->cur_keyname,
12991303
WOLFSENTRY_LENGTH_NULL_TERMINATED,
13001304
WOLFSENTRY_KV_FALSE,
@@ -1303,7 +1307,7 @@ static wolfsentry_errcode_t handle_user_value_clause(struct wolfsentry_json_proc
13031307
WOLFSENTRY_ERROR_RERETURN(ret);
13041308
case JSON_TRUE:
13051309
ret = wolfsentry_user_value_store_bool(
1306-
JPS_WOLFSENTRY_CONTEXT_ARGS_OUT,
1310+
JPS_WOLFSENTRY_CONTEXT_ARGS_OUT,
13071311
jps->cur_keyname,
13081312
WOLFSENTRY_LENGTH_NULL_TERMINATED,
13091313
WOLFSENTRY_KV_TRUE,
@@ -1316,7 +1320,7 @@ static wolfsentry_errcode_t handle_user_value_clause(struct wolfsentry_json_proc
13161320
if ((ret = convert_sint64(json_type, data, data_size, &i)) < 0)
13171321
break;
13181322
ret = wolfsentry_user_value_store_sint(
1319-
JPS_WOLFSENTRY_CONTEXT_ARGS_OUT,
1323+
JPS_WOLFSENTRY_CONTEXT_ARGS_OUT,
13201324
jps->cur_keyname,
13211325
WOLFSENTRY_LENGTH_NULL_TERMINATED,
13221326
i,
@@ -1327,7 +1331,7 @@ static wolfsentry_errcode_t handle_user_value_clause(struct wolfsentry_json_proc
13271331
if ((ret = convert_double(json_type, data, data_size, &d)) < 0)
13281332
WOLFSENTRY_ERROR_RERETURN(ret);
13291333
ret = wolfsentry_user_value_store_double(
1330-
JPS_WOLFSENTRY_CONTEXT_ARGS_OUT,
1334+
JPS_WOLFSENTRY_CONTEXT_ARGS_OUT,
13311335
jps->cur_keyname,
13321336
WOLFSENTRY_LENGTH_NULL_TERMINATED,
13331337
d,
@@ -1339,7 +1343,7 @@ static wolfsentry_errcode_t handle_user_value_clause(struct wolfsentry_json_proc
13391343
if (data_size >= WOLFSENTRY_KV_MAX_VALUE_BYTES)
13401344
WOLFSENTRY_ERROR_RETURN(STRING_ARG_TOO_LONG);
13411345
ret = wolfsentry_user_value_store_string(
1342-
JPS_WOLFSENTRY_CONTEXT_ARGS_OUT,
1346+
JPS_WOLFSENTRY_CONTEXT_ARGS_OUT,
13431347
jps->cur_keyname,
13441348
WOLFSENTRY_LENGTH_NULL_TERMINATED,
13451349
(const char *)data,
@@ -1454,7 +1458,7 @@ static wolfsentry_errcode_t handle_user_value_clause(struct wolfsentry_json_proc
14541458
if ((ret = convert_sint64(json_type, data, data_size, &i)) < 0)
14551459
WOLFSENTRY_ERROR_RERETURN(ret);
14561460
WOLFSENTRY_ERROR_RERETURN(wolfsentry_user_value_store_sint(
1457-
JPS_WOLFSENTRY_CONTEXT_ARGS_OUT,
1461+
JPS_WOLFSENTRY_CONTEXT_ARGS_OUT,
14581462
jps->o_u_c.user_value.label,
14591463
jps->o_u_c.user_value.label_len,
14601464
i,
@@ -1465,7 +1469,7 @@ static wolfsentry_errcode_t handle_user_value_clause(struct wolfsentry_json_proc
14651469
if ((ret = convert_double(json_type, data, data_size, &d)) < 0)
14661470
WOLFSENTRY_ERROR_RERETURN(ret);
14671471
WOLFSENTRY_ERROR_RERETURN(wolfsentry_user_value_store_double(
1468-
JPS_WOLFSENTRY_CONTEXT_ARGS_OUT,
1472+
JPS_WOLFSENTRY_CONTEXT_ARGS_OUT,
14691473
jps->o_u_c.user_value.label,
14701474
jps->o_u_c.user_value.label_len,
14711475
d,
@@ -1475,7 +1479,7 @@ static wolfsentry_errcode_t handle_user_value_clause(struct wolfsentry_json_proc
14751479
if (data_size >= WOLFSENTRY_KV_MAX_VALUE_BYTES)
14761480
WOLFSENTRY_ERROR_RETURN(STRING_ARG_TOO_LONG);
14771481
WOLFSENTRY_ERROR_RERETURN(wolfsentry_user_value_store_string(
1478-
JPS_WOLFSENTRY_CONTEXT_ARGS_OUT,
1482+
JPS_WOLFSENTRY_CONTEXT_ARGS_OUT,
14791483
jps->o_u_c.user_value.label,
14801484
jps->o_u_c.user_value.label_len,
14811485
(const char *)data,
@@ -1486,7 +1490,7 @@ static wolfsentry_errcode_t handle_user_value_clause(struct wolfsentry_json_proc
14861490
if (data_size >= WOLFSENTRY_KV_MAX_VALUE_BYTES)
14871491
WOLFSENTRY_ERROR_RETURN(STRING_ARG_TOO_LONG);
14881492
WOLFSENTRY_ERROR_RERETURN(wolfsentry_user_value_store_bytes_base64(
1489-
JPS_WOLFSENTRY_CONTEXT_ARGS_OUT,
1493+
JPS_WOLFSENTRY_CONTEXT_ARGS_OUT,
14901494
jps->o_u_c.user_value.label,
14911495
jps->o_u_c.user_value.label_len,
14921496
(const char *)data,

src/routes.c

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,15 +22,17 @@
2222

2323
#define WOLFSENTRY_SOURCE_ID WOLFSENTRY_SOURCE_ID_ROUTES_C
2424

25-
#include "wolfsentry_internal.h"
26-
2725
#ifndef WOLFSENTRY_NO_ALLOCA
2826
#include <alloca.h>
2927
#endif
3028

3129
#ifdef WOLFSENTRY_LWIP
3230
#include <lwip/inet.h>
3331
#include <lwip/sockets.h>
32+
#elif defined(WOLFSENTRY_NETXDUO)
33+
#include "nxd_bsd.h"
34+
/* undef OK this conflicts with the _OK macros in wolfsentry_errcodes.h */
35+
#undef OK
3436
#else
3537
#include <netinet/in.h>
3638
#include <arpa/inet.h>
@@ -40,6 +42,8 @@
4042
#include <netdb.h>
4143
#endif
4244

45+
#include "wolfsentry_internal.h"
46+
4347
static inline int cmp_addrs_prefixful(
4448
const byte *left_addr,
4549
int left_addr_len,

src/wolfsentry_util.c

Lines changed: 86 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -812,8 +812,10 @@ WOLFSENTRY_API wolfsentry_errcode_t wolfsentry_init_thread_context(struct wolfse
812812
* the held lock can be safely locked recursively from within the
813813
* interrupt context.
814814
*/
815-
if (thread_context->id == (wolfsentry_thread_id_t)((uintptr_t)WOLFSENTRY_THREAD_NO_ID - 0xffffff))
816-
WOLFSENTRY_ATOMIC_INCREMENT(fallback_thread_id_counter, 0xffffff);
815+
if (thread_context->id == (wolfsentry_thread_id_t)((uintptr_t)WOLFSENTRY_THREAD_NO_ID - 0xffffff)) {
816+
(void)WOLFSENTRY_ATOMIC_INCREMENT(fallback_thread_id_counter, 0xffffff);
817+
}
818+
(void)fallback_thread_id_counter;
817819
WOLFSENTRY_SUCCESS_RETURN(USED_FALLBACK);
818820
} else
819821
WOLFSENTRY_RETURN_OK;
@@ -1509,6 +1511,73 @@ static int freertos_sem_destroy( sem_t * sem )
15091511

15101512
#define sem_destroy freertos_sem_destroy
15111513

1514+
#elif defined(THREADX)
1515+
1516+
#ifndef ETIMEDOUT
1517+
#define ETIMEDOUT 110 /* Connection timed out */
1518+
#endif
1519+
1520+
#define sem_init threadx_sem_init
1521+
static int threadx_sem_init( sem_t * sem,
1522+
int pshared,
1523+
unsigned value )
1524+
{
1525+
(void)pshared;
1526+
if (tx_semaphore_create(sem, NULL, value) != TX_SUCCESS) {
1527+
errno = EINVAL;
1528+
WOLFSENTRY_RETURN_VALUE(-1);
1529+
}
1530+
WOLFSENTRY_RETURN_VALUE(0);
1531+
}
1532+
#define sem_post threadx_sem_post
1533+
static int threadx_sem_post( sem_t * sem )
1534+
{
1535+
if (tx_semaphore_put(sem) != TX_SUCCESS) {
1536+
errno = EINVAL;
1537+
WOLFSENTRY_RETURN_VALUE(-1);
1538+
}
1539+
WOLFSENTRY_RETURN_VALUE(0);
1540+
}
1541+
#define sem_timedwait threadx_sem_timedwait
1542+
static int threadx_sem_timedwait( sem_t * sem,
1543+
const struct timespec * abstime )
1544+
{
1545+
if (tx_semaphore_get(sem, (uint32_t)(TX_TICK_TIME_MS *
1546+
(abstime->tv_sec * 1000) + (abstime->tv_nsec / 1000000))) != TX_SUCCESS) {
1547+
errno = EINVAL;
1548+
WOLFSENTRY_RETURN_VALUE(-1);
1549+
}
1550+
WOLFSENTRY_RETURN_VALUE(0);
1551+
}
1552+
#define sem_wait threadx_sem_wait
1553+
static int threadx_sem_wait( sem_t * sem )
1554+
{
1555+
if (tx_semaphore_get(sem, TX_WAIT_FOREVER) != TX_SUCCESS) {
1556+
errno = EINVAL;
1557+
WOLFSENTRY_RETURN_VALUE(-1);
1558+
}
1559+
WOLFSENTRY_RETURN_VALUE(0);
1560+
}
1561+
#define sem_trywait threadx_sem_trywait
1562+
static int threadx_sem_trywait( sem_t * sem )
1563+
{
1564+
if (tx_semaphore_get(sem, 0) != TX_SUCCESS) {
1565+
errno = EINVAL;
1566+
WOLFSENTRY_RETURN_VALUE(-1);
1567+
}
1568+
WOLFSENTRY_RETURN_VALUE(0);
1569+
}
1570+
static int threadx_sem_destroy( sem_t * sem )
1571+
{
1572+
if (tx_semaphore_delete(sem) != TX_SUCCESS) {
1573+
errno = EINVAL;
1574+
WOLFSENTRY_RETURN_VALUE(-1);
1575+
}
1576+
WOLFSENTRY_RETURN_VALUE(0);
1577+
}
1578+
1579+
#define sem_destroy threadx_sem_destroy
1580+
15121581
#else
15131582

15141583
#error Semaphore builtins not implemented for target -- build wolfSentry with -DWOLFSENTRY_NO_SEM_BUILTIN, and supply semaphore implementation with struct wolfsentry_host_platform_interface argument to wolfsentry_init().
@@ -2847,7 +2916,7 @@ WOLFSENTRY_API wolfsentry_errcode_t wolfsentry_lock_shared2mutex_abstimed(struct
28472916
WOLFSENTRY_ERROR_RETURN(SYS_OP_FATAL);
28482917
}
28492918
}
2850-
} else
2919+
} else
28512920
ret = sem_timedwait(&lock->sem_read2write_waiters, abs_timeout);
28522921

28532922
if (ret < 0) {
@@ -3317,6 +3386,19 @@ static wolfsentry_errcode_t wolfsentry_builtin_get_time(void *context, wolfsentr
33173386
WOLFSENTRY_RETURN_OK;
33183387
}
33193388

3389+
#elif defined(THREADX)
3390+
3391+
static wolfsentry_errcode_t wolfsentry_builtin_get_time(void *context, wolfsentry_time_t *now) {
3392+
struct timespec ts;
3393+
uint32_t tick_count;
3394+
(void)context;
3395+
tick_count = tx_time_get();
3396+
ts.tv_sec = (long)tick_count / TX_TICK_TIME_MS;
3397+
ts.tv_nsec = (long)(tick_count % TX_TICK_TIME_MS) * 1000000;
3398+
*now = ((wolfsentry_time_t)ts.tv_sec * (wolfsentry_time_t)1000000) + ((wolfsentry_time_t)ts.tv_nsec / (wolfsentry_time_t)1000);
3399+
WOLFSENTRY_RETURN_OK;
3400+
}
3401+
33203402
#else
33213403

33223404
#include <time.h>
@@ -4264,7 +4346,7 @@ WOLFSENTRY_API wolfsentry_errcode_t wolfsentry_base64_decode(const char *src, si
42644346
const char *src_end = src + src_len;
42654347
size_t dest_len = 0;
42664348

4267-
if (WOLFSENTRY_BASE64_DECODED_BUFSPC(src, src_len) > *dest_spc)
4349+
if (WOLFSENTRY_BASE64_DECODED_BUFSPC(src, (int)src_len) > (int)*dest_spc)
42684350
WOLFSENTRY_ERROR_RETURN(BUFFER_TOO_SMALL);
42694351

42704352
for (; src < src_end; ++src) {

tests/unittests.c

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,13 @@ int lwip_inet_pton(int af, const char *src, void *dst) {
6969

7070
#endif /* !TEST_LWIP */
7171

72+
#elif defined(WOLFSENTRY_NETXDUO)
73+
74+
#include "nxd_bsd.h"
75+
/* undef OK this conflicts with the _OK macros in wolfsentry_errcodes.h */
76+
#undef OK
77+
78+
7279
#else /* !WOLFSENTRY_LWIP */
7380

7481
#include <sys/socket.h>

wolfsentry/wolfsentry.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3341,7 +3341,7 @@ WOLFSENTRY_API wolfsentry_errcode_t wolfsentry_user_values_iterate_end(
33413341
(((((len)+3)/4)*3) - ((len) > 1 ? \
33423342
((buf)[(len)-1] == '=') : \
33433343
0) \
3344-
- ((len) > 2 ? ((buf)[(len)-2] == '=') : 0)) \
3344+
- ((len) > 2 ? ((buf)[(len)-2] == '=') : 0))
33453345
/*!< \brief Given valid base64 string `buf` of length `len`, evaluates to the exact decoded length. @hideinitializer */
33463346

33473347
WOLFSENTRY_API wolfsentry_errcode_t wolfsentry_base64_decode(

wolfsentry/wolfsentry_errcodes.h

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@
3939
#endif
4040

4141
typedef int32_t wolfsentry_errcode_t; /*!< \brief The structured result code type for wolfSentry. It encodes a failure or success code, a source code file ID, and a line number. */
42-
#ifdef FREERTOS
42+
#if defined(FREERTOS) || defined(THREADX)
4343
#define WOLFSENTRY_ERRCODE_FMT "%d"
4444
#elif defined(PRId32)
4545
#define WOLFSENTRY_ERRCODE_FMT "%" PRId32
@@ -143,7 +143,7 @@ static inline int WOLFSENTRY_ERROR_DECODE_LINE_NUMBER(wolfsentry_errcode_t x) {
143143

144144
#define WOLFSENTRY_ERROR_ENCODE(name) WOLFSENTRY_ERROR_ENCODE_0(WOLFSENTRY_ERROR_ID_ ## name)
145145
/*!< \brief Compute a `wolfsentry_errcode_t` encoding the current source ID and line number, and the designated short-form error `name` (e.g. `INVALID_ARG`). @hideinitializer */
146-
#define WOLFSENTRY_SUCCESS_ENCODE(x) WOLFSENTRY_ERROR_ENCODE_0(WOLFSENTRY_SUCCESS_ID_ ## x)
146+
#define WOLFSENTRY_SUCCESS_ENCODE(name) WOLFSENTRY_ERROR_ENCODE_0(WOLFSENTRY_SUCCESS_ID_ ## name)
147147
/*!< \brief Compute a `wolfsentry_errcode_t` encoding the current source ID and line number, and the designated short-form success `name` (e.g. `OK`). @hideinitializer */
148148

149149
#ifdef WOLFSENTRY_FOR_DOXYGEN
@@ -337,7 +337,9 @@ WOLFSENTRY_API const char *wolfsentry_errcode_error_name(wolfsentry_errcode_t e)
337337

338338
#if !defined(WOLFSENTRY_NO_STDIO_STREAMS) && !defined(WOLFSENTRY_NO_DIAG_MSGS)
339339

340+
#ifndef WOLFSENTRY_NETXDUO /* netxduo has its own errno.h */
340341
#include <errno.h>
342+
#endif
341343

342344
#ifdef __STRICT_ANSI__
343345
#define WOLFSENTRY_WARN(fmt,...) WOLFSENTRY_PRINTF_ERR("%s@L%d " fmt, __FILE__, __LINE__, __VA_ARGS__)

0 commit comments

Comments
 (0)