Cleanups for ISO-TP in wolfio

* Add Doxygen comments
* Make ISOTP_Send, ISOTP_Receive and wolfSSL_SetIO_ISOTP safer
* Reorder isotp_wolfssl_ctx
* Other minor cleanups
This commit is contained in:
Andrew Hutchings 2022-01-04 12:42:16 +00:00
parent 7c2a2229c5
commit 247cbdeef7
3 changed files with 69 additions and 29 deletions

View File

@ -537,3 +537,41 @@ WOLFSSL_API void wolfSSL_CTX_SetGenCookie(WOLFSSL_CTX*, CallbackGenCookie);
\sa wolfSSL_CTX_SetGenCookie
*/
WOLFSSL_API void* wolfSSL_GetCookieCtx(WOLFSSL* ssl);
/*!
\ingroup Setup
\brief This function sets up the ISO-TP context if wolfSSL, for use when
wolfSSL is compiled with WOLFSSL_ISOTP
\return 0 on success, WOLFSSL_CBIO_ERR_GENERAL on failure
\param ssl the wolfSSL context
\param ctx a user created ISOTP context which this function initializes
\param recv_fn a user CAN bus receive callback
\param send_fn a user CAN bus send callback
\param delay_fn a user microsecond granularity delay function
\param receive_delay a set amount of microseconds to delay each CAN bus
packet
\param receive_buffer a user supplied buffer to receive data, recommended
that is allocated to ISOTP_DEFAULT_BUFFER_SIZE bytes
\param receive_buffer_size - The size of receive_buffer
\param arg an arbitrary pointer sent to recv_fn and send_fn
_Example_
\code
struct can_info can_con_info;
isotp_wolfssl_ctx isotp_ctx;
char *receive_buffer = malloc(ISOTP_DEFAULT_BUFFER_SIZE);
WOLFSSL_CTX* ctx = wolfSSL_CTX_new(method);
WOLFSSL* ssl = wolfSSL_new(ctx);
...
wolfSSL_SetIO_ISOTP(ssl, &isotp_ctx, can_receive, can_send, can_delay, 0,
receive_buffer, ISOTP_DEFAULT_BUFFER_SIZE, &can_con_info);
\endcode
*/
WOLFSSL_API int wolfSSL_SetIO_ISOTP(WOLFSSL *ssl, isotp_wolfssl_ctx *ctx,
can_recv_fn recv_fn, can_send_fn send_fn, can_delay_fn delay_fn,
word32 receive_delay, char *receive_buffer, int receive_buffer_size,
void *arg);

View File

@ -2872,9 +2872,16 @@ static int isotp_send_first_frame(struct isotp_wolfssl_ctx *ctx, char *buf,
int ISOTP_Send(WOLFSSL* ssl, char* buf, int sz, void* ctx)
{
(void) ssl;
int ret;
struct isotp_wolfssl_ctx *isotp_ctx = (struct isotp_wolfssl_ctx*) ctx;
struct isotp_wolfssl_ctx *isotp_ctx;
(void) ssl;
if (!ctx) {
WOLFSSL_MSG("ISO-TP requires wolfSSL_SetIO_ISOTP to be called first");
return WOLFSSL_CBIO_ERR_TIMEOUT;
}
isotp_ctx = (struct isotp_wolfssl_ctx*) ctx;
if (sz > ISOTP_MAX_DATA_SIZE) {
WOLFSSL_MSG("ISO-TP packets can be at most 4095 bytes");
return WOLFSSL_CBIO_ERR_GENERAL;
@ -2984,14 +2991,20 @@ static int isotp_receive_multi_frame(struct isotp_wolfssl_ctx *ctx)
* incoming data, even if wolfSSL doesn't want it all yet */
int ISOTP_Receive(WOLFSSL* ssl, char* buf, int sz, void* ctx)
{
(void) ssl;
enum isotp_frame_type type;
int ret;
struct isotp_wolfssl_ctx *isotp_ctx = (struct isotp_wolfssl_ctx*)ctx;
struct isotp_wolfssl_ctx *isotp_ctx;
(void) ssl;
if (!ctx) {
WOLFSSL_MSG("ISO-TP requires wolfSSL_SetIO_ISOTP to be called first");
return WOLFSSL_CBIO_ERR_TIMEOUT;
}
isotp_ctx = (struct isotp_wolfssl_ctx*)ctx;
/* Is buffer empty? If so, fill it */
if (!isotp_ctx->receive_buffer_len) {
/* Can't send whilst we are receiving */
/* Can't send whilst we are receiving */
if (isotp_ctx->state != ISOTP_CONN_STATE_IDLE) {
return WOLFSSL_ERROR_WANT_READ;
}
@ -3047,25 +3060,15 @@ int ISOTP_Receive(WOLFSSL* ssl, char* buf, int sz, void* ctx)
}
}
/* Setup ISPTP
*
* Parameters:
* ssl - The wolfSSL context
* ctx - A user created ISOTP context which this function initializes
* recv_fn - A user CAN bus receive callback
* send_fn - A user CAN bus send callback
* delay_fn - A user microsecond granularity delay function
* receive_delay - A set amount of microseconds to delay each CAN bus packet
* receive_buffer - A user supplied buffer to receive data, recommended that is
* allocated to ISOTP_DEFAULT_BUFFER_SIZE bytes
* receive_buffer_size - The size of receive_buffer
* arg - An arbitrary pointer sent to recv_fn and send_fn
*/
int wolfSSL_SetIO_ISOTP(WOLFSSL *ssl, isotp_wolfssl_ctx *ctx,
can_recv_fn recv_fn, can_send_fn send_fn, can_delay_fn delay_fn,
word32 receive_delay, char *receive_buffer, int receive_buffer_size,
void *arg)
{
if (!ctx || !recv_fn || !send_fn || !delay_fn || !receive_buffer) {
WOLFSSL_MSG("ISO-TP has missing required parameter");
return WOLFSSL_CBIO_ERR_GENERAL;
}
ctx->recv_fn = recv_fn;
ctx->send_fn = send_fn;
ctx->arg = arg;

View File

@ -649,7 +649,7 @@ WOLFSSL_API void wolfSSL_SetIOWriteFlags(WOLFSSL* ssl, int flags);
};
typedef struct isotp_can_data {
byte data[8];
byte data[ISOTP_CAN_BUS_PAYLOAD_SIZE];
byte length;
} isotp_can_data;
@ -662,25 +662,24 @@ WOLFSSL_API void wolfSSL_SetIOWriteFlags(WOLFSSL* ssl, int flags);
typedef void (*can_delay_fn)(int microseconds);
typedef struct isotp_wolfssl_ctx {
int socket;
struct isotp_can_data frame;
char *buf_ptr;
char *receive_buffer;
char *receive_buffer_ptr;
can_recv_fn recv_fn;
can_send_fn send_fn;
can_delay_fn delay_fn;
void *arg;
int receive_buffer_len;
int receive_buffer_size;
enum isotp_connection_state state;
word16 buf_length;
byte sequence;
byte flow_packets;
byte flow_counter;
byte frame_delay;
byte wait_counter;
char *buf_ptr;
word16 buf_length;
byte receive_delay;
char *receive_buffer;
char *receive_buffer_ptr;
int receive_buffer_len;
int receive_buffer_size;
enum isotp_connection_state state;
void *arg;
} isotp_wolfssl_ctx;
WOLFSSL_LOCAL int ISOTP_Receive(WOLFSSL* ssl, char* buf, int sz, void* ctx);