Exportable version of WizziLab's modem driver.

Dependents:   modem_ref_helper

Committer:
Jeej
Date:
Fri Feb 19 10:59:42 2021 +0000
Revision:
60:08efaaca0e83
Parent:
59:3b38b5f499db
Child:
61:820395fc5572
Fixed responses

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Jeej 1:40ead20ecb14 1 #include "mbed.h"
Jeej 1:40ead20ecb14 2 #include "WizziDebug.h"
Jeej 1:40ead20ecb14 3
Jeej 0:027760f45e2c 4 #include "modem_ref.h"
Jeej 13:10589aaf8853 5 #include "kal_crypto.h"
Jeej 41:6f83174ffed4 6 #include "kal_codec.h"
Jeej 56:67e3d9608403 7 #include "d7a_1x_fs.h"
Jeej 0:027760f45e2c 8
Jeej 39:bc4fccf2d84b 9 #if 0
Jeej 57:5444cfda9889 10 #define REF_PRINT(...) PRINT(__VA_ARGS__)
Jeej 57:5444cfda9889 11 #define URC_PRINT(...) PRINT(__VA_ARGS__)
Jeej 4:8f031be3ff7d 12 #else
Jeej 57:5444cfda9889 13 #define REF_PRINT(...);
Jeej 57:5444cfda9889 14 #define URC_PRINT(...);
Jeej 4:8f031be3ff7d 15 #endif
Jeej 4:8f031be3ff7d 16
Jeej 0:027760f45e2c 17 typedef struct {
Jeej 0:027760f45e2c 18 action_callback_t* cb;
Jeej 57:5444cfda9889 19 alp_payload_t** alp_rsp;
Jeej 56:67e3d9608403 20 } modem_ref_user_t;
Jeej 0:027760f45e2c 21
Jeej 0:027760f45e2c 22 typedef struct {
Jeej 57:5444cfda9889 23 fx_serial_send_t* send;
Jeej 56:67e3d9608403 24 modem_ref_callbacks_t* cb;
Jeej 56:67e3d9608403 25 modem_lwan_callbacks_t* lwan_cb;
Jeej 56:67e3d9608403 26 modem_ref_user_t user[MAX_USER_NB];
Jeej 57:5444cfda9889 27 u8 state;
Jeej 56:67e3d9608403 28 } modem_ref_ctx_t;
Jeej 57:5444cfda9889 29
Jeej 56:67e3d9608403 30 static modem_ref_ctx_t g_modem;
Jeej 0:027760f45e2c 31
Jeej 0:027760f45e2c 32 #define STATE_OPEN 0xab
Jeej 0:027760f45e2c 33 #define STATE_CLOSED 0
Jeej 0:027760f45e2c 34
Jeej 0:027760f45e2c 35 // Flows
Jeej 0:027760f45e2c 36 #define WC_FLOWID_CMD 0x10
Jeej 0:027760f45e2c 37 #define WC_FLOWID_ALP 0x20
Jeej 0:027760f45e2c 38 #define WC_FLOWID_SYS 0x30
Jeej 0:027760f45e2c 39
Jeej 0:027760f45e2c 40 // Sub-Flows
Jeej 0:027760f45e2c 41 #define WC_FLOW_ALP_CMD 0x20
Jeej 0:027760f45e2c 42 #define WC_FLOW_ALP_RESP 0x21
Jeej 0:027760f45e2c 43 #define WC_FLOW_ALP_UNS 0x22
Jeej 0:027760f45e2c 44 #define WC_FLOW_SYS_RST 0x30
Jeej 0:027760f45e2c 45 #define WC_FLOW_SYS_PING 0x34
Jeej 0:027760f45e2c 46 #define WC_FLOW_SYS_PONG 0x35
Jeej 0:027760f45e2c 47 #define WC_FLOW_SYS_CFG 0x36
Jeej 0:027760f45e2c 48 #define WC_FLOW_SYS_XON 0x39
Jeej 0:027760f45e2c 49 #define WC_FLOW_SYS_XOFF 0x3a
Jeej 0:027760f45e2c 50 #define WC_FLOW_SYS_XACK 0x3b
Jeej 0:027760f45e2c 51
Jeej 0:027760f45e2c 52 // Misc CMD...
Jeej 0:027760f45e2c 53 #define WM_BOOT 0x81
Jeej 0:027760f45e2c 54
Jeej 57:5444cfda9889 55 #define PKT_MAX_SIZE 255
Jeej 57:5444cfda9889 56 static void serial_send(WizziComPacketType type, alp_payload_t* alp)
Jeej 57:5444cfda9889 57 {
Jeej 57:5444cfda9889 58 u8 buf[PKT_MAX_SIZE];
Jeej 59:3b38b5f499db 59
Jeej 59:3b38b5f499db 60 //PRINT("<--\n");
Jeej 59:3b38b5f499db 61 //alp_payload_print(alp);
Jeej 59:3b38b5f499db 62
Jeej 57:5444cfda9889 63 u32 len = alp_payload_to_buf(alp, buf, 0, PKT_MAX_SIZE);
Jeej 57:5444cfda9889 64
Jeej 57:5444cfda9889 65 g_modem.send(type, buf, len);
Jeej 59:3b38b5f499db 66
Jeej 59:3b38b5f499db 67 alp_payload_free(alp);
Jeej 57:5444cfda9889 68 }
Jeej 57:5444cfda9889 69
Jeej 57:5444cfda9889 70 static void _call_fs_user_cb(alp_payload_t* alp, int id, u32 action)
Jeej 46:9b83866cef2c 71 {
Jeej 57:5444cfda9889 72 alp_parsed_chunk_t r;
Jeej 57:5444cfda9889 73 u8* p = alp->d;
Jeej 57:5444cfda9889 74
Jeej 57:5444cfda9889 75 if (NULL == alp)
Jeej 57:5444cfda9889 76 {
Jeej 57:5444cfda9889 77 return;
Jeej 57:5444cfda9889 78 }
Jeej 57:5444cfda9889 79
Jeej 57:5444cfda9889 80 alp_parse_chunk(&p, &r);
Jeej 57:5444cfda9889 81
Jeej 57:5444cfda9889 82 switch (r.type)
Jeej 57:5444cfda9889 83 {
Jeej 57:5444cfda9889 84 case ALP_OPCODE_TAG:
Jeej 57:5444cfda9889 85 id = r.meta.tag.id;
Jeej 57:5444cfda9889 86 REF_PRINT("ACT %d: TAG[%d] ID:%d ERR:%d EOP:%d\n", action, id, r.meta.tag.err, r.meta.tag.eop);
Jeej 57:5444cfda9889 87 break;
Jeej 57:5444cfda9889 88 case ALP_OPCODE_F_RD_DATA:
Jeej 57:5444cfda9889 89 REF_PRINT("ACT %d: F_RD_DATA[%d] @%d %d bytes\n", action, r.meta.f_data.fid, r.meta.f_data.offset, r.meta.f_data.length);
Jeej 57:5444cfda9889 90 if (g_modem.cb->read)
Jeej 57:5444cfda9889 91 {
Jeej 57:5444cfda9889 92 g_modem.cb->read(action, r.meta.f_data.fid, r.meta.f_data.offset, r.meta.f_data.length, id);
Jeej 57:5444cfda9889 93 }
Jeej 57:5444cfda9889 94 break;
Jeej 57:5444cfda9889 95 case ALP_OPCODE_F_WR_DATA:
Jeej 57:5444cfda9889 96 REF_PRINT("ACT %d: F_WR_DATA[%d] @%d %d bytes\n", action, r.meta.f_data.fid, r.meta.f_data.offset, r.meta.f_data.length);
Jeej 57:5444cfda9889 97 if (g_modem.cb->write)
Jeej 57:5444cfda9889 98 {
Jeej 57:5444cfda9889 99 g_modem.cb->write(action, r.meta.f_data.fid, r.data, r.meta.f_data.offset, r.meta.f_data.length, id);
Jeej 57:5444cfda9889 100 }
Jeej 57:5444cfda9889 101 break;
Jeej 57:5444cfda9889 102 case ALP_OPCODE_F_RD_PROP:
Jeej 57:5444cfda9889 103 REF_PRINT("ACT %d: F_RD_PROP[%d]\n", action, r.meta.f_data.fid);
Jeej 57:5444cfda9889 104 if (g_modem.cb->read_fprop)
Jeej 57:5444cfda9889 105 {
Jeej 57:5444cfda9889 106 g_modem.cb->read_fprop(action, r.meta.f_data.fid, id);
Jeej 57:5444cfda9889 107 }
Jeej 57:5444cfda9889 108 break;
Jeej 57:5444cfda9889 109 case ALP_OPCODE_F_DELETE:
Jeej 57:5444cfda9889 110 REF_PRINT("ACT %d: F_DELETE[%d]\n", action, r.meta.f_data.fid);
Jeej 57:5444cfda9889 111 if (g_modem.cb->remove)
Jeej 57:5444cfda9889 112 {
Jeej 57:5444cfda9889 113 g_modem.cb->remove(action, r.meta.f_data.fid, id);
Jeej 57:5444cfda9889 114 }
Jeej 57:5444cfda9889 115 break;
Jeej 57:5444cfda9889 116 case ALP_OPCODE_F_FLUSH:
Jeej 57:5444cfda9889 117 REF_PRINT("ACT %d: F_FLUSH[%d]\n", action, r.meta.f_data.fid);
Jeej 57:5444cfda9889 118 if (g_modem.cb->flush)
Jeej 57:5444cfda9889 119 {
Jeej 57:5444cfda9889 120 g_modem.cb->flush(action, r.meta.f_data.fid, id);
Jeej 57:5444cfda9889 121 }
Jeej 57:5444cfda9889 122 break;
Jeej 57:5444cfda9889 123 default:
Jeej 57:5444cfda9889 124 ASSERT(false, "ASSERT: Unsupported ALP File Operation: %d\n", r.type);
Jeej 57:5444cfda9889 125 break;
Jeej 57:5444cfda9889 126 }
Jeej 57:5444cfda9889 127
Jeej 57:5444cfda9889 128 ASSERT(id >= 0, "ASSERT: Wrong id %d\n", id);
Jeej 57:5444cfda9889 129
Jeej 57:5444cfda9889 130 _call_fs_user_cb(alp->next, id, ++action);
Jeej 57:5444cfda9889 131 }
Jeej 46:9b83866cef2c 132
Jeej 57:5444cfda9889 133 static void call_fs_user_cb(alp_payload_t* alp)
Jeej 57:5444cfda9889 134 {
Jeej 57:5444cfda9889 135 _call_fs_user_cb(alp, -1, 0);
Jeej 46:9b83866cef2c 136 }
Jeej 0:027760f45e2c 137
Jeej 57:5444cfda9889 138 static void _call_urc_user_cb(alp_payload_t* alp, u32 action)
Jeej 57:5444cfda9889 139 {
Jeej 57:5444cfda9889 140 alp_parsed_chunk_t r;
Jeej 57:5444cfda9889 141 u8* p = alp->d;
Jeej 57:5444cfda9889 142
Jeej 57:5444cfda9889 143 if (NULL == alp)
Jeej 57:5444cfda9889 144 {
Jeej 57:5444cfda9889 145 return;
Jeej 57:5444cfda9889 146 }
Jeej 57:5444cfda9889 147
Jeej 57:5444cfda9889 148 alp_parse_chunk(&p, &r);
Jeej 57:5444cfda9889 149
Jeej 57:5444cfda9889 150 switch (r.type)
Jeej 57:5444cfda9889 151 {
Jeej 57:5444cfda9889 152 case ALP_OPCODE_RSP_URC:
Jeej 57:5444cfda9889 153 if (ALP_URC_TYPE_LQUAL == r.meta.urc.type)
Jeej 57:5444cfda9889 154 {
Jeej 57:5444cfda9889 155 REF_PRINT("ACT %d: RSP_URC: LQUAL[%d] %d\n", action, r.meta.urc.ifid, r.meta.urc.per);
Jeej 57:5444cfda9889 156 if (g_modem.cb->lqual)
Jeej 57:5444cfda9889 157 {
Jeej 57:5444cfda9889 158 g_modem.cb->lqual(r.meta.urc.ifid, r.meta.urc.per);
Jeej 57:5444cfda9889 159 }
Jeej 57:5444cfda9889 160 }
Jeej 57:5444cfda9889 161 else if (ALP_URC_TYPE_LDOWN == r.meta.urc.type)
Jeej 57:5444cfda9889 162 {
Jeej 57:5444cfda9889 163 REF_PRINT("ACT %d: RSP_URC: LDOWN[%d]\n", action, r.meta.urc.ifid);
Jeej 57:5444cfda9889 164 if (g_modem.cb->ldown)
Jeej 57:5444cfda9889 165 {
Jeej 57:5444cfda9889 166 g_modem.cb->ldown(r.meta.urc.ifid);
Jeej 57:5444cfda9889 167 }
Jeej 57:5444cfda9889 168 }
Jeej 57:5444cfda9889 169 else if (ALP_URC_TYPE_BUSY == r.meta.urc.type)
Jeej 57:5444cfda9889 170 {
Jeej 57:5444cfda9889 171 REF_PRINT("ACT %d: RSP_URC: BUSY[%d]\n", action, r.meta.urc.ifid);
Jeej 57:5444cfda9889 172 if (g_modem.cb->busy)
Jeej 57:5444cfda9889 173 {
Jeej 57:5444cfda9889 174 g_modem.cb->busy(r.meta.urc.ifid);
Jeej 57:5444cfda9889 175 }
Jeej 57:5444cfda9889 176 }
Jeej 57:5444cfda9889 177 else if (ALP_URC_TYPE_ITF_BUSY == r.meta.urc.type)
Jeej 57:5444cfda9889 178 {
Jeej 57:5444cfda9889 179 REF_PRINT("ACT %d: RSP_URC: ITF_BUSY[%d] for %d seconds\n", action, r.meta.urc.ifid, r.meta.urc.per);
Jeej 57:5444cfda9889 180
Jeej 57:5444cfda9889 181 if (FID_LWAN_ITF == r.meta.urc.ifid)
Jeej 57:5444cfda9889 182 {
Jeej 57:5444cfda9889 183 if (g_modem.lwan_cb)
Jeej 57:5444cfda9889 184 {
Jeej 57:5444cfda9889 185 if (MAX_U32 == r.meta.urc.per)
Jeej 57:5444cfda9889 186 {
Jeej 57:5444cfda9889 187 if (g_modem.lwan_cb->join_failed)
Jeej 57:5444cfda9889 188 {
Jeej 57:5444cfda9889 189 g_modem.lwan_cb->join_failed();
Jeej 57:5444cfda9889 190 }
Jeej 57:5444cfda9889 191 }
Jeej 57:5444cfda9889 192 else if (0 == r.meta.urc.per)
Jeej 57:5444cfda9889 193 {
Jeej 57:5444cfda9889 194 if (g_modem.lwan_cb->packet_sent)
Jeej 57:5444cfda9889 195 {
Jeej 57:5444cfda9889 196 g_modem.lwan_cb->packet_sent();
Jeej 57:5444cfda9889 197 }
Jeej 57:5444cfda9889 198 }
Jeej 57:5444cfda9889 199 else
Jeej 57:5444cfda9889 200 {
Jeej 57:5444cfda9889 201 if (g_modem.lwan_cb->itf_busy)
Jeej 57:5444cfda9889 202 {
Jeej 57:5444cfda9889 203 g_modem.lwan_cb->itf_busy(r.meta.urc.per);
Jeej 57:5444cfda9889 204 }
Jeej 57:5444cfda9889 205 }
Jeej 57:5444cfda9889 206 }
Jeej 57:5444cfda9889 207 }
Jeej 57:5444cfda9889 208 else
Jeej 57:5444cfda9889 209 {
Jeej 57:5444cfda9889 210 if (g_modem.cb->itf_busy)
Jeej 57:5444cfda9889 211 {
Jeej 57:5444cfda9889 212 g_modem.cb->itf_busy(r.meta.urc.ifid, r.meta.urc.per);
Jeej 57:5444cfda9889 213 }
Jeej 57:5444cfda9889 214 }
Jeej 57:5444cfda9889 215 }
Jeej 57:5444cfda9889 216 else
Jeej 57:5444cfda9889 217 {
Jeej 57:5444cfda9889 218 ASSERT(false, "ASSERT: Unsupported ALP URC: %d\n", r.meta.urc.type);
Jeej 57:5444cfda9889 219 }
Jeej 57:5444cfda9889 220 break;
Jeej 57:5444cfda9889 221 default:
Jeej 57:5444cfda9889 222 // This could be anything
Jeej 57:5444cfda9889 223 // Let user deal with the payload
Jeej 57:5444cfda9889 224 if (g_modem.cb->udata)
Jeej 57:5444cfda9889 225 {
Jeej 57:5444cfda9889 226 g_modem.cb->udata(alp);
Jeej 57:5444cfda9889 227 }
Jeej 57:5444cfda9889 228 break;
Jeej 57:5444cfda9889 229 }
Jeej 57:5444cfda9889 230
Jeej 57:5444cfda9889 231 _call_urc_user_cb(alp->next, ++action);
Jeej 57:5444cfda9889 232 }
Jeej 57:5444cfda9889 233
Jeej 57:5444cfda9889 234 static void call_urc_user_cb(alp_payload_t* alp)
Jeej 57:5444cfda9889 235 {
Jeej 57:5444cfda9889 236 _call_urc_user_cb(alp, 0);
Jeej 57:5444cfda9889 237 }
Jeej 57:5444cfda9889 238
Jeej 57:5444cfda9889 239 void modem_ref_input(u8 flowid, u8* payload, u8 size)
Jeej 0:027760f45e2c 240 {
Jeej 0:027760f45e2c 241 int rem =size;
Jeej 57:5444cfda9889 242 u8* p = payload;
Jeej 0:027760f45e2c 243 alp_parsed_chunk_t r;
Jeej 0:027760f45e2c 244 int id = -1;
Jeej 57:5444cfda9889 245 s8 err = ALP_ERR_NONE;
Jeej 57:5444cfda9889 246 u8 eop;
Jeej 57:5444cfda9889 247 u32 parsed;
Jeej 57:5444cfda9889 248 alp_payload_t* alp;
Jeej 41:6f83174ffed4 249
Jeej 57:5444cfda9889 250 REF_PRINT("input 0x%x/%d Bytes\n", flowid, size);
Jeej 0:027760f45e2c 251 switch (flowid)
Jeej 0:027760f45e2c 252 {
Jeej 0:027760f45e2c 253 case WC_FLOW_ALP_UNS:
Jeej 0:027760f45e2c 254 case WC_FLOW_ALP_CMD:
Jeej 58:8d58e5cb4037 255
Jeej 57:5444cfda9889 256 // pre-parse payload
Jeej 57:5444cfda9889 257 alp = alp_payload_parse(p, size);
Jeej 58:8d58e5cb4037 258
Jeej 59:3b38b5f499db 259 //PRINT("-->\n");
Jeej 59:3b38b5f499db 260 //alp_payload_print(alp);
Jeej 57:5444cfda9889 261
Jeej 57:5444cfda9889 262 if (ALP_OPCODE_TAG == (alp->d[0] & 0x3F))
Jeej 0:027760f45e2c 263 {
Jeej 57:5444cfda9889 264 // Payload starts with a tag, this must be a FS command
Jeej 57:5444cfda9889 265 call_fs_user_cb(alp);
Jeej 0:027760f45e2c 266 }
Jeej 0:027760f45e2c 267 else
Jeej 0:027760f45e2c 268 {
Jeej 57:5444cfda9889 269 // else this is a 'real' URC (or ISTATUS if enabled on modem)
Jeej 57:5444cfda9889 270 call_urc_user_cb(alp);
Jeej 57:5444cfda9889 271 }
Jeej 57:5444cfda9889 272
Jeej 57:5444cfda9889 273 alp_payload_free(alp);
Jeej 56:67e3d9608403 274
Jeej 0:027760f45e2c 275 break;
Jeej 0:027760f45e2c 276 case WC_FLOW_ALP_RESP:
Jeej 57:5444cfda9889 277
Jeej 57:5444cfda9889 278 // pre-parse payload
Jeej 57:5444cfda9889 279 alp = alp_payload_parse(p, size);
Jeej 58:8d58e5cb4037 280
Jeej 59:3b38b5f499db 281 //PRINT("-->\n");
Jeej 59:3b38b5f499db 282 //alp_payload_print(alp);
Jeej 57:5444cfda9889 283
Jeej 57:5444cfda9889 284 p = alp->d;
Jeej 57:5444cfda9889 285 alp_parse_chunk(&p, &r);
Jeej 57:5444cfda9889 286
Jeej 0:027760f45e2c 287 // This should always be a TAG'ed response as we tag our requests
Jeej 57:5444cfda9889 288 ASSERT((r.type == ALP_OPCODE_RSP_TAG), "ASSERT: expecting RESP_TAG got 0x%02X\n", r.type);
Jeej 57:5444cfda9889 289
Jeej 1:40ead20ecb14 290 id = r.meta.tag.id;
Jeej 1:40ead20ecb14 291 eop = r.meta.tag.eop;
Jeej 58:8d58e5cb4037 292
Jeej 58:8d58e5cb4037 293 if (g_modem.user[id].cb == NULL)
Jeej 58:8d58e5cb4037 294 {
Jeej 58:8d58e5cb4037 295 PRINT("WARNING: NULL Callback for ID %d\n", id);
Jeej 58:8d58e5cb4037 296 alp_payload_print(alp);
Jeej 58:8d58e5cb4037 297 alp_payload_free(alp);
Jeej 58:8d58e5cb4037 298 break;
Jeej 58:8d58e5cb4037 299 }
Jeej 58:8d58e5cb4037 300 //ASSERT(g_modem.user[id].cb != NULL, "ASSERT: NULL Callback for ID %d\n", id);
Jeej 56:67e3d9608403 301
Jeej 58:8d58e5cb4037 302 if (g_modem.user[id].alp_rsp)
Jeej 58:8d58e5cb4037 303 {
Jeej 58:8d58e5cb4037 304 // Give the remaining of the payload to the user to deal with
Jeej 58:8d58e5cb4037 305 *(g_modem.user[id].alp_rsp) = alp_payload_append(*(g_modem.user[id].alp_rsp), alp);
Jeej 58:8d58e5cb4037 306 }
Jeej 58:8d58e5cb4037 307 else
Jeej 58:8d58e5cb4037 308 {
Jeej 58:8d58e5cb4037 309 // Discard payload
Jeej 58:8d58e5cb4037 310 alp_payload_free(alp);
Jeej 58:8d58e5cb4037 311 }
Jeej 58:8d58e5cb4037 312
Jeej 1:40ead20ecb14 313 if(eop)
Jeej 1:40ead20ecb14 314 { // This is mainly for debug, catch old pointers
Jeej 2:bcf269540633 315 //g_modem.user[id].data = NULL;
Jeej 2:bcf269540633 316 //g_modem.user[id].istatus= NULL;
Jeej 20:17852941b19e 317 REF_PRINT("EOP\n");
Jeej 1:40ead20ecb14 318 }
Jeej 57:5444cfda9889 319
Jeej 6:581caeee80e8 320 // User Callback
Jeej 57:5444cfda9889 321 g_modem.user[id].cb(eop, err, id);
Jeej 57:5444cfda9889 322
Jeej 0:027760f45e2c 323 break;
Jeej 0:027760f45e2c 324 case WC_FLOW_SYS_RST:
Jeej 0:027760f45e2c 325 // 'Software' reset request
Jeej 31:517fc900afba 326 if (g_modem.cb->reset)
Jeej 31:517fc900afba 327 {
Jeej 31:517fc900afba 328 g_modem.cb->reset();
Jeej 31:517fc900afba 329 }
Jeej 0:027760f45e2c 330 break;
Jeej 0:027760f45e2c 331 case WC_FLOWID_CMD:
Jeej 0:027760f45e2c 332 if (*p == WM_BOOT)
Jeej 0:027760f45e2c 333 {
Jeej 56:67e3d9608403 334 uint16_t nb_boot;
Jeej 57:5444cfda9889 335 u8 cause;
Jeej 0:027760f45e2c 336 p++;
Jeej 0:027760f45e2c 337 cause = p[0];
Jeej 56:67e3d9608403 338 nb_boot = HAL_TO_U16(p[3], p[2]);
Jeej 31:517fc900afba 339 if (g_modem.cb->boot)
Jeej 31:517fc900afba 340 {
Jeej 56:67e3d9608403 341 g_modem.cb->boot(cause, nb_boot);
Jeej 31:517fc900afba 342 }
Jeej 0:027760f45e2c 343 }
Jeej 0:027760f45e2c 344 else
Jeej 0:027760f45e2c 345 {
Jeej 56:67e3d9608403 346 REF_PRINT("Unsupported CMD :0x%x\n", *p);
Jeej 0:027760f45e2c 347 }
Jeej 0:027760f45e2c 348 break;
Jeej 57:5444cfda9889 349 default:
Jeej 56:67e3d9608403 350 REF_PRINT("Unsupported WC Flowid:0x%x / %d Bytes\n", flowid, size);
Jeej 0:027760f45e2c 351 break;
Jeej 0:027760f45e2c 352 }
Jeej 0:027760f45e2c 353 }
Jeej 0:027760f45e2c 354
Jeej 57:5444cfda9889 355 static u32 modem_ref_add_root_permission(u8* p, u8* root_key, u8* action, u32 action_size)
Jeej 13:10589aaf8853 356 {
Jeej 57:5444cfda9889 357 u8 hash[32];
Jeej 13:10589aaf8853 358
Jeej 13:10589aaf8853 359 // Calculate hash on action
Jeej 13:10589aaf8853 360 kal_sha256_init();
Jeej 13:10589aaf8853 361 kal_sha256_update(action, action_size);
Jeej 56:67e3d9608403 362 kal_sha256_update(root_key, D7A_FS_ROOT_KEY_SIZE);
Jeej 13:10589aaf8853 363 kal_sha256_final(hash);
Jeej 13:10589aaf8853 364 // Prepend Permission-request...
Jeej 56:67e3d9608403 365 ALP_ACTION_PERM_REQ(p, false, ALP_PERM_REQ_ROOT, ALP_WIZZILAB_AUTH_PROTOCOL_ID);
Jeej 13:10589aaf8853 366 // ... and hash
Jeej 56:67e3d9608403 367 memcpy(p, hash, ALP_ACTION_PERM_REQ_TOKEN_SIZE);
Jeej 13:10589aaf8853 368
Jeej 13:10589aaf8853 369 return ALP_ACTION_PERM_REQ_OFFSET;
Jeej 13:10589aaf8853 370 }
Jeej 13:10589aaf8853 371
Jeej 56:67e3d9608403 372 int modem_ref_get_id(action_callback_t* cb)
Jeej 0:027760f45e2c 373 {
Jeej 0:027760f45e2c 374 int i;
Jeej 56:67e3d9608403 375 // Use rolling ids
Jeej 57:5444cfda9889 376 static u8 rolling;
Jeej 56:67e3d9608403 377
Jeej 56:67e3d9608403 378 for(i = 0; i < MAX_USER_NB; i++)
Jeej 0:027760f45e2c 379 {
Jeej 56:67e3d9608403 380 int id = (i + rolling) % MAX_USER_NB;
Jeej 56:67e3d9608403 381
Jeej 56:67e3d9608403 382 if (g_modem.user[id].cb == NULL)
Jeej 0:027760f45e2c 383 {
Jeej 56:67e3d9608403 384 g_modem.user[id].cb = cb;
Jeej 56:67e3d9608403 385 rolling++;
Jeej 58:8d58e5cb4037 386 //PRINT("Get ID:%d/0x%08x\n", id, cb);
Jeej 56:67e3d9608403 387 return id;
Jeej 0:027760f45e2c 388 }
Jeej 0:027760f45e2c 389 }
Jeej 56:67e3d9608403 390 ASSERT(i < MAX_USER_NB, "ASSERT: out of users\n");
Jeej 0:027760f45e2c 391 return -1;
Jeej 0:027760f45e2c 392 }
Jeej 0:027760f45e2c 393
Jeej 57:5444cfda9889 394 int modem_ref_free_id(u8 id)
Jeej 0:027760f45e2c 395 {
Jeej 0:027760f45e2c 396 if (id < MAX_USER_NB)
Jeej 0:027760f45e2c 397 {
Jeej 0:027760f45e2c 398 g_modem.user[id].cb = NULL;
Jeej 58:8d58e5cb4037 399 //PRINT("Free ID:%d\n", id);
Jeej 0:027760f45e2c 400 return id;
Jeej 0:027760f45e2c 401 }
Jeej 0:027760f45e2c 402 return -1;
Jeej 0:027760f45e2c 403 }
Jeej 0:027760f45e2c 404
Jeej 56:67e3d9608403 405 void modem_ref_open(fx_serial_send_t* send, modem_ref_callbacks_t* callbacks)
Jeej 0:027760f45e2c 406 {
Jeej 0:027760f45e2c 407 if (g_modem.state != STATE_OPEN)
Jeej 0:027760f45e2c 408 {
Jeej 57:5444cfda9889 409 g_modem.send = send;
Jeej 0:027760f45e2c 410 g_modem.cb = callbacks;
Jeej 56:67e3d9608403 411 memset(g_modem.user, 0, (MAX_USER_NB * sizeof(modem_ref_user_t)));
Jeej 0:027760f45e2c 412
Jeej 56:67e3d9608403 413 REF_PRINT("Open Modem - Max users:%d\n", MAX_USER_NB);
Jeej 0:027760f45e2c 414
Jeej 0:027760f45e2c 415 g_modem.state = STATE_OPEN;
Jeej 0:027760f45e2c 416 }
Jeej 0:027760f45e2c 417 }
Jeej 0:027760f45e2c 418
Jeej 56:67e3d9608403 419 void modem_ref_close(void)
Jeej 0:027760f45e2c 420 {
Jeej 0:027760f45e2c 421 if (g_modem.state == STATE_OPEN)
Jeej 0:027760f45e2c 422 {
Jeej 0:027760f45e2c 423 g_modem.state = STATE_CLOSED;
Jeej 0:027760f45e2c 424 }
Jeej 0:027760f45e2c 425 }
Jeej 0:027760f45e2c 426
Jeej 56:67e3d9608403 427 void modem_ref_reset(void)
Jeej 6:581caeee80e8 428 {
Jeej 57:5444cfda9889 429 serial_send(WizziComPacketSysReset, NULL);
Jeej 13:10589aaf8853 430 }
Jeej 13:10589aaf8853 431
Jeej 56:67e3d9608403 432 void modem_ref_set_lwan_cb(modem_lwan_callbacks_t* callbacks)
Jeej 13:10589aaf8853 433 {
Jeej 56:67e3d9608403 434 g_modem.lwan_cb = callbacks;
Jeej 13:10589aaf8853 435 }
Jeej 13:10589aaf8853 436
Jeej 57:5444cfda9889 437 void modem_ref_alp(void* itf, alp_payload_t* alp_user, alp_payload_t** alp_rsp, int id)
Jeej 13:10589aaf8853 438 {
Jeej 57:5444cfda9889 439 alp_payload_t* alp = NULL;
Jeej 57:5444cfda9889 440
Jeej 57:5444cfda9889 441 if (alp_rsp)
Jeej 57:5444cfda9889 442 {
Jeej 57:5444cfda9889 443 // Expecting a response
Jeej 0:027760f45e2c 444
Jeej 57:5444cfda9889 445 // Make sure pointer value is NULL
Jeej 57:5444cfda9889 446 *alp_rsp = NULL;
Jeej 57:5444cfda9889 447 }
Jeej 57:5444cfda9889 448
Jeej 57:5444cfda9889 449 // response pointer
Jeej 57:5444cfda9889 450 g_modem.user[id].alp_rsp = alp_rsp;
Jeej 0:027760f45e2c 451
Jeej 56:67e3d9608403 452 // Always a tag
Jeej 56:67e3d9608403 453 alp = alp_payload_tag(alp, id);
Jeej 41:6f83174ffed4 454
Jeej 56:67e3d9608403 455 // Forward on itf if any
Jeej 56:67e3d9608403 456 if (itf)
Jeej 56:67e3d9608403 457 {
Jeej 56:67e3d9608403 458 alp = alp_payload_forward(alp, itf);
Jeej 17:b4ea2a912fd3 459 // NOP action to get istats on ACKs
Jeej 60:08efaaca0e83 460 alp = alp_payload_nop(alp, false);
Jeej 17:b4ea2a912fd3 461 }
Jeej 56:67e3d9608403 462
Jeej 56:67e3d9608403 463 // Add user payload
Jeej 57:5444cfda9889 464 alp = alp_payload_append(alp, alp_user);
Jeej 56:67e3d9608403 465
Jeej 56:67e3d9608403 466 // Send to modem
Jeej 57:5444cfda9889 467 serial_send(WizziComPacketAlpUns, alp);
Jeej 0:027760f45e2c 468 }
Jeej 0:027760f45e2c 469
Jeej 57:5444cfda9889 470 static void _modem_ref_rsp(alp_payload_t* alp_user, u8 err, int id)
Jeej 1:40ead20ecb14 471 {
Jeej 57:5444cfda9889 472 alp_payload_t* alp = NULL;
Jeej 56:67e3d9608403 473
Jeej 57:5444cfda9889 474 // response pointer
Jeej 57:5444cfda9889 475 g_modem.user[id].alp_rsp = NULL;
Jeej 1:40ead20ecb14 476
Jeej 56:67e3d9608403 477 // Always a tag
Jeej 56:67e3d9608403 478 alp = alp_payload_rsp_tag(alp, id, true, err);
Jeej 56:67e3d9608403 479
Jeej 56:67e3d9608403 480 // Add user payload
Jeej 57:5444cfda9889 481 alp = alp_payload_append(alp, alp_user);
Jeej 56:67e3d9608403 482
Jeej 56:67e3d9608403 483 // Send to modem
Jeej 60:08efaaca0e83 484 serial_send(WizziComPacketAlpResp, alp);
Jeej 18:a11302a76e96 485 }
Jeej 18:a11302a76e96 486
Jeej 57:5444cfda9889 487 void modem_ref_respond(u8 action, s8 status, int id)
Jeej 56:67e3d9608403 488 {
Jeej 57:5444cfda9889 489 alp_payload_t* alp = NULL;
Jeej 0:027760f45e2c 490
Jeej 56:67e3d9608403 491 alp = alp_payload_rsp_status(alp, action, status);
Jeej 56:67e3d9608403 492
Jeej 56:67e3d9608403 493 _modem_ref_rsp(alp, (status < ALP_ERR_NONE)? true: false, id);
Jeej 0:027760f45e2c 494 }
Jeej 0:027760f45e2c 495
Jeej 57:5444cfda9889 496 void modem_ref_respond_fprop(u8 fid, alp_file_header_t* hdr, int id)
Jeej 0:027760f45e2c 497 {
Jeej 57:5444cfda9889 498 alp_payload_t* alp = NULL;
Jeej 0:027760f45e2c 499
Jeej 56:67e3d9608403 500 alp = alp_payload_rsp_fprop(alp, fid, hdr);
Jeej 56:67e3d9608403 501
Jeej 56:67e3d9608403 502 _modem_ref_rsp(alp, false, id);
Jeej 0:027760f45e2c 503 }
Jeej 0:027760f45e2c 504
Jeej 57:5444cfda9889 505 void modem_ref_respond_read(u8 fid, void* data, u32 offset, u32 length, int id)
Jeej 0:027760f45e2c 506 {
Jeej 57:5444cfda9889 507 alp_payload_t* alp = NULL;
Jeej 56:67e3d9608403 508
Jeej 56:67e3d9608403 509 alp = alp_payload_rsp_f_data(alp, fid, data, offset, length);
Jeej 56:67e3d9608403 510
Jeej 56:67e3d9608403 511 _modem_ref_rsp(alp, false, id);
Jeej 13:10589aaf8853 512 }