static void transfer_apdu_req(struct sap_connection *conn, struct sap_parameter *param) { DBG("conn %p state %d", conn, conn->state); if (!param) goto error_rsp; param->len = ntohs(param->len); if (conn->state != SAP_STATE_CONNECTED && conn->state != SAP_STATE_GRACEFUL_DISCONNECT) goto error_rsp; if (conn->processing_req != SAP_NO_REQ) goto error_rsp; conn->processing_req = SAP_TRANSFER_APDU_REQ; sap_transfer_apdu_req(conn, param); return; error_rsp: sap_error_rsp(conn); }
static void connect_req(struct sap_connection *conn, struct sap_parameter *param) { uint16_t maxmsgsize, *val; DBG("conn %p state %d", conn, conn->state); if (!param) goto error_rsp; if (conn->state != SAP_STATE_DISCONNECTED) goto error_rsp; stop_guard_timer(conn); val = (uint16_t *) ¶m->val; maxmsgsize = ntohs(*val); DBG("Connect MaxMsgSize: 0x%04x", maxmsgsize); conn->state = SAP_STATE_CONNECT_IN_PROGRESS; if (maxmsgsize <= SAP_BUF_SIZE) { conn->processing_req = SAP_CONNECT_REQ; sap_connect_req(conn, maxmsgsize); } else { sap_connect_rsp(conn, SAP_STATUS_MAX_MSG_SIZE_NOT_SUPPORTED, SAP_BUF_SIZE); } return; error_rsp: sap_error_rsp(conn); }
static int disconnect_req(struct sap_connection *conn, uint8_t disc_type) { DBG("conn %p state %d disc_type 0x%02x", conn, conn->state, disc_type); switch (disc_type) { case SAP_DISCONNECTION_TYPE_GRACEFUL: if (conn->state == SAP_STATE_DISCONNECTED || conn->state == SAP_STATE_CONNECT_IN_PROGRESS || conn->state == SAP_STATE_CONNECT_MODEM_BUSY) return -EPERM; if (conn->state == SAP_STATE_CONNECTED) { conn->state = SAP_STATE_GRACEFUL_DISCONNECT; conn->processing_req = SAP_NO_REQ; disconnect_ind(conn, disc_type); /* Timer will disconnect if client won't do.*/ start_guard_timer(conn, SAP_TIMER_GRACEFUL_DISCONNECT); } return 0; case SAP_DISCONNECTION_TYPE_IMMEDIATE: if (conn->state == SAP_STATE_DISCONNECTED || conn->state == SAP_STATE_CONNECT_IN_PROGRESS || conn->state == SAP_STATE_CONNECT_MODEM_BUSY) return -EPERM; if (conn->state == SAP_STATE_CONNECTED || conn->state == SAP_STATE_GRACEFUL_DISCONNECT) { conn->state = SAP_STATE_IMMEDIATE_DISCONNECT; conn->processing_req = SAP_NO_REQ; stop_guard_timer(conn); disconnect_ind(conn, disc_type); sap_disconnect_req(conn, 0); } return 0; case SAP_DISCONNECTION_TYPE_CLIENT: if (conn->state != SAP_STATE_CONNECTED && conn->state != SAP_STATE_GRACEFUL_DISCONNECT) { sap_error_rsp(conn); return -EPERM; } conn->state = SAP_STATE_CLIENT_DISCONNECT; conn->processing_req = SAP_NO_REQ; stop_guard_timer(conn); sap_disconnect_req(conn, 0); return 0; default: error("Unknown disconnection type (0x%02x).", disc_type); return -EINVAL; } }
static void connect_req(struct sap_server *server, struct sap_parameter *param) { struct sap_connection *conn = server->conn; uint16_t maxmsgsize; DBG("conn %p state %d", conn, conn->state); if (!param) goto error_rsp; if (conn->state != SAP_STATE_DISCONNECTED) goto error_rsp; stop_guard_timer(server); maxmsgsize = get_be16(¶m->val); DBG("Connect MaxMsgSize: 0x%04x", maxmsgsize); conn->state = SAP_STATE_CONNECT_IN_PROGRESS; if (maxmsgsize <= SAP_BUF_SIZE) { conn->processing_req = SAP_CONNECT_REQ; sap_connect_req(server, maxmsgsize); } else { sap_connect_rsp(server, SAP_STATUS_MAX_MSG_SIZE_NOT_SUPPORTED); } return; error_rsp: sap_error_rsp(conn); }
static int handle_cmd(void *data, void *buf, size_t size) { struct sap_message *msg = buf; struct sap_connection *conn = data; if (!conn) return -EINVAL; if (size < sizeof(struct sap_message)) goto error_rsp; if (msg->nparam != 0 && size < (sizeof(struct sap_message) + sizeof(struct sap_parameter) + 4)) goto error_rsp; if (check_msg(msg) < 0) goto error_rsp; DBG("Msg id = %x",msg->id); switch (msg->id) { case SAP_CONNECT_REQ: connect_req(conn, msg->param); return 0; case SAP_DISCONNECT_REQ: disconnect_req(conn, SAP_DISCONNECTION_TYPE_CLIENT); return 0; case SAP_TRANSFER_APDU_REQ: transfer_apdu_req(conn, msg->param); return 0; case SAP_TRANSFER_ATR_REQ: transfer_atr_req(conn); return 0; case SAP_POWER_SIM_OFF_REQ: power_sim_off_req(conn); return 0; case SAP_POWER_SIM_ON_REQ: power_sim_on_req(conn); return 0; case SAP_RESET_SIM_REQ: reset_sim_req(conn); return 0; case SAP_TRANSFER_CARD_READER_STATUS_REQ: transfer_card_reader_status_req(conn); return 0; case SAP_SET_TRANSPORT_PROTOCOL_REQ: set_transport_protocol_req(conn, msg->param); return 0; default: DBG("SAP unknown message."); break; } error_rsp: DBG("Bad request message format."); sap_error_rsp(conn); return -EBADMSG; }
static void connect_req(struct sap_connection *conn, struct sap_parameter *param) { uint16_t maxmsgsize, *val; DBG("conn %p state %d", conn, conn->state); if (!param) goto error_rsp; if (conn->state != SAP_STATE_DISCONNECTED) goto error_rsp; stop_guard_timer(conn); val = (uint16_t *) ¶m->val; maxmsgsize = ntohs(*val); DBG("Connect MaxMsgSize: 0x%04x", maxmsgsize); conn->state = SAP_STATE_CONNECT_IN_PROGRESS; if (maxmsgsize <= SAP_BUF_SIZE) { // open RIL Client if (!isRilConnected) isRilConnected = sap_open_ril(); if (isRilConnected) { conn->processing_req = SAP_CONNECT_REQ; sap_connect_req(conn, maxmsgsize); } else { sap_connect_rsp(conn, SAP_STATUS_CONNECTION_FAILED, maxmsgsize); } } else { sap_connect_rsp(conn, SAP_STATUS_MAX_MSG_SIZE_NOT_SUPPORTED, SAP_BUF_SIZE); } return; error_rsp: error("Processing error (param %p state %d pr 0x%02x)", param, conn->state, conn->processing_req); sap_error_rsp(conn); }
static void transfer_card_reader_status_req(struct sap_connection *conn) { DBG("conn %p state %d", conn, conn->state); if (conn->state != SAP_STATE_CONNECTED) goto error_rsp; if (conn->processing_req != SAP_NO_REQ) goto error_rsp; conn->processing_req = SAP_TRANSFER_CARD_READER_STATUS_REQ; sap_transfer_card_reader_status_req(conn); return; error_rsp: sap_error_rsp(conn); }
static void reset_sim_req(struct sap_connection *conn) { DBG("conn %p state %d", conn, conn->state); if (conn->state != SAP_STATE_CONNECTED) goto error_rsp; if (!is_reset_sim_req_allowed(conn->processing_req)) goto error_rsp; conn->processing_req = SAP_RESET_SIM_REQ; sap_reset_sim_req(conn); return; error_rsp: sap_error_rsp(conn); }
static void power_sim_on_req(struct sap_connection *conn) { DBG("conn %p state %d", conn, conn->state); if (conn->state != SAP_STATE_CONNECTED) goto error_rsp; if (conn->processing_req != SAP_NO_REQ) goto error_rsp; conn->processing_req = SAP_POWER_SIM_ON_REQ; sap_power_sim_on_req(conn); return; error_rsp: sap_error_rsp(conn); }
static void power_sim_off_req(struct sap_connection *conn) { DBG("conn %p state %d", conn, conn->state); if (conn->state != SAP_STATE_CONNECTED) goto error_rsp; if (!is_power_sim_off_req_allowed(conn->processing_req)) goto error_rsp; conn->processing_req = SAP_POWER_SIM_OFF_REQ; sap_power_sim_off_req(conn); return; error_rsp: error("Processing error (state %d pr 0x%02x)", conn->state, conn->processing_req); sap_error_rsp(conn); }
static void transfer_atr_req(struct sap_connection *conn) { DBG("conn %p state %d", conn, conn->state); if (conn->state != SAP_STATE_CONNECTED) goto error_rsp; if (conn->processing_req != SAP_NO_REQ) goto error_rsp; conn->processing_req = SAP_TRANSFER_ATR_REQ; sap_transfer_atr_req(conn); return; error_rsp: error("Processing error (state %d pr 0x%02x)", conn->state, conn->processing_req); sap_error_rsp(conn); }
static void power_sim_off_req(struct sap_server *server) { struct sap_connection *conn = server->conn; DBG("conn %p state %d", conn, conn->state); if (conn->state != SAP_STATE_CONNECTED) goto error_rsp; if (!is_power_sim_off_req_allowed(conn->processing_req)) goto error_rsp; conn->processing_req = SAP_POWER_SIM_OFF_REQ; sap_power_sim_off_req(server); return; error_rsp: sap_error_rsp(conn); }
static void transfer_atr_req(struct sap_server *server) { struct sap_connection *conn = server->conn; DBG("conn %p state %d", conn, conn->state); if (conn->state != SAP_STATE_CONNECTED) goto error_rsp; if (conn->processing_req != SAP_NO_REQ) goto error_rsp; conn->processing_req = SAP_TRANSFER_ATR_REQ; sap_transfer_atr_req(server); return; error_rsp: sap_error_rsp(conn); }
static void set_transport_protocol_req(struct sap_connection *conn, struct sap_parameter *param) { if (!param) goto error_rsp; DBG("conn %p state %d param %p", conn, conn->state, param); if (conn->state != SAP_STATE_CONNECTED) goto error_rsp; if (conn->processing_req != SAP_NO_REQ) goto error_rsp; conn->processing_req = SAP_SET_TRANSPORT_PROTOCOL_REQ; sap_set_transport_protocol_req(conn, param); return; error_rsp: sap_error_rsp(conn); }