Exportable version of WizziLab's modem driver.

Dependents:   modem_ref_helper

Committer:
Jeej
Date:
Wed Jan 27 14:45:28 2021 +0000
Revision:
56:67e3d9608403
Parent:
41:6f83174ffed4
Child:
57:5444cfda9889
Sanity commit. Do not use.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Jeej 0:027760f45e2c 1 /// @copyright
Jeej 0:027760f45e2c 2 /// ========================================================================={{{
Jeej 0:027760f45e2c 3 /// Copyright (c) 2012-2017 WizziLab /
Jeej 0:027760f45e2c 4 /// All rights reserved /
Jeej 0:027760f45e2c 5 /// /
Jeej 0:027760f45e2c 6 /// Should you have any questions regarding your right to use this Software, /
Jeej 0:027760f45e2c 7 /// contact WizziLab at www.wizzilab.com. /
Jeej 0:027760f45e2c 8 /// /
Jeej 0:027760f45e2c 9 /// =========================================================================}}}
Jeej 0:027760f45e2c 10 /// @endcopyright
Jeej 0:027760f45e2c 11
Jeej 0:027760f45e2c 12 // ====================================================================
Jeej 0:027760f45e2c 13 // @file alp_helpers.c
Jeej 56:67e3d9608403 14 // @brief ALP helpers functions.
Jeej 0:027760f45e2c 15 // This code should be disclosable in source.
Jeej 0:027760f45e2c 16 // ====================================================================
Jeej 0:027760f45e2c 17
Jeej 0:027760f45e2c 18
Jeej 0:027760f45e2c 19 #include "alp.h"
Jeej 56:67e3d9608403 20 #include "alp_dbg.h"
Jeej 41:6f83174ffed4 21 #include "kal_math.h"
Jeej 56:67e3d9608403 22 #include "kal_crypto.h"
Jeej 56:67e3d9608403 23 #include "d7a_1x_fs.h"
Jeej 0:027760f45e2c 24
Jeej 0:027760f45e2c 25 //======================================================================
Jeej 0:027760f45e2c 26 // alp_size
Jeej 0:027760f45e2c 27 //----------------------------------------------------------------------
Jeej 0:027760f45e2c 28 /// @brief Return payload length of most ALP operations
Jeej 0:027760f45e2c 29 /// @param op : ALP Action amongst alp_opcodes_t
Jeej 0:027760f45e2c 30 /// @param offset : Associated Offset if relevant
Jeej 0:027760f45e2c 31 /// @param size : Associated Size if relevant
Jeej 0:027760f45e2c 32 /// @retval payload size in bytes
Jeej 0:027760f45e2c 33 //======================================================================
Jeej 56:67e3d9608403 34 uint alp_size(u8 op, u32 offset, u32 length)
Jeej 0:027760f45e2c 35 {
Jeej 0:027760f45e2c 36 uint len=2;// At least OP+FID / OP+TAG
Jeej 0:027760f45e2c 37 switch (op)
Jeej 0:027760f45e2c 38 {
Jeej 0:027760f45e2c 39 case ALP_OPCODE_NOP:
Jeej 0:027760f45e2c 40 case ALP_OPCODE_F_TOUCH:
Jeej 0:027760f45e2c 41 case ALP_OPCODE_F_EXIST:
Jeej 0:027760f45e2c 42 case ALP_OPCODE_F_DELETE:
Jeej 0:027760f45e2c 43 case ALP_OPCODE_F_FLUSH:
Jeej 0:027760f45e2c 44 case ALP_OPCODE_RSP_TAG:
Jeej 0:027760f45e2c 45 case ALP_OPCODE_F_RD_PROP:
Jeej 0:027760f45e2c 46 break;
Jeej 0:027760f45e2c 47 case ALP_OPCODE_RSP_STATUS:
Jeej 0:027760f45e2c 48 len += 1;
Jeej 0:027760f45e2c 49 break;
Jeej 0:027760f45e2c 50 case ALP_OPCODE_F_CREATE:
Jeej 0:027760f45e2c 51 case ALP_OPCODE_F_DECLARE:
Jeej 0:027760f45e2c 52 case ALP_OPCODE_RSP_F_PROP:
Jeej 0:027760f45e2c 53 len += ALP_FILE_HEADER_SIZE;
Jeej 0:027760f45e2c 54 break;
Jeej 0:027760f45e2c 55 case ALP_OPCODE_F_WR_PROP:
Jeej 0:027760f45e2c 56 case ALP_OPCODE_F_WR_DATA:
Jeej 0:027760f45e2c 57 case ALP_OPCODE_RSP_F_DATA:
Jeej 0:027760f45e2c 58 len = length;
Jeej 35:ac940cf8ebe6 59 // Fallthrough
Jeej 0:027760f45e2c 60 case ALP_OPCODE_F_RD_DATA:
Jeej 0:027760f45e2c 61 len += ALP_LFIELD_SIZE(offset) + ALP_LFIELD_SIZE(length);
Jeej 0:027760f45e2c 62 break;
Jeej 0:027760f45e2c 63 default:
Jeej 38:73ad040ae741 64 //ALP_ASSERT(false,"ASSERT: ALP: alp_size unsupported op %d\n",op);
Jeej 0:027760f45e2c 65 break;
Jeej 0:027760f45e2c 66 }
Jeej 0:027760f45e2c 67 return len;
Jeej 0:027760f45e2c 68 }
Jeej 0:027760f45e2c 69
Jeej 0:027760f45e2c 70 //======================================================================
Jeej 0:027760f45e2c 71 // alp_encode_length
Jeej 0:027760f45e2c 72 //----------------------------------------------------------------------
Jeej 0:027760f45e2c 73 /// @brief Encodes an ALP length/offset field
Jeej 0:027760f45e2c 74 /// @param p : pointer to the payload buffer
Jeej 0:027760f45e2c 75 /// @param len : value to be encoded
Jeej 0:027760f45e2c 76 /// @retval resulting payload size in bytes
Jeej 0:027760f45e2c 77 //======================================================================
Jeej 56:67e3d9608403 78 u8 alp_encode_length(u8* p, u32 len)
Jeej 0:027760f45e2c 79 {
Jeej 0:027760f45e2c 80 if (len <= 0x3F)
Jeej 0:027760f45e2c 81 {
Jeej 0:027760f45e2c 82 *p++ = len;
Jeej 0:027760f45e2c 83 return 1;
Jeej 0:027760f45e2c 84 }
Jeej 0:027760f45e2c 85 else if (len <= 0x3FFF)
Jeej 0:027760f45e2c 86 {
Jeej 0:027760f45e2c 87 *p++ = 0x40 + (u8)(len >> 8);
Jeej 0:027760f45e2c 88 *p++ = (u8)(len & 0xFF);
Jeej 0:027760f45e2c 89 return 2;
Jeej 0:027760f45e2c 90 }
Jeej 0:027760f45e2c 91 else if (len <= 0x3FFFFF)
Jeej 0:027760f45e2c 92 {
Jeej 0:027760f45e2c 93 *p++ = 0x80 + (u8) (len >> 16);
Jeej 0:027760f45e2c 94 *p++ = (u8)((len >> 8) & 0xFF);
Jeej 0:027760f45e2c 95 *p++ = (u8) (len & 0xFF);
Jeej 0:027760f45e2c 96 return 3;
Jeej 0:027760f45e2c 97 }
Jeej 0:027760f45e2c 98 else
Jeej 0:027760f45e2c 99 {
Jeej 0:027760f45e2c 100 *p++ = 0xC0 + (u8) (len >> 24);
Jeej 0:027760f45e2c 101 *p++ = (u8)((len >> 16) & 0xFF);
Jeej 0:027760f45e2c 102 *p++ = (u8)((len >> 8) & 0xFF);
Jeej 0:027760f45e2c 103 *p++ = (u8) (len & 0xFF);
Jeej 0:027760f45e2c 104 return 4;
Jeej 0:027760f45e2c 105 }
Jeej 0:027760f45e2c 106 }
Jeej 0:027760f45e2c 107
Jeej 0:027760f45e2c 108
Jeej 0:027760f45e2c 109 //======================================================================
Jeej 0:027760f45e2c 110 // alp_decode_length
Jeej 0:027760f45e2c 111 //----------------------------------------------------------------------
Jeej 0:027760f45e2c 112 /// @brief Decodes an ALP length/offset field
Jeej 0:027760f45e2c 113 /// @param p : pointer to the pointer to payload buffer
Jeej 0:027760f45e2c 114 /// @param actp : pointer to ALP's Action Protocol Substitution flag
Jeej 0:027760f45e2c 115 /// Result amongst alp_actp_substitution_mode_t
Jeej 0:027760f45e2c 116 /// @retval decoded value
Jeej 0:027760f45e2c 117 //======================================================================
Jeej 56:67e3d9608403 118 u32 alp_decode_length(u8** p, u8* actp)
Jeej 0:027760f45e2c 119 {
Jeej 0:027760f45e2c 120 u32 tmp = 0;
Jeej 0:027760f45e2c 121 switch ((**p) & 0xC0)
Jeej 0:027760f45e2c 122 {
Jeej 0:027760f45e2c 123 case 0xC0: // 0xCx xx xx xx
Jeej 0:027760f45e2c 124 tmp = ((*(*p)++) & 0x3F) << 24;
Jeej 0:027760f45e2c 125 tmp += (*(*p)++) << 16;
Jeej 0:027760f45e2c 126 tmp += (*(*p)++) << 8;
Jeej 0:027760f45e2c 127 tmp += (*(*p)++) << 0;
Jeej 0:027760f45e2c 128 break;
Jeej 0:027760f45e2c 129 case 0x80: // 0x8x xx xx : 16384 <= Len <4194303
Jeej 0:027760f45e2c 130 tmp = ((*(*p)++) & 0x3F) << 16;
Jeej 0:027760f45e2c 131 tmp += (*(*p)++) << 8;
Jeej 0:027760f45e2c 132 if (tmp == 0)
Jeej 0:027760f45e2c 133 {
Jeej 0:027760f45e2c 134 // 0x8000 ActP special ActP code
Jeej 0:027760f45e2c 135 // Do not fetch the extra byte
Jeej 0:027760f45e2c 136 *actp = 2;
Jeej 0:027760f45e2c 137 }
Jeej 0:027760f45e2c 138 else
Jeej 0:027760f45e2c 139 {
Jeej 0:027760f45e2c 140 tmp += (*(*p)++) << 0;
Jeej 0:027760f45e2c 141 }
Jeej 0:027760f45e2c 142 break;
Jeej 0:027760f45e2c 143 case 0x40: // 0x4x xx : 64 <= Len < 16383
Jeej 0:027760f45e2c 144 tmp = ((*(*p)++) & 0x3F) << 8;
Jeej 0:027760f45e2c 145 tmp += (*(*p)++) << 0;
Jeej 0:027760f45e2c 146 if (tmp == 0)
Jeej 0:027760f45e2c 147 {
Jeej 0:027760f45e2c 148 // 0x4000 ActP special ActP code
Jeej 0:027760f45e2c 149 *actp = 1;
Jeej 0:027760f45e2c 150 }
Jeej 0:027760f45e2c 151 break;
Jeej 0:027760f45e2c 152 case 0: // Len <63
Jeej 0:027760f45e2c 153 tmp = (*(*p)++ & 0x3F) << 0;
Jeej 0:027760f45e2c 154 break;
Jeej 0:027760f45e2c 155 }
Jeej 0:027760f45e2c 156 return tmp;
Jeej 0:027760f45e2c 157 }
Jeej 0:027760f45e2c 158
Jeej 56:67e3d9608403 159 //======================================================================
Jeej 56:67e3d9608403 160 // alp_itf_size
Jeej 56:67e3d9608403 161 //----------------------------------------------------------------------
Jeej 56:67e3d9608403 162 /// @brief Get size of the interface configuration
Jeej 56:67e3d9608403 163 /// @param itf pointer to the configuration
Jeej 56:67e3d9608403 164 /// @return int configuration size
Jeej 56:67e3d9608403 165 //======================================================================
Jeej 56:67e3d9608403 166 int alp_itf_size(void* itf)
Jeej 56:67e3d9608403 167 {
Jeej 56:67e3d9608403 168 alp_itf_cfg_t* p = (alp_itf_cfg_t*)itf;
Jeej 56:67e3d9608403 169
Jeej 56:67e3d9608403 170 switch (p->type)
Jeej 56:67e3d9608403 171 {
Jeej 56:67e3d9608403 172 case ALP_ITF_TYPE_D7A:
Jeej 56:67e3d9608403 173 {
Jeej 56:67e3d9608403 174 alp_itf_d7a_cfg_t* d7a_itf = (alp_itf_d7a_cfg_t*)itf;
Jeej 56:67e3d9608403 175 return (1 + alp_itf_d7a_cfg_size((u8*)&d7a_itf->cfg));
Jeej 56:67e3d9608403 176 }
Jeej 56:67e3d9608403 177 case ALP_ITF_TYPE_COM:
Jeej 56:67e3d9608403 178 return sizeof(alp_itf_com_cfg_t);
Jeej 56:67e3d9608403 179 case ALP_ITF_TYPE_LWAN:
Jeej 56:67e3d9608403 180 return sizeof(alp_itf_lwan_cfg_t);
Jeej 56:67e3d9608403 181 default:
Jeej 56:67e3d9608403 182 ALP_ASSERT(FALSE, "ASSERT: ALP: Unknown ITF 0x%02X for itf size\n", p->type);
Jeej 56:67e3d9608403 183 break;
Jeej 56:67e3d9608403 184 }
Jeej 56:67e3d9608403 185
Jeej 56:67e3d9608403 186 return 0;
Jeej 56:67e3d9608403 187 }
Jeej 0:027760f45e2c 188
Jeej 0:027760f45e2c 189 //======================================================================
Jeej 0:027760f45e2c 190 // alp_parse_chunk
Jeej 0:027760f45e2c 191 //----------------------------------------------------------------------
Jeej 0:027760f45e2c 192 /// @brief Parses an ALP payload and extract a single chunk (action or
Jeej 0:027760f45e2c 193 /// response) to a more generic alp_parsed_chunk_t structure.
Jeej 0:027760f45e2c 194 /// @param payload : pointer to the pointer to payload buffer
Jeej 0:027760f45e2c 195 /// @param resp : pointer to alp_parsed_chunk_t structure
Jeej 0:027760f45e2c 196 /// @retval number of parsed bytes
Jeej 0:027760f45e2c 197 //======================================================================
Jeej 56:67e3d9608403 198 int alp_parse_chunk(u8** payload, alp_parsed_chunk_t* resp) // {{{
Jeej 0:027760f45e2c 199 {
Jeej 0:027760f45e2c 200 u8* p = *payload;
Jeej 0:027760f45e2c 201 u8 op = *p++;
Jeej 0:027760f45e2c 202 u8 actp;
Jeej 0:027760f45e2c 203 u32 bytes;
Jeej 0:027760f45e2c 204 resp->type = op & 0x3F;
Jeej 0:027760f45e2c 205 resp->data = (u8*)NULL;
Jeej 0:027760f45e2c 206 switch(resp->type) // XXX preemption bits squashed
Jeej 0:027760f45e2c 207 {
Jeej 0:027760f45e2c 208 case ALP_OPCODE_RSP_TAG:
Jeej 0:027760f45e2c 209 case ALP_OPCODE_TAG:
Jeej 0:027760f45e2c 210 resp->meta.tag.id = *p++; // PID
Jeej 0:027760f45e2c 211 resp->meta.tag.eop = !!(op & ALP_OPCODE_EOP);
Jeej 0:027760f45e2c 212 resp->meta.tag.err = !!(op & ALP_OPCODE_ERR);
Jeej 0:027760f45e2c 213 break;
Jeej 0:027760f45e2c 214 case ALP_OPCODE_RSP_F_DATA:
Jeej 0:027760f45e2c 215 case ALP_OPCODE_F_WR_DATA:
Jeej 0:027760f45e2c 216 resp->meta.f_data.fid = *p++; // FID
Jeej 0:027760f45e2c 217 resp->meta.f_data.offset = alp_decode_length(&p,&actp); // Offset
Jeej 0:027760f45e2c 218 resp->meta.f_data.length = alp_decode_length(&p,&actp); // Length
Jeej 0:027760f45e2c 219 resp->data = p;
Jeej 0:027760f45e2c 220 p += resp->meta.f_data.length;
Jeej 0:027760f45e2c 221 break;
Jeej 0:027760f45e2c 222 case ALP_OPCODE_F_RD_DATA:
Jeej 0:027760f45e2c 223 resp->meta.f_data.fid = *p++; // FID
Jeej 0:027760f45e2c 224 resp->meta.f_data.offset = alp_decode_length(&p,&actp); // Offset
Jeej 0:027760f45e2c 225 resp->meta.f_data.length = alp_decode_length(&p,&actp); // Length
Jeej 0:027760f45e2c 226 break;
Jeej 0:027760f45e2c 227 case ALP_OPCODE_F_RD_PROP:
Jeej 0:027760f45e2c 228 resp->meta.f_prop.fid = *p++; // FID
Jeej 0:027760f45e2c 229 resp->meta.f_prop.offset = 0;
Jeej 0:027760f45e2c 230 resp->meta.f_prop.length = ALP_FILE_HEADER_SIZE; // Hardcoded Length
Jeej 0:027760f45e2c 231 break;
Jeej 0:027760f45e2c 232 case ALP_OPCODE_RSP_F_PROP:
Jeej 0:027760f45e2c 233 resp->meta.f_prop.fid = *p++; // FID
Jeej 0:027760f45e2c 234 resp->meta.f_prop.offset = 0;
Jeej 0:027760f45e2c 235 resp->meta.f_prop.length = ALP_FILE_HEADER_SIZE; // Hardcoded Length
Jeej 0:027760f45e2c 236 resp->data = p;
Jeej 0:027760f45e2c 237 p += resp->meta.f_prop.length;
Jeej 0:027760f45e2c 238 break;
Jeej 0:027760f45e2c 239 case ALP_OPCODE_RSP_STATUS:
Jeej 56:67e3d9608403 240 if (ALP_OPCODE_RSP_ISTATUS == op)
Jeej 0:027760f45e2c 241 {
Jeej 0:027760f45e2c 242 resp->type = ALP_OPCODE_RSP_ISTATUS;
Jeej 0:027760f45e2c 243 resp->meta.itf.type = *p++; // ITF Type
Jeej 0:027760f45e2c 244 resp->meta.itf.length = alp_decode_length(&p,&actp); // Length
Jeej 0:027760f45e2c 245 resp->data = p;
Jeej 0:027760f45e2c 246 p += resp->meta.itf.length;
Jeej 0:027760f45e2c 247 }
Jeej 56:67e3d9608403 248 else if (ALP_OPCODE_RSP_EOPISTATUS == op)
Jeej 37:f5424d109c6d 249 {
Jeej 37:f5424d109c6d 250 resp->type = ALP_OPCODE_RSP_EOPISTATUS;
Jeej 37:f5424d109c6d 251 resp->meta.istatus.itf = *p++; // ITF Type
Jeej 37:f5424d109c6d 252 p++; // Length (always 1)
Jeej 37:f5424d109c6d 253 resp->meta.istatus.err = *p++; // Interface error
Jeej 37:f5424d109c6d 254 }
Jeej 0:027760f45e2c 255 else
Jeej 0:027760f45e2c 256 {
Jeej 0:027760f45e2c 257 resp->meta.status.id = *p++; // Action ID
Jeej 0:027760f45e2c 258 resp->meta.status.code = *p++; // status
Jeej 0:027760f45e2c 259 }
Jeej 0:027760f45e2c 260 break;
Jeej 0:027760f45e2c 261 case ALP_OPCODE_RSP_URC:
Jeej 0:027760f45e2c 262 resp->meta.urc.type = *p++; // Type
Jeej 0:027760f45e2c 263 resp->meta.urc.ifid = *p++; // Ifid
Jeej 0:027760f45e2c 264 if (resp->meta.urc.type == ALP_URC_TYPE_LQUAL)
Jeej 41:6f83174ffed4 265 {
Jeej 0:027760f45e2c 266 resp->meta.urc.per = *p++; // Per
Jeej 41:6f83174ffed4 267 }
Jeej 41:6f83174ffed4 268 else if (resp->meta.urc.type == ALP_URC_TYPE_ITF_BUSY)
Jeej 41:6f83174ffed4 269 {
Jeej 41:6f83174ffed4 270 kal_ctf_t to;
Jeej 41:6f83174ffed4 271 to.byte = *p++; // timeout
Jeej 41:6f83174ffed4 272 resp->meta.urc.per = (to.byte == 0xff) ? MAX_U32 : kal_ctf_decode(to);
Jeej 41:6f83174ffed4 273 }
Jeej 0:027760f45e2c 274 break;
Jeej 0:027760f45e2c 275 case ALP_OPCODE_F_DELETE:
Jeej 0:027760f45e2c 276 case ALP_OPCODE_F_FLUSH:
Jeej 0:027760f45e2c 277 resp->meta.f_data.fid = *p++; // FID
Jeej 0:027760f45e2c 278 break;
Jeej 56:67e3d9608403 279 case ALP_OPCODE_RSP_SECURED:
Jeej 56:67e3d9608403 280 resp->type = ALP_OPCODE_RSP_SECURED;
Jeej 56:67e3d9608403 281 *payload = (u8*)NULL;
Jeej 56:67e3d9608403 282 return 0; // XXX payload length unknown
Jeej 0:027760f45e2c 283 default:
Jeej 0:027760f45e2c 284 resp->type = ALP_OPCODE_UNKNOWN;
Jeej 0:027760f45e2c 285 *payload = (u8*)NULL;
Jeej 0:027760f45e2c 286 return 0;
Jeej 0:027760f45e2c 287 }
Jeej 0:027760f45e2c 288 bytes = p - *payload;
Jeej 0:027760f45e2c 289 *payload = p;
Jeej 0:027760f45e2c 290 return bytes;
Jeej 0:027760f45e2c 291 } // }}}
Jeej 56:67e3d9608403 292
Jeej 56:67e3d9608403 293 //======================================================================
Jeej 56:67e3d9608403 294 // alp_append
Jeej 56:67e3d9608403 295 //----------------------------------------------------------------------
Jeej 56:67e3d9608403 296 /// @brief Appends ALP payload 2 after payload 1
Jeej 56:67e3d9608403 297 /// @param alp_pub_payload_t* Payload 1
Jeej 56:67e3d9608403 298 /// @param alp_pub_payload_t* Payload 2
Jeej 56:67e3d9608403 299 /// @return alp_pub_payload_t* Appended payloads
Jeej 56:67e3d9608403 300 /// @note: XXX payloads MUST be malloced
Jeej 56:67e3d9608403 301 //======================================================================
Jeej 56:67e3d9608403 302 alp_pub_payload_t* alp_append(alp_pub_payload_t* alp_1, alp_pub_payload_t* alp_2)
Jeej 56:67e3d9608403 303 {
Jeej 56:67e3d9608403 304 alp_pub_payload_t* alp;
Jeej 56:67e3d9608403 305
Jeej 56:67e3d9608403 306 if (NULL == alp_1)
Jeej 56:67e3d9608403 307 {
Jeej 56:67e3d9608403 308 return alp_2;
Jeej 56:67e3d9608403 309 }
Jeej 56:67e3d9608403 310
Jeej 56:67e3d9608403 311 if (NULL == alp_2)
Jeej 56:67e3d9608403 312 {
Jeej 56:67e3d9608403 313 return alp_1;
Jeej 56:67e3d9608403 314 }
Jeej 56:67e3d9608403 315
Jeej 56:67e3d9608403 316 alp = (alp_pub_payload_t*)MALLOC(sizeof(alp_pub_payload_t) - 1 + alp_1->len + alp_2->len);
Jeej 56:67e3d9608403 317 alp->len = alp_1->len + alp_2->len;
Jeej 56:67e3d9608403 318
Jeej 56:67e3d9608403 319 memcpy(alp->d, alp_1->d, alp_1->len);
Jeej 56:67e3d9608403 320 memcpy(&(alp->d[alp_1->len]), alp_2->d, alp_2->len);
Jeej 56:67e3d9608403 321
Jeej 56:67e3d9608403 322 FREE(alp_1);
Jeej 56:67e3d9608403 323 FREE(alp_2);
Jeej 56:67e3d9608403 324
Jeej 56:67e3d9608403 325 return alp;
Jeej 56:67e3d9608403 326 }
Jeej 56:67e3d9608403 327
Jeej 56:67e3d9608403 328 void alp_payload_print(alp_pub_payload_t* alp)
Jeej 56:67e3d9608403 329 {
Jeej 56:67e3d9608403 330 if (NULL == alp)
Jeej 56:67e3d9608403 331 {
Jeej 56:67e3d9608403 332 return;
Jeej 56:67e3d9608403 333 }
Jeej 56:67e3d9608403 334
Jeej 56:67e3d9608403 335 u32 i;
Jeej 56:67e3d9608403 336 for (i = 0; i < alp->len; i++)
Jeej 56:67e3d9608403 337 {
Jeej 56:67e3d9608403 338 PRINT("%02X ", alp->d[i]);
Jeej 56:67e3d9608403 339 FLUSH();
Jeej 56:67e3d9608403 340 }
Jeej 56:67e3d9608403 341 PRINT("\n");
Jeej 56:67e3d9608403 342 }
Jeej 56:67e3d9608403 343
Jeej 56:67e3d9608403 344 //======================================================================
Jeej 56:67e3d9608403 345 // alp_payload_root_auth
Jeej 56:67e3d9608403 346 //----------------------------------------------------------------------
Jeej 56:67e3d9608403 347 /// @brief Add the root access request to the given payload using the authentication protocol
Jeej 56:67e3d9608403 348 /// @param alp alp_pub_payload_t* Payload
Jeej 56:67e3d9608403 349 /// @return alp_pub_payload_t* Root access request + payload
Jeej 56:67e3d9608403 350 /// @note: XXX payloads MUST be malloced
Jeej 56:67e3d9608403 351 //======================================================================
Jeej 56:67e3d9608403 352 alp_pub_payload_t* alp_payload_root_auth(alp_pub_payload_t* alp, u8* root_key)
Jeej 56:67e3d9608403 353 {
Jeej 56:67e3d9608403 354 u8* p;
Jeej 56:67e3d9608403 355 alp_pub_payload_t* new_alp;
Jeej 56:67e3d9608403 356 u8 hash[32];
Jeej 56:67e3d9608403 357
Jeej 56:67e3d9608403 358 // Calculate hash on payload
Jeej 56:67e3d9608403 359 kal_sha256_init();
Jeej 56:67e3d9608403 360 kal_sha256_update(alp->d, alp->len);
Jeej 56:67e3d9608403 361 kal_sha256_update(root_key, D7A_FS_ROOT_KEY_SIZE);
Jeej 56:67e3d9608403 362 kal_sha256_final(hash);
Jeej 56:67e3d9608403 363
Jeej 56:67e3d9608403 364 new_alp = (alp_pub_payload_t*)MALLOC(sizeof(alp_pub_payload_t) - 1
Jeej 56:67e3d9608403 365 + ALP_ACTION_PERM_REQ_SIZE(0)
Jeej 56:67e3d9608403 366 );
Jeej 56:67e3d9608403 367
Jeej 56:67e3d9608403 368 p = new_alp->d;
Jeej 56:67e3d9608403 369 ALP_ACTION_PERM_REQ(p, FALSE, ALP_PERM_REQ_ROOT, ALP_WIZZILAB_AUTH_PROTOCOL_ID);
Jeej 56:67e3d9608403 370
Jeej 56:67e3d9608403 371 memcpy(p, hash, ALP_ACTION_PERM_REQ_TOKEN_SIZE);
Jeej 56:67e3d9608403 372 p += ALP_ACTION_PERM_REQ_TOKEN_SIZE;
Jeej 56:67e3d9608403 373
Jeej 56:67e3d9608403 374 new_alp->len = ALP_ACTION_PERM_REQ_SIZE(0);
Jeej 56:67e3d9608403 375
Jeej 56:67e3d9608403 376 // XXX Prepend
Jeej 56:67e3d9608403 377 return alp_append(new_alp, alp);
Jeej 56:67e3d9608403 378 }
Jeej 56:67e3d9608403 379
Jeej 56:67e3d9608403 380 //======================================================================
Jeej 56:67e3d9608403 381 // alp_payload_root_sign
Jeej 56:67e3d9608403 382 //----------------------------------------------------------------------
Jeej 56:67e3d9608403 383 /// @brief Sign payload with root key
Jeej 56:67e3d9608403 384 /// @param alp alp_pub_payload_t* Payload
Jeej 56:67e3d9608403 385 /// @param iv u8* Initialization vector
Jeej 56:67e3d9608403 386 /// @return alp_pub_payload_t* Root access request + payload
Jeej 56:67e3d9608403 387 /// @note: XXX payloads MUST be malloced
Jeej 56:67e3d9608403 388 //======================================================================
Jeej 56:67e3d9608403 389 alp_pub_payload_t* alp_payload_root_sign(alp_pub_payload_t* alp, u8* root_key, u8* iv)
Jeej 56:67e3d9608403 390 {
Jeej 56:67e3d9608403 391 u8* p;
Jeej 56:67e3d9608403 392 alp_pub_payload_t* new_alp;
Jeej 56:67e3d9608403 393 u8 hash[32];
Jeej 56:67e3d9608403 394
Jeej 56:67e3d9608403 395 // Calculate hash on payload
Jeej 56:67e3d9608403 396 kal_sha256_init();
Jeej 56:67e3d9608403 397 kal_sha256_update(alp->d, alp->len);
Jeej 56:67e3d9608403 398 kal_sha256_update(root_key, D7A_FS_ROOT_KEY_SIZE);
Jeej 56:67e3d9608403 399 kal_sha256_update(iv, ALP_ACTION_SECURED_IV_SIZE);
Jeej 56:67e3d9608403 400 kal_sha256_final(hash);
Jeej 56:67e3d9608403 401
Jeej 56:67e3d9608403 402 new_alp = (alp_pub_payload_t*)MALLOC(sizeof(alp_pub_payload_t) - 1
Jeej 56:67e3d9608403 403 + ALP_ACTION_SECURED_SIZE(0)
Jeej 56:67e3d9608403 404 );
Jeej 56:67e3d9608403 405
Jeej 56:67e3d9608403 406 p = new_alp->d;
Jeej 56:67e3d9608403 407 ALP_ACTION_SECURED(p, ALP_SECURED_ROOT, ALP_WIZZILAB_SIGN_PROTOCOL_ID);
Jeej 56:67e3d9608403 408
Jeej 56:67e3d9608403 409 memcpy(p, iv, ALP_ACTION_SECURED_IV_SIZE);
Jeej 56:67e3d9608403 410 p += ALP_ACTION_SECURED_IV_SIZE;
Jeej 56:67e3d9608403 411
Jeej 56:67e3d9608403 412 memcpy(p, hash, ALP_ACTION_SECURED_TOKEN_SIZE);
Jeej 56:67e3d9608403 413 p += ALP_ACTION_SECURED_TOKEN_SIZE;
Jeej 56:67e3d9608403 414
Jeej 56:67e3d9608403 415 new_alp->len = ALP_ACTION_SECURED_SIZE(0);
Jeej 56:67e3d9608403 416
Jeej 56:67e3d9608403 417 // XXX Prepend
Jeej 56:67e3d9608403 418 return alp_append(new_alp, alp);
Jeej 56:67e3d9608403 419 }
Jeej 56:67e3d9608403 420
Jeej 56:67e3d9608403 421 //======================================================================
Jeej 56:67e3d9608403 422 // alp_payload_root_auth_enc
Jeej 56:67e3d9608403 423 //----------------------------------------------------------------------
Jeej 56:67e3d9608403 424 /// @brief Add the root access request to the given payload and encrypt using the challenge protocol
Jeej 56:67e3d9608403 425 /// @param alp alp_pub_payload_t* Payload
Jeej 56:67e3d9608403 426 /// @param challenge u8* 32-byte challenge
Jeej 56:67e3d9608403 427 /// @return alp_pub_payload_t* Root access request + encrypted payload
Jeej 56:67e3d9608403 428 /// @note: XXX payloads MUST be malloced
Jeej 56:67e3d9608403 429 //======================================================================
Jeej 56:67e3d9608403 430 alp_pub_payload_t* alp_payload_root_auth_enc(alp_pub_payload_t* alp, u8* root_key, u8* challenge)
Jeej 56:67e3d9608403 431 {
Jeej 56:67e3d9608403 432 u8* p;
Jeej 56:67e3d9608403 433 alp_pub_payload_t* new_alp;
Jeej 56:67e3d9608403 434 u8 hash[32];
Jeej 56:67e3d9608403 435
Jeej 56:67e3d9608403 436 // encrypt
Jeej 56:67e3d9608403 437 u8 key[16];
Jeej 56:67e3d9608403 438 memcpy(key, root_key, D7A_FS_ROOT_KEY_SIZE);
Jeej 56:67e3d9608403 439 kal_xor(key, challenge, D7A_FS_ROOT_KEY_SIZE);
Jeej 56:67e3d9608403 440 kal_aes128_init(key);
Jeej 56:67e3d9608403 441 kal_aes128_ctr(alp->d, alp->len, challenge + D7A_FS_ROOT_KEY_SIZE, TRUE);
Jeej 56:67e3d9608403 442
Jeej 56:67e3d9608403 443 // Calculate hash on payload
Jeej 56:67e3d9608403 444 kal_sha256_init();
Jeej 56:67e3d9608403 445 kal_sha256_update(alp->d, alp->len);
Jeej 56:67e3d9608403 446 kal_sha256_update(root_key, D7A_FS_ROOT_KEY_SIZE);
Jeej 56:67e3d9608403 447 kal_sha256_update(challenge, 32);
Jeej 56:67e3d9608403 448 kal_sha256_final(hash);
Jeej 56:67e3d9608403 449
Jeej 56:67e3d9608403 450 new_alp = (alp_pub_payload_t*)MALLOC(sizeof(alp_pub_payload_t) - 1
Jeej 56:67e3d9608403 451 + ALP_ACTION_PERM_REQ_SIZE(0)
Jeej 56:67e3d9608403 452 );
Jeej 56:67e3d9608403 453
Jeej 56:67e3d9608403 454 p = new_alp->d;
Jeej 56:67e3d9608403 455
Jeej 56:67e3d9608403 456 ALP_ACTION_PERM_REQ(p, FALSE, ALP_PERM_REQ_ROOT, ALP_WIZZILAB_CHAL_PROTOCOL_ID);
Jeej 56:67e3d9608403 457 memcpy(p, hash, ALP_ACTION_PERM_REQ_TOKEN_SIZE);
Jeej 56:67e3d9608403 458 p += ALP_ACTION_PERM_REQ_TOKEN_SIZE;
Jeej 56:67e3d9608403 459
Jeej 56:67e3d9608403 460 new_alp->len = ALP_ACTION_PERM_REQ_SIZE(0);
Jeej 56:67e3d9608403 461
Jeej 56:67e3d9608403 462 // XXX Prepend
Jeej 56:67e3d9608403 463 return alp_append(new_alp, alp);
Jeej 56:67e3d9608403 464 }
Jeej 56:67e3d9608403 465
Jeej 56:67e3d9608403 466 //======================================================================
Jeej 56:67e3d9608403 467 // alp_payload_rsp_f_data
Jeej 56:67e3d9608403 468 //----------------------------------------------------------------------
Jeej 56:67e3d9608403 469 /// @brief Creates malloc'ed ALP payload
Jeej 56:67e3d9608403 470 /// @param alp alp_pub_payload_t* Payload to append the ALP message to. A new payload will be malloc'ed if NULL
Jeej 56:67e3d9608403 471 /// @param fid u8 file identifier
Jeej 56:67e3d9608403 472 /// @param data void* file content
Jeej 56:67e3d9608403 473 /// @param offset u32 file offset
Jeej 56:67e3d9608403 474 /// @param length u32 file length
Jeej 56:67e3d9608403 475 /// @return alp_pub_payload_t* New ALP payload
Jeej 56:67e3d9608403 476 /// @revent NONE
Jeej 56:67e3d9608403 477 //======================================================================
Jeej 56:67e3d9608403 478 alp_pub_payload_t* alp_payload_rsp_f_data(alp_pub_payload_t* alp, u8 fid, void* data, u32 offset, u32 length)
Jeej 56:67e3d9608403 479 {
Jeej 56:67e3d9608403 480 u8* p;
Jeej 56:67e3d9608403 481 alp_pub_payload_t* new_alp;
Jeej 56:67e3d9608403 482
Jeej 56:67e3d9608403 483 new_alp = (alp_pub_payload_t*)MALLOC(sizeof(alp_pub_payload_t) - 1
Jeej 56:67e3d9608403 484 + ALP_ACTION_RSP_F_DATA_SIZE(offset, length)
Jeej 56:67e3d9608403 485 );
Jeej 56:67e3d9608403 486
Jeej 56:67e3d9608403 487 p = new_alp->d;
Jeej 56:67e3d9608403 488
Jeej 56:67e3d9608403 489 ALP_ACTION_RSP_F_DATA(p, fid, offset, length, data);
Jeej 56:67e3d9608403 490
Jeej 56:67e3d9608403 491 new_alp->len = (u32)(p - new_alp->d);
Jeej 56:67e3d9608403 492
Jeej 56:67e3d9608403 493 return alp_append(alp, new_alp);
Jeej 56:67e3d9608403 494 }
Jeej 56:67e3d9608403 495
Jeej 56:67e3d9608403 496 //======================================================================
Jeej 56:67e3d9608403 497 // alp_payload_qbreak
Jeej 56:67e3d9608403 498 //----------------------------------------------------------------------
Jeej 56:67e3d9608403 499 /// @brief Creates malloc'ed ALP payload
Jeej 56:67e3d9608403 500 /// @param alp alp_pub_payload_t* Payload to append the ALP message to. A new payload will be malloc'ed if NULL
Jeej 56:67e3d9608403 501 /// @param fid u8 file identifier
Jeej 56:67e3d9608403 502 /// @param data void* file content
Jeej 56:67e3d9608403 503 /// @param offset u32 file offset
Jeej 56:67e3d9608403 504 /// @param length u32 file length
Jeej 56:67e3d9608403 505 /// @param group u8 group with next OP
Jeej 56:67e3d9608403 506 /// @return alp_pub_payload_t* New ALP payload
Jeej 56:67e3d9608403 507 /// @revent NONE
Jeej 56:67e3d9608403 508 //======================================================================
Jeej 56:67e3d9608403 509 alp_pub_payload_t* alp_payload_qbreak(alp_pub_payload_t* alp, u8 fid, void* data, u32 offset, u32 length, u8 group)
Jeej 56:67e3d9608403 510 {
Jeej 56:67e3d9608403 511 u8* p;
Jeej 56:67e3d9608403 512 alp_pub_payload_t* new_alp;
Jeej 56:67e3d9608403 513 u8 mask = 0;
Jeej 56:67e3d9608403 514
Jeej 56:67e3d9608403 515 new_alp = (alp_pub_payload_t*)MALLOC(sizeof(alp_pub_payload_t) - 1
Jeej 56:67e3d9608403 516 + ALP_ACTION_QBREAK_SIZE(offset, length, mask)
Jeej 56:67e3d9608403 517 );
Jeej 56:67e3d9608403 518
Jeej 56:67e3d9608403 519 p = new_alp->d;
Jeej 56:67e3d9608403 520
Jeej 56:67e3d9608403 521 ALP_ACTION_QBREAK_STRTOK(p, mask, data, fid, offset, length, group);
Jeej 56:67e3d9608403 522
Jeej 56:67e3d9608403 523 new_alp->len = (u32)(p - new_alp->d);
Jeej 56:67e3d9608403 524
Jeej 56:67e3d9608403 525 return alp_append(alp, new_alp);
Jeej 56:67e3d9608403 526 }
Jeej 56:67e3d9608403 527
Jeej 56:67e3d9608403 528 static alp_pub_payload_t* _alp_payload_qbreak_comp(alp_pub_payload_t* alp, u8 fid, u32 mask, u32 data, u32 offset, u32 length, u8 group, u8 comp)
Jeej 56:67e3d9608403 529 {
Jeej 56:67e3d9608403 530 u8* p;
Jeej 56:67e3d9608403 531 alp_pub_payload_t* new_alp;
Jeej 56:67e3d9608403 532
Jeej 56:67e3d9608403 533 new_alp = (alp_pub_payload_t*)MALLOC(sizeof(alp_pub_payload_t) - 1
Jeej 56:67e3d9608403 534 + ALP_ACTION_QBREAK_SIZE(offset, length, (mask)? 1 : 0)
Jeej 56:67e3d9608403 535 );
Jeej 56:67e3d9608403 536
Jeej 56:67e3d9608403 537 p = new_alp->d;
Jeej 56:67e3d9608403 538
Jeej 56:67e3d9608403 539 ALP_ACTION_QBREAK_COMP(p, mask, data, comp, fid, offset, length, group);
Jeej 56:67e3d9608403 540
Jeej 56:67e3d9608403 541 new_alp->len = (u32)(p - new_alp->d);
Jeej 56:67e3d9608403 542
Jeej 56:67e3d9608403 543 return alp_append(alp, new_alp);
Jeej 56:67e3d9608403 544 }
Jeej 56:67e3d9608403 545
Jeej 56:67e3d9608403 546 alp_pub_payload_t* alp_payload_qbreak_eq(alp_pub_payload_t* alp, u8 fid, u32 data, u32 offset, u32 length, u8 group)
Jeej 56:67e3d9608403 547 {
Jeej 56:67e3d9608403 548 return _alp_payload_qbreak_comp(alp, fid, 0, data, offset, length, group, ALP_QCOMP_EQ);
Jeej 56:67e3d9608403 549 }
Jeej 56:67e3d9608403 550
Jeej 56:67e3d9608403 551 alp_pub_payload_t* alp_payload_qbreak_ne(alp_pub_payload_t* alp, u8 fid, u32 data, u32 offset, u32 length, u8 group)
Jeej 56:67e3d9608403 552 {
Jeej 56:67e3d9608403 553 return _alp_payload_qbreak_comp(alp, fid, 0, data, offset, length, group, ALP_QCOMP_NE);
Jeej 56:67e3d9608403 554 }
Jeej 56:67e3d9608403 555
Jeej 56:67e3d9608403 556 alp_pub_payload_t* alp_payload_qbreak_gt(alp_pub_payload_t* alp, u8 fid, u32 data, u32 offset, u32 length, u8 group)
Jeej 56:67e3d9608403 557 {
Jeej 56:67e3d9608403 558 return _alp_payload_qbreak_comp(alp, fid, 0, data, offset, length, group, ALP_QCOMP_GT);
Jeej 56:67e3d9608403 559 }
Jeej 56:67e3d9608403 560
Jeej 56:67e3d9608403 561 alp_pub_payload_t* alp_payload_qbreak_gte(alp_pub_payload_t* alp, u8 fid, u32 data, u32 offset, u32 length, u8 group)
Jeej 56:67e3d9608403 562 {
Jeej 56:67e3d9608403 563 return _alp_payload_qbreak_comp(alp, fid, 0, data, offset, length, group, ALP_QCOMP_GTE);
Jeej 56:67e3d9608403 564 }
Jeej 56:67e3d9608403 565
Jeej 56:67e3d9608403 566 alp_pub_payload_t* alp_payload_qbreak_lt(alp_pub_payload_t* alp, u8 fid, u32 data, u32 offset, u32 length, u8 group)
Jeej 56:67e3d9608403 567 {
Jeej 56:67e3d9608403 568 return _alp_payload_qbreak_comp(alp, fid, 0, data, offset, length, group, ALP_QCOMP_LT);
Jeej 56:67e3d9608403 569 }
Jeej 56:67e3d9608403 570
Jeej 56:67e3d9608403 571 alp_pub_payload_t* alp_payload_qbreak_lte(alp_pub_payload_t* alp, u8 fid, u32 data, u32 offset, u32 length, u8 group)
Jeej 56:67e3d9608403 572 {
Jeej 56:67e3d9608403 573 return _alp_payload_qbreak_comp(alp, fid, 0, data, offset, length, group, ALP_QCOMP_LTE);
Jeej 56:67e3d9608403 574 }
Jeej 56:67e3d9608403 575
Jeej 56:67e3d9608403 576 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)
Jeej 56:67e3d9608403 577 {
Jeej 56:67e3d9608403 578 return _alp_payload_qbreak_comp(alp, fid, mask, data, offset, length, group, ALP_QCOMP_EQ);
Jeej 56:67e3d9608403 579 }
Jeej 56:67e3d9608403 580
Jeej 56:67e3d9608403 581 //======================================================================
Jeej 56:67e3d9608403 582 // alp_payload_query
Jeej 56:67e3d9608403 583 //----------------------------------------------------------------------
Jeej 56:67e3d9608403 584 /// @brief Creates malloc'ed ALP payload
Jeej 56:67e3d9608403 585 /// @param alp alp_pub_payload_t* Payload to append the ALP message to. A new payload will be malloc'ed if NULL
Jeej 56:67e3d9608403 586 /// @param fid u8 file identifier
Jeej 56:67e3d9608403 587 /// @param data void* file content
Jeej 56:67e3d9608403 588 /// @param offset u32 file offset
Jeej 56:67e3d9608403 589 /// @param length u32 file length
Jeej 56:67e3d9608403 590 /// @param group u8 group with next OP
Jeej 56:67e3d9608403 591 /// @return alp_pub_payload_t* New ALP payload
Jeej 56:67e3d9608403 592 /// @revent NONE
Jeej 56:67e3d9608403 593 //======================================================================
Jeej 56:67e3d9608403 594 alp_pub_payload_t* alp_payload_query(alp_pub_payload_t* alp, u8 fid, void* data, u32 offset, u32 length, u8 group)
Jeej 56:67e3d9608403 595 {
Jeej 56:67e3d9608403 596 u8* p;
Jeej 56:67e3d9608403 597 alp_pub_payload_t* new_alp;
Jeej 56:67e3d9608403 598 u8 mask = 0;
Jeej 56:67e3d9608403 599
Jeej 56:67e3d9608403 600 new_alp = (alp_pub_payload_t*)MALLOC(sizeof(alp_pub_payload_t) - 1
Jeej 56:67e3d9608403 601 + ALP_ACTION_QUERY_SIZE(offset, length, mask)
Jeej 56:67e3d9608403 602 );
Jeej 56:67e3d9608403 603
Jeej 56:67e3d9608403 604 p = new_alp->d;
Jeej 56:67e3d9608403 605
Jeej 56:67e3d9608403 606 ALP_ACTION_QUERY_STRTOK(p, mask, data, fid, offset, length, group);
Jeej 56:67e3d9608403 607
Jeej 56:67e3d9608403 608 new_alp->len = (u32)(p - new_alp->d);
Jeej 56:67e3d9608403 609
Jeej 56:67e3d9608403 610 return alp_append(alp, new_alp);
Jeej 56:67e3d9608403 611 }
Jeej 56:67e3d9608403 612
Jeej 56:67e3d9608403 613 //======================================================================
Jeej 56:67e3d9608403 614 // alp_payload_nop
Jeej 56:67e3d9608403 615 //----------------------------------------------------------------------
Jeej 56:67e3d9608403 616 /// @brief Creates malloc'ed ALP payload
Jeej 56:67e3d9608403 617 /// @param alp alp_pub_payload_t* Payload to append the ALP message to. A new payload will be malloc'ed if NULL
Jeej 56:67e3d9608403 618 /// @return alp_pub_payload_t* New ALP payload
Jeej 56:67e3d9608403 619 /// @revent NONE
Jeej 56:67e3d9608403 620 //======================================================================
Jeej 56:67e3d9608403 621 alp_pub_payload_t* alp_payload_nop(alp_pub_payload_t* alp)
Jeej 56:67e3d9608403 622 {
Jeej 56:67e3d9608403 623 u8* p;
Jeej 56:67e3d9608403 624 alp_pub_payload_t* new_alp;
Jeej 56:67e3d9608403 625
Jeej 56:67e3d9608403 626 new_alp = (alp_pub_payload_t*)MALLOC(sizeof(alp_pub_payload_t) - 1
Jeej 56:67e3d9608403 627 + ALP_ACTION_NOP_SIZE
Jeej 56:67e3d9608403 628 );
Jeej 56:67e3d9608403 629
Jeej 56:67e3d9608403 630 p = new_alp->d;
Jeej 56:67e3d9608403 631
Jeej 56:67e3d9608403 632 ALP_ACTION_NOP(p, true); // XXX RESP always true. If we use NOP, it's to get a response (istatus).
Jeej 56:67e3d9608403 633
Jeej 56:67e3d9608403 634 new_alp->len = (u32)(p - new_alp->d);
Jeej 56:67e3d9608403 635
Jeej 56:67e3d9608403 636 return alp_append(alp, new_alp);
Jeej 56:67e3d9608403 637 }
Jeej 56:67e3d9608403 638
Jeej 56:67e3d9608403 639 //======================================================================
Jeej 56:67e3d9608403 640 // alp_payload_f_wr_data
Jeej 56:67e3d9608403 641 //----------------------------------------------------------------------
Jeej 56:67e3d9608403 642 /// @brief Creates malloc'ed ALP payload
Jeej 56:67e3d9608403 643 /// @param alp alp_pub_payload_t* Payload to append the ALP message to. A new payload will be malloc'ed if NULL
Jeej 56:67e3d9608403 644 /// @param fid u8 file identifier
Jeej 56:67e3d9608403 645 /// @param data void* file content
Jeej 56:67e3d9608403 646 /// @param offset u32 file offset
Jeej 56:67e3d9608403 647 /// @param length u32 file length
Jeej 56:67e3d9608403 648 /// @param group u8 group with next OP
Jeej 56:67e3d9608403 649 /// @return alp_pub_payload_t* New ALP payload
Jeej 56:67e3d9608403 650 /// @revent NONE
Jeej 56:67e3d9608403 651 //======================================================================
Jeej 56:67e3d9608403 652 static alp_pub_payload_t* _alp_payload_f_wr_data_resp(alp_pub_payload_t* alp, u8 fid, void* data, u32 offset, u32 length, u8 group, u8 resp)
Jeej 56:67e3d9608403 653 {
Jeej 56:67e3d9608403 654 u8* p;
Jeej 56:67e3d9608403 655 alp_pub_payload_t* new_alp;
Jeej 56:67e3d9608403 656
Jeej 56:67e3d9608403 657 new_alp = (alp_pub_payload_t*)MALLOC(sizeof(alp_pub_payload_t) - 1
Jeej 56:67e3d9608403 658 + ALP_ACTION_F_WR_DATA_SIZE(offset, length)
Jeej 56:67e3d9608403 659 );
Jeej 56:67e3d9608403 660
Jeej 56:67e3d9608403 661 p = new_alp->d;
Jeej 56:67e3d9608403 662
Jeej 56:67e3d9608403 663 ALP_ACTION_F_WR_DATA(p, resp, fid, offset, length, data, group);
Jeej 56:67e3d9608403 664
Jeej 56:67e3d9608403 665 new_alp->len = (u32)(p - new_alp->d);
Jeej 56:67e3d9608403 666
Jeej 56:67e3d9608403 667 return alp_append(alp, new_alp);
Jeej 56:67e3d9608403 668 }
Jeej 56:67e3d9608403 669
Jeej 56:67e3d9608403 670 alp_pub_payload_t* alp_payload_f_wr_data(alp_pub_payload_t* alp, u8 fid, void* data, u32 offset, u32 length, u8 group)
Jeej 56:67e3d9608403 671 {
Jeej 56:67e3d9608403 672 return _alp_payload_f_wr_data_resp(alp, fid, data, offset, length, group, true);
Jeej 56:67e3d9608403 673 }
Jeej 56:67e3d9608403 674
Jeej 56:67e3d9608403 675 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)
Jeej 56:67e3d9608403 676 {
Jeej 56:67e3d9608403 677 return _alp_payload_f_wr_data_resp(alp, fid, data, offset, length, group, false);
Jeej 56:67e3d9608403 678 }
Jeej 56:67e3d9608403 679
Jeej 56:67e3d9608403 680 //======================================================================
Jeej 56:67e3d9608403 681 // alp_payload_f_rd_data
Jeej 56:67e3d9608403 682 //----------------------------------------------------------------------
Jeej 56:67e3d9608403 683 /// @brief Creates malloc'ed ALP payload
Jeej 56:67e3d9608403 684 /// @param alp alp_pub_payload_t* Payload to append the ALP message to. A new payload will be malloc'ed if NULL
Jeej 56:67e3d9608403 685 /// @param fid u8 file identifier
Jeej 56:67e3d9608403 686 /// @param offset u32 file offset
Jeej 56:67e3d9608403 687 /// @param length u32 file length
Jeej 56:67e3d9608403 688 /// @param group u8 group with next OP
Jeej 56:67e3d9608403 689 /// @return alp_pub_payload_t* New ALP payload
Jeej 56:67e3d9608403 690 /// @revent NONE
Jeej 56:67e3d9608403 691 //======================================================================
Jeej 56:67e3d9608403 692 alp_pub_payload_t* alp_payload_f_rd_data(alp_pub_payload_t* alp, u8 fid, u32 offset, u32 length, u8 group)
Jeej 56:67e3d9608403 693 {
Jeej 56:67e3d9608403 694 u8* p;
Jeej 56:67e3d9608403 695 alp_pub_payload_t* new_alp;
Jeej 56:67e3d9608403 696
Jeej 56:67e3d9608403 697 new_alp = (alp_pub_payload_t*)MALLOC(sizeof(alp_pub_payload_t) - 1
Jeej 56:67e3d9608403 698 + ALP_ACTION_F_RD_DATA_SIZE(offset, length)
Jeej 56:67e3d9608403 699 );
Jeej 56:67e3d9608403 700
Jeej 56:67e3d9608403 701 p = new_alp->d;
Jeej 56:67e3d9608403 702
Jeej 56:67e3d9608403 703 ALP_ACTION_F_RD_DATA(p, true, fid, offset, length, group);
Jeej 56:67e3d9608403 704
Jeej 56:67e3d9608403 705 new_alp->len = (u32)(p - new_alp->d);
Jeej 56:67e3d9608403 706
Jeej 56:67e3d9608403 707 return alp_append(alp, new_alp);
Jeej 56:67e3d9608403 708 }
Jeej 56:67e3d9608403 709
Jeej 56:67e3d9608403 710 //======================================================================
Jeej 56:67e3d9608403 711 // alp_payload_f_flush
Jeej 56:67e3d9608403 712 //----------------------------------------------------------------------
Jeej 56:67e3d9608403 713 /// @brief Creates malloc'ed ALP payload
Jeej 56:67e3d9608403 714 /// @param alp alp_pub_payload_t* Payload to append the ALP message to. A new payload will be malloc'ed if NULL
Jeej 56:67e3d9608403 715 /// @param fid u8 file identifier
Jeej 56:67e3d9608403 716 /// @param group u8 group with next OP
Jeej 56:67e3d9608403 717 /// @return alp_pub_payload_t* New ALP payload
Jeej 56:67e3d9608403 718 /// @revent NONE
Jeej 56:67e3d9608403 719 //======================================================================
Jeej 56:67e3d9608403 720 alp_pub_payload_t* alp_payload_f_flush(alp_pub_payload_t* alp, u8 fid, u8 group)
Jeej 56:67e3d9608403 721 {
Jeej 56:67e3d9608403 722 u8* p;
Jeej 56:67e3d9608403 723 alp_pub_payload_t* new_alp;
Jeej 56:67e3d9608403 724
Jeej 56:67e3d9608403 725 new_alp = (alp_pub_payload_t*)MALLOC(sizeof(alp_pub_payload_t) - 1
Jeej 56:67e3d9608403 726 + ALP_ACTION_F_FLUSH_SIZE
Jeej 56:67e3d9608403 727 );
Jeej 56:67e3d9608403 728
Jeej 56:67e3d9608403 729 p = new_alp->d;
Jeej 56:67e3d9608403 730
Jeej 56:67e3d9608403 731 ALP_ACTION_F_FLUSH(p, true, fid, group);
Jeej 56:67e3d9608403 732
Jeej 56:67e3d9608403 733 new_alp->len = (u32)(p - new_alp->d);
Jeej 56:67e3d9608403 734
Jeej 56:67e3d9608403 735 return alp_append(alp, new_alp);
Jeej 56:67e3d9608403 736 }
Jeej 56:67e3d9608403 737
Jeej 56:67e3d9608403 738
Jeej 56:67e3d9608403 739 //======================================================================
Jeej 56:67e3d9608403 740 // alp_payload_f_flush
Jeej 56:67e3d9608403 741 //----------------------------------------------------------------------
Jeej 56:67e3d9608403 742 /// @brief Creates malloc'ed ALP payload
Jeej 56:67e3d9608403 743 /// @param alp alp_pub_payload_t* Payload to append the ALP message to. A new payload will be malloc'ed if NULL
Jeej 56:67e3d9608403 744 /// @param fid u8 file identifier
Jeej 56:67e3d9608403 745 /// @param group u8 group with next OP
Jeej 56:67e3d9608403 746 /// @return alp_pub_payload_t* New ALP payload
Jeej 56:67e3d9608403 747 /// @revent NONE
Jeej 56:67e3d9608403 748 //======================================================================
Jeej 56:67e3d9608403 749 alp_pub_payload_t* alp_payload_f_declare(alp_pub_payload_t* alp, u8 fid, alp_file_header_t* hdr)
Jeej 56:67e3d9608403 750 {
Jeej 56:67e3d9608403 751 u8* p;
Jeej 56:67e3d9608403 752 alp_pub_payload_t* new_alp;
Jeej 56:67e3d9608403 753
Jeej 56:67e3d9608403 754 new_alp = (alp_pub_payload_t*)MALLOC(sizeof(alp_pub_payload_t) - 1
Jeej 56:67e3d9608403 755 + ALP_ACTION_F_DECLARE_SIZE
Jeej 56:67e3d9608403 756 );
Jeej 56:67e3d9608403 757
Jeej 56:67e3d9608403 758 p = new_alp->d;
Jeej 56:67e3d9608403 759
Jeej 56:67e3d9608403 760 ALP_ACTION_F_DECLARE(p, true, fid, hdr, true);
Jeej 56:67e3d9608403 761
Jeej 56:67e3d9608403 762 new_alp->len = (u32)(p - new_alp->d);
Jeej 56:67e3d9608403 763
Jeej 56:67e3d9608403 764 return alp_append(alp, new_alp);
Jeej 56:67e3d9608403 765 }
Jeej 56:67e3d9608403 766
Jeej 56:67e3d9608403 767 //======================================================================
Jeej 56:67e3d9608403 768 // alp_payload_forward
Jeej 56:67e3d9608403 769 //----------------------------------------------------------------------
Jeej 56:67e3d9608403 770 /// @brief Creates malloc'ed ALP payload
Jeej 56:67e3d9608403 771 /// @param alp alp_pub_payload_t* Payload to append the ALP message to. A new payload will be malloc'ed if NULL
Jeej 56:67e3d9608403 772 /// @param itf void* Forward interface
Jeej 56:67e3d9608403 773 /// @return alp_pub_payload_t* New ALP payload
Jeej 56:67e3d9608403 774 /// @revent NONE
Jeej 56:67e3d9608403 775 //======================================================================
Jeej 56:67e3d9608403 776 alp_pub_payload_t* alp_payload_forward(alp_pub_payload_t* alp, void* itf)
Jeej 56:67e3d9608403 777 {
Jeej 56:67e3d9608403 778 u8* p;
Jeej 56:67e3d9608403 779 alp_pub_payload_t* new_alp;
Jeej 56:67e3d9608403 780 u32 itf_length = alp_itf_size(itf);
Jeej 56:67e3d9608403 781
Jeej 56:67e3d9608403 782 new_alp = (alp_pub_payload_t*)MALLOC(sizeof(alp_pub_payload_t) - 1
Jeej 56:67e3d9608403 783 + ALP_ACTION_FORWARD_SIZE(itf_length)
Jeej 56:67e3d9608403 784 );
Jeej 56:67e3d9608403 785
Jeej 56:67e3d9608403 786 p = new_alp->d;
Jeej 56:67e3d9608403 787
Jeej 56:67e3d9608403 788 ALP_ACTION_FORWARD(p, itf, itf_length);
Jeej 56:67e3d9608403 789
Jeej 56:67e3d9608403 790 new_alp->len = (u32)(p - new_alp->d);
Jeej 56:67e3d9608403 791
Jeej 56:67e3d9608403 792 return alp_append(alp, new_alp);
Jeej 56:67e3d9608403 793 }
Jeej 56:67e3d9608403 794
Jeej 56:67e3d9608403 795 //======================================================================
Jeej 56:67e3d9608403 796 // alp_payload_tag
Jeej 56:67e3d9608403 797 //----------------------------------------------------------------------
Jeej 56:67e3d9608403 798 /// @brief Creates malloc'ed ALP payload
Jeej 56:67e3d9608403 799 /// @param alp alp_pub_payload_t* Payload to append the ALP message to. A new payload will be malloc'ed if NULL
Jeej 56:67e3d9608403 800 /// @param tag u8 Tag value
Jeej 56:67e3d9608403 801 /// @return alp_pub_payload_t* New ALP payload
Jeej 56:67e3d9608403 802 /// @revent NONE
Jeej 56:67e3d9608403 803 //======================================================================
Jeej 56:67e3d9608403 804 alp_pub_payload_t* alp_payload_tag(alp_pub_payload_t* alp, u8 tag)
Jeej 56:67e3d9608403 805 {
Jeej 56:67e3d9608403 806 u8* p;
Jeej 56:67e3d9608403 807 alp_pub_payload_t* new_alp;
Jeej 56:67e3d9608403 808
Jeej 56:67e3d9608403 809 new_alp = (alp_pub_payload_t*)MALLOC(sizeof(alp_pub_payload_t) - 1
Jeej 56:67e3d9608403 810 + ALP_ACTION_TAG_SIZE
Jeej 56:67e3d9608403 811 );
Jeej 56:67e3d9608403 812
Jeej 56:67e3d9608403 813 p = new_alp->d;
Jeej 56:67e3d9608403 814
Jeej 56:67e3d9608403 815 ALP_ACTION_TAG(p, tag, true);
Jeej 56:67e3d9608403 816
Jeej 56:67e3d9608403 817 new_alp->len = (u32)(p - new_alp->d);
Jeej 56:67e3d9608403 818
Jeej 56:67e3d9608403 819 return alp_append(alp, new_alp);
Jeej 56:67e3d9608403 820 }
Jeej 56:67e3d9608403 821
Jeej 56:67e3d9608403 822 //======================================================================
Jeej 56:67e3d9608403 823 // alp_payload_tag
Jeej 56:67e3d9608403 824 //----------------------------------------------------------------------
Jeej 56:67e3d9608403 825 /// @brief Creates malloc'ed ALP payload
Jeej 56:67e3d9608403 826 /// @param alp alp_pub_payload_t* Payload to append the ALP message to. A new payload will be malloc'ed if NULL
Jeej 56:67e3d9608403 827 /// @param tag u8 Tag value
Jeej 56:67e3d9608403 828 /// @return alp_pub_payload_t* New ALP payload
Jeej 56:67e3d9608403 829 /// @revent NONE
Jeej 56:67e3d9608403 830 //======================================================================
Jeej 56:67e3d9608403 831 alp_pub_payload_t* alp_payload_rsp_tag(alp_pub_payload_t* alp, u8 tag, u8 eop, u8 err)
Jeej 56:67e3d9608403 832 {
Jeej 56:67e3d9608403 833 u8* p;
Jeej 56:67e3d9608403 834 alp_pub_payload_t* new_alp;
Jeej 56:67e3d9608403 835
Jeej 56:67e3d9608403 836 new_alp = (alp_pub_payload_t*)MALLOC(sizeof(alp_pub_payload_t) - 1
Jeej 56:67e3d9608403 837 + ALP_ACTION_RSP_TAG_SIZE
Jeej 56:67e3d9608403 838 );
Jeej 56:67e3d9608403 839
Jeej 56:67e3d9608403 840 p = new_alp->d;
Jeej 56:67e3d9608403 841
Jeej 56:67e3d9608403 842 ALP_ACTION_RSP_TAG(p, tag, eop, err);
Jeej 56:67e3d9608403 843
Jeej 56:67e3d9608403 844 new_alp->len = (u32)(p - new_alp->d);
Jeej 56:67e3d9608403 845
Jeej 56:67e3d9608403 846 return alp_append(alp, new_alp);
Jeej 56:67e3d9608403 847 }
Jeej 56:67e3d9608403 848
Jeej 56:67e3d9608403 849 //======================================================================
Jeej 56:67e3d9608403 850 // alp_payload_tag
Jeej 56:67e3d9608403 851 //----------------------------------------------------------------------
Jeej 56:67e3d9608403 852 /// @brief Creates malloc'ed ALP payload
Jeej 56:67e3d9608403 853 /// @param alp alp_pub_payload_t* Payload to append the ALP message to. A new payload will be malloc'ed if NULL
Jeej 56:67e3d9608403 854 /// @param tag u8 Action index
Jeej 56:67e3d9608403 855 /// @param tag s8 Status
Jeej 56:67e3d9608403 856 /// @return alp_pub_payload_t* New ALP payload
Jeej 56:67e3d9608403 857 /// @revent NONE
Jeej 56:67e3d9608403 858 //======================================================================
Jeej 56:67e3d9608403 859 alp_pub_payload_t* alp_payload_rsp_status(alp_pub_payload_t* alp, u8 action, s8 status)
Jeej 56:67e3d9608403 860 {
Jeej 56:67e3d9608403 861 u8* p;
Jeej 56:67e3d9608403 862 alp_pub_payload_t* new_alp;
Jeej 56:67e3d9608403 863
Jeej 56:67e3d9608403 864 new_alp = (alp_pub_payload_t*)MALLOC(sizeof(alp_pub_payload_t) - 1
Jeej 56:67e3d9608403 865 + ALP_ACTION_RSP_STATUS_SIZE
Jeej 56:67e3d9608403 866 );
Jeej 56:67e3d9608403 867
Jeej 56:67e3d9608403 868 p = new_alp->d;
Jeej 56:67e3d9608403 869
Jeej 56:67e3d9608403 870 ALP_ACTION_RSP_STATUS(p, action, status);
Jeej 56:67e3d9608403 871
Jeej 56:67e3d9608403 872 new_alp->len = (u32)(p - new_alp->d);
Jeej 56:67e3d9608403 873
Jeej 56:67e3d9608403 874 return alp_append(alp, new_alp);
Jeej 56:67e3d9608403 875 }
Jeej 56:67e3d9608403 876
Jeej 56:67e3d9608403 877 //======================================================================
Jeej 56:67e3d9608403 878 // alp_payload_tag
Jeej 56:67e3d9608403 879 //----------------------------------------------------------------------
Jeej 56:67e3d9608403 880 /// @brief Creates malloc'ed ALP payload
Jeej 56:67e3d9608403 881 /// @param alp alp_pub_payload_t* Payload to append the ALP message to. A new payload will be malloc'ed if NULL
Jeej 56:67e3d9608403 882 /// @param tag u8 Action index
Jeej 56:67e3d9608403 883 /// @param tag s8 Status
Jeej 56:67e3d9608403 884 /// @return alp_pub_payload_t* New ALP payload
Jeej 56:67e3d9608403 885 /// @revent NONE
Jeej 56:67e3d9608403 886 //======================================================================
Jeej 56:67e3d9608403 887 alp_pub_payload_t* alp_payload_rsp_fprop(alp_pub_payload_t* alp, u8 fid, alp_file_header_t* hdr)
Jeej 56:67e3d9608403 888 {
Jeej 56:67e3d9608403 889 u8* p;
Jeej 56:67e3d9608403 890 alp_pub_payload_t* new_alp;
Jeej 56:67e3d9608403 891
Jeej 56:67e3d9608403 892 new_alp = (alp_pub_payload_t*)MALLOC(sizeof(alp_pub_payload_t) - 1
Jeej 56:67e3d9608403 893 + ALP_ACTION_RSP_F_PROP_SIZE
Jeej 56:67e3d9608403 894 );
Jeej 56:67e3d9608403 895
Jeej 56:67e3d9608403 896 p = new_alp->d;
Jeej 56:67e3d9608403 897
Jeej 56:67e3d9608403 898 ALP_ACTION_RSP_F_PROP(p, fid, hdr);
Jeej 56:67e3d9608403 899
Jeej 56:67e3d9608403 900 new_alp->len = (u32)(p - new_alp->d);
Jeej 56:67e3d9608403 901
Jeej 56:67e3d9608403 902 return alp_append(alp, new_alp);
Jeej 56:67e3d9608403 903 }
Jeej 56:67e3d9608403 904
Jeej 56:67e3d9608403 905 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)
Jeej 56:67e3d9608403 906 {
Jeej 56:67e3d9608403 907 u8* p;
Jeej 56:67e3d9608403 908 alp_pub_payload_t* new_alp;
Jeej 56:67e3d9608403 909
Jeej 56:67e3d9608403 910 new_alp = (alp_pub_payload_t*)MALLOC(sizeof(alp_pub_payload_t) - 1
Jeej 56:67e3d9608403 911 + ALP_ACTION_ACTIVATE_ITF_SIZE
Jeej 56:67e3d9608403 912 );
Jeej 56:67e3d9608403 913
Jeej 56:67e3d9608403 914 p = new_alp->d;
Jeej 56:67e3d9608403 915
Jeej 56:67e3d9608403 916 ALP_ACTION_ACTIVATE_ITF(p, true, enable, type, nb_dev, ifid, flags);
Jeej 56:67e3d9608403 917
Jeej 56:67e3d9608403 918 new_alp->len = (u32)(p - new_alp->d);
Jeej 56:67e3d9608403 919
Jeej 56:67e3d9608403 920 return alp_append(alp, new_alp);
Jeej 56:67e3d9608403 921 }
Jeej 56:67e3d9608403 922
Jeej 56:67e3d9608403 923 alp_pub_payload_t* alp_payload_urcc_en(alp_pub_payload_t* alp, uint8_t type, uint8_t ifid, uint8_t val)
Jeej 56:67e3d9608403 924 {
Jeej 56:67e3d9608403 925 u8* p;
Jeej 56:67e3d9608403 926 alp_pub_payload_t* new_alp;
Jeej 56:67e3d9608403 927
Jeej 56:67e3d9608403 928 new_alp = (alp_pub_payload_t*)MALLOC(sizeof(alp_pub_payload_t) - 1
Jeej 56:67e3d9608403 929 + ALP_ACTION_ACTIVATE_ITF_SIZE
Jeej 56:67e3d9608403 930 );
Jeej 56:67e3d9608403 931
Jeej 56:67e3d9608403 932 p = new_alp->d;
Jeej 56:67e3d9608403 933
Jeej 56:67e3d9608403 934 ALP_ACTION_URCC_EN(p, true, type, ifid, val);
Jeej 56:67e3d9608403 935
Jeej 56:67e3d9608403 936 new_alp->len = (u32)(p - new_alp->d);
Jeej 56:67e3d9608403 937
Jeej 56:67e3d9608403 938 return alp_append(alp, new_alp);
Jeej 56:67e3d9608403 939 }
Jeej 56:67e3d9608403 940
Jeej 56:67e3d9608403 941 static int _alp_payload_parse(alp_pub_payload_t* alp, u8 op, void* buffer, u8 extract)
Jeej 56:67e3d9608403 942 {
Jeej 56:67e3d9608403 943 if (NULL == alp)
Jeej 56:67e3d9608403 944 {
Jeej 56:67e3d9608403 945 return 0;
Jeej 56:67e3d9608403 946 }
Jeej 56:67e3d9608403 947
Jeej 56:67e3d9608403 948 u8* p = alp->d;
Jeej 56:67e3d9608403 949 u8* d;
Jeej 56:67e3d9608403 950 int rem = alp->len;
Jeej 56:67e3d9608403 951 int len;
Jeej 56:67e3d9608403 952 alp_parsed_chunk_t r;
Jeej 56:67e3d9608403 953
Jeej 56:67e3d9608403 954 while (rem > 0)
Jeej 56:67e3d9608403 955 {
Jeej 56:67e3d9608403 956 // Parse payload
Jeej 56:67e3d9608403 957 d = p;
Jeej 56:67e3d9608403 958 len = alp_parse_chunk(&p, &r);
Jeej 56:67e3d9608403 959 rem -= len;
Jeej 56:67e3d9608403 960
Jeej 56:67e3d9608403 961 if (r.type == op)
Jeej 56:67e3d9608403 962 {
Jeej 56:67e3d9608403 963 // Extract wanted payload
Jeej 56:67e3d9608403 964 if (buffer)
Jeej 56:67e3d9608403 965 {
Jeej 56:67e3d9608403 966 memcpy(buffer, d, len);
Jeej 56:67e3d9608403 967 }
Jeej 56:67e3d9608403 968
Jeej 56:67e3d9608403 969 if (extract)
Jeej 56:67e3d9608403 970 {
Jeej 56:67e3d9608403 971 // Remove parsed OP from total length
Jeej 56:67e3d9608403 972 alp->len -= len;
Jeej 56:67e3d9608403 973
Jeej 56:67e3d9608403 974 // Shift end of payload to delete parsed OP
Jeej 56:67e3d9608403 975 if (rem)
Jeej 56:67e3d9608403 976 {
Jeej 56:67e3d9608403 977 memcpy(d, p, rem);
Jeej 56:67e3d9608403 978 }
Jeej 56:67e3d9608403 979 }
Jeej 56:67e3d9608403 980
Jeej 56:67e3d9608403 981 return len;
Jeej 56:67e3d9608403 982 }
Jeej 56:67e3d9608403 983 }
Jeej 56:67e3d9608403 984
Jeej 56:67e3d9608403 985 return 0;
Jeej 56:67e3d9608403 986 }
Jeej 56:67e3d9608403 987
Jeej 56:67e3d9608403 988 int alp_payload_get(alp_pub_payload_t* alp, u8 op, void* buffer)
Jeej 56:67e3d9608403 989 {
Jeej 56:67e3d9608403 990 return _alp_payload_parse(alp, op, buffer, false);
Jeej 56:67e3d9608403 991 }
Jeej 56:67e3d9608403 992
Jeej 56:67e3d9608403 993 int alp_payload_extract(alp_pub_payload_t* alp, u8 op, void* buffer)
Jeej 56:67e3d9608403 994 {
Jeej 56:67e3d9608403 995 return _alp_payload_parse(alp, op, buffer, true);
Jeej 56:67e3d9608403 996 }