WizziLab / modem_ref

Dependents:   modem_ref_helper

include/alp_helpers.h

Committer:
Jeej
Date:
2021-01-27
Revision:
56:67e3d9608403
Parent:
41:6f83174ffed4
Child:
57:5444cfda9889

File content as of revision 56:67e3d9608403:

/// @copyright
/// ========================================================================={{{
/// Copyright (c) 2012-2020 WizziLab                                           /
/// All rights reserved                                                        /
///                                                                            /
/// =========================================================================}}}
/// @endcopyright

//  =======================================================================
/// @file           alp_helpers.h
/// @defgroup       ALP
/// @brief          ALP helpers functions
//  =======================================================================

#ifndef __ALP_HELPERS_H__
#define __ALP_HELPERS_H__

#include "hal_types.h"

//======================================================================
//======================================================================
//  ALP Helpers
//======================================================================
//======================================================================

// Basic _public container for ALP payload.
typedef struct {
    u32             len;
    u8              d[1];
} alp_pub_payload_t;

typedef struct {
    u8*             data;   // data
    int             type;
    union
    {
        struct {
            u32             length;
            u32             offset;
            u8              fid;
        } f_data;
        struct {
            u32             length;
            u32             offset;
            u8              fid;
        } f_prop;
        struct {
            s8              code;
            u8              id; // Action ID
        } status;
        struct {
            u8              itf;
            s8              err;
        } istatus;
        struct {
            u32             length;
            u8              type;
        } itf;
        struct {
            u8              id;
            u8              eop;
            u8              err;
        } tag;
        struct {
            u32             per;
            u8              type;
            u8              ifid;
        } urc;
    } meta;
} alp_parsed_chunk_t;

//======================================================================
// alp_size
//----------------------------------------------------------------------
/// @brief Return payload length of most ALP operations
/// @param op       : ALP Action amongst alp_opcodes_t
/// @param offset   : Associated Offset if relevant
/// @param size     : Associated Size if relevant
/// @retval payload size in bytes
//======================================================================
uint alp_size(u8 op, u32 offset, u32 length);

//======================================================================
// alp_encode_length
//----------------------------------------------------------------------
/// @brief Encodes an ALP length/offset field
/// @param p        : pointer to the payload buffer
/// @param len      : value to be encoded
/// @retval resulting payload size in bytes
//======================================================================
u8 alp_encode_length(u8* p, u32 len);

//======================================================================
// alp_encode_length
//----------------------------------------------------------------------
/// @brief Decodes an ALP length/offset field
/// @param p        : pointer to the pointer to payload buffer
/// @param actp     : pointer to ALP's Action Protocol Substitution flag
///                   Result amongst alp_actp_substitution_mode_t
/// @retval decoded value
//======================================================================
u32 alp_decode_length(u8** p, u8* actp);

//======================================================================
// alp_parse_chunk
//----------------------------------------------------------------------
/// @brief Parses an ALP response payload to a more generic
///        alp_parsed_chunk_t structure.
/// @param payload  : pointer to the pointer to payload buffer
/// @param resp     : pointer to alp_parsed_chunk_t structure
/// @retval number of parsed bytes
//======================================================================
int alp_parse_chunk(u8** payload, alp_parsed_chunk_t* resp);

//======================================================================
/// @brief  Creates malloc'ed ALP payload
/// @param  alp             alp_pub_payload_t*  Payload to append the ALP message to. A new payload will be malloc'ed if NULL
/// @param  ...
/// @return                 alp_pub_payload_t*  New ALP payload
/// @revent                 NONE
//======================================================================
alp_pub_payload_t* alp_append(               alp_pub_payload_t* alp_1, alp_pub_payload_t* alp_2);
alp_pub_payload_t* alp_payload_root_auth(    alp_pub_payload_t* alp);
alp_pub_payload_t* alp_payload_root_auth_enc(alp_pub_payload_t* alp, u8* challenge);
alp_pub_payload_t* alp_payload_root_sign(    alp_pub_payload_t* alp, u8* iv);
alp_pub_payload_t* alp_payload_nop(          alp_pub_payload_t* alp);
alp_pub_payload_t* alp_payload_forward(      alp_pub_payload_t* alp, void* itf);
alp_pub_payload_t* alp_payload_tag(          alp_pub_payload_t* alp, u8 tag);
alp_pub_payload_t* alp_payload_rsp_tag(      alp_pub_payload_t* alp, u8 tag, u8 eop, u8 err);
alp_pub_payload_t* alp_payload_rsp_f_data(   alp_pub_payload_t* alp, u8 fid, void* data, u32 offset, u32 length);
//alp_pub_payload_t* alp_payload_rsp_f_data_fs(alp_pub_payload_t* alp, u8 fid, u32 offset, u32 length);
alp_pub_payload_t* alp_payload_rsp_status(   alp_pub_payload_t* alp, u8 action, s8 status);
alp_pub_payload_t* alp_payload_rsp_fprop(    alp_pub_payload_t* alp, u8 fid, alp_file_header_t* hdr);
alp_pub_payload_t* alp_payload_f_wr_data(    alp_pub_payload_t* alp, u8 fid, void* data, u32 offset, u32 length, u8 group);
alp_pub_payload_t* alp_payload_f_wr_data_nr( alp_pub_payload_t* alp, u8 fid, void* data, u32 offset, u32 length, u8 group);
alp_pub_payload_t* alp_payload_f_rd_data(    alp_pub_payload_t* alp, u8 fid, u32 offset, u32 length, u8 group);
alp_pub_payload_t* alp_payload_f_flush(      alp_pub_payload_t* alp, u8 fid, u8 group);
alp_pub_payload_t* alp_payload_f_declare(    alp_pub_payload_t* alp, u8 fid, alp_file_header_t* hdr);
alp_pub_payload_t* alp_payload_activate_itf( alp_pub_payload_t* alp, uint8_t type, uint8_t nb_dev, uint8_t ifid, uint8_t flags, uint8_t enable);
alp_pub_payload_t* alp_payload_urcc_en(      alp_pub_payload_t* alp, uint8_t type, uint8_t ifid, uint8_t val);
alp_pub_payload_t* alp_payload_query(        alp_pub_payload_t* alp, u8 fid, void* data, u32 offset, u32 length, u8 group);
alp_pub_payload_t* alp_payload_qbreak(       alp_pub_payload_t* alp, u8 fid, void* data, u32 offset, u32 length, u8 group);
alp_pub_payload_t* alp_payload_qbreak_eq(    alp_pub_payload_t* alp, u8 fid, u32 data, u32 offset, u32 length, u8 group);
alp_pub_payload_t* alp_payload_qbreak_ne(    alp_pub_payload_t* alp, u8 fid, u32 data, u32 offset, u32 length, u8 group);
alp_pub_payload_t* alp_payload_qbreak_gt(    alp_pub_payload_t* alp, u8 fid, u32 data, u32 offset, u32 length, u8 group);
alp_pub_payload_t* alp_payload_qbreak_gte(   alp_pub_payload_t* alp, u8 fid, u32 data, u32 offset, u32 length, u8 group);
alp_pub_payload_t* alp_payload_qbreak_lt(    alp_pub_payload_t* alp, u8 fid, u32 data, u32 offset, u32 length, u8 group);
alp_pub_payload_t* alp_payload_qbreak_lte(   alp_pub_payload_t* alp, u8 fid, u32 data, u32 offset, u32 length, u8 group);
alp_pub_payload_t* alp_payload_qbreak_eq_msk(alp_pub_payload_t* alp, u8 fid, u32 mask, u32 data, u32 offset, u32 length, u8 group);

void alp_payload_print(alp_pub_payload_t* alp);

//======================================================================
/// @brief  Parses one OP from a payload.
///         Returns at first matching OP.
///         Let payload untouched.
/// @param  alp             alp_pub_payload_t*  Payload to parse from
/// @param  op              u8                  OP to look for
/// @param  buffer          void*               Parsed OP
/// @return                 int                 Size of parsed OP
/// @revent                 NONE
//======================================================================
int alp_payload_get(alp_pub_payload_t* alp, u8 op, void* buffer);

//======================================================================
/// @brief  Parses one OP from a payload.
///         Returns at first matching OP.
///         Removes parsed OP from the payload.
/// @param  alp             alp_pub_payload_t*  Payload to parse from
/// @param  op              u8                  OP to look for
/// @param  buffer          void*               Parsed OP
/// @return                 int                 Size of parsed OP
/// @revent                 NONE
//======================================================================
int alp_payload_extract(alp_pub_payload_t* alp, u8 op, void* buffer);

#endif // __ALP_HELPERS_H__