void sap_connect_req(void *sap_device, uint16_t maxmsgsize) { DBG("status: %d", sim_card_conn_status); if (sim_card_conn_status != SIM_DISCONNECTED) { sap_connect_rsp(sap_device, SAP_STATUS_CONNECTION_FAILED); return; } if (max_msg_size_supported > maxmsgsize) { sap_connect_rsp(sap_device, SAP_STATUS_MAX_MSG_SIZE_TOO_SMALL); return; } if (max_msg_size_supported < maxmsgsize) { sap_connect_rsp(sap_device, SAP_STATUS_MAX_MSG_SIZE_NOT_SUPPORTED); return; } if (ongoing_call_status) { sap_connect_rsp(sap_device, SAP_STATUS_OK_ONGOING_CALL); return; } sim_card_conn_status = SIM_CONNECTED; sap_data = sap_device; sap_connect_rsp(sap_device, SAP_STATUS_OK); sap_status_ind(sap_device, SAP_STATUS_CHANGE_CARD_RESET); }
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 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); }
void sap_connect_req(void *sap_device, uint16_t maxmsgsize) { DBG("sap_device %p maxmsgsize %u", sap_device, maxmsgsize); sap_info("connect request"); if (simd_connect(sap_device) < 0) { sap_connect_rsp(sap_device, SAP_STATUS_CONNECTION_FAILED, 0); return; } if (send_request(u8500.io, STE_START_SAP_REQ, NULL) < 0) { sap_connect_rsp(sap_device, SAP_STATUS_CONNECTION_FAILED, SAP_BUF_SIZE); simd_close(); } }
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 DBusMessage *ongoing_call(DBusConnection *conn, DBusMessage *msg, void *data) { dbus_bool_t ongoing; if (!dbus_message_get_args(msg, NULL, DBUS_TYPE_BOOLEAN, &ongoing, DBUS_TYPE_INVALID)) return invalid_args(msg); if (ongoing_call_status && !ongoing) { /* An ongoing call has finished. Continue connection.*/ sap_connect_rsp(sap_data, SAP_STATUS_OK, max_msg_size_supported); sap_status_ind(sap_data, SAP_STATUS_CHANGE_CARD_RESET); ongoing_call_status = ongoing; } else if (!ongoing_call_status && ongoing) { /* An ongoing call has started.*/ ongoing_call_status = ongoing; } DBG("OngoingCall status set to %d", ongoing_call_status); return dbus_message_new_method_return(msg); }
static void recv_response(struct ste_message *msg) { uint32_t status; uint8_t *param; DBG_VERBOSE("msg_id 0x%x", msg->id); if (msg->id == STE_END_SAP_RSP) { sap_disconnect_rsp(u8500.sap_data); simd_close(); return; } param = msg->payload; status = *(uint32_t *)param; param += sizeof(status); DBG_VERBOSE("status 0x%x", status); switch (msg->id) { case STE_START_SAP_RSP: if (status == STE_STATUS_OK) { sap_connect_rsp(u8500.sap_data, SAP_STATUS_OK, 0); } else { sap_connect_rsp(u8500.sap_data, SAP_STATUS_CONNECTION_FAILED, 0); simd_close(); } break; case STE_SEND_APDU_RSP: recv_pdu(STE_SEND_APDU_MSG, msg, status, param, sap_transfer_apdu_rsp); break; case STE_GET_ATR_RSP: recv_pdu(STE_GET_ATR_MSG, msg, status, param, sap_transfer_atr_rsp); break; case STE_POWER_OFF_RSP: recv_state_change(STE_POWER_OFF_MSG, status, STE_POWERED_OFF, sap_power_sim_off_rsp); break; case STE_POWER_ON_RSP: recv_state_change(STE_POWER_ON_MSG, status, STE_ENABLED, sap_power_sim_on_rsp); break; case STE_RESET_RSP: recv_state_change(STE_RESET_MSG, status, STE_ENABLED, sap_reset_sim_rsp); break; case STE_GET_STATUS_RSP: recv_card_status(status, param); break; case STE_STATUS_IND: recv_status(status); break; default: sap_error("unsupported message received (id 0x%x)", msg->id); } }
static void connect_confirm_cb(GIOChannel *io, gpointer data) { struct sap_connection *conn = server->conn; GError *gerr = NULL; bdaddr_t src, dst; char srcaddr[18], dstaddr[18]; int err; DBG("io %p data %p ", io, data); if (!io) return; if (conn) { g_io_channel_shutdown(io, TRUE, NULL); return; } conn = g_try_new0(struct sap_connection, 1); if (!conn) { error("Can't allocate memory for incomming SAP connection."); g_io_channel_shutdown(io, TRUE, NULL); return; } g_io_channel_set_encoding(io, NULL, NULL); g_io_channel_set_buffered(io, FALSE); server->conn = conn; conn->io = g_io_channel_ref(io); conn->state = SAP_STATE_DISCONNECTED; bt_io_get(io, BT_IO_RFCOMM, &gerr, BT_IO_OPT_SOURCE_BDADDR, &src, BT_IO_OPT_DEST_BDADDR, &dst, BT_IO_OPT_INVALID); if (gerr) { error("%s", gerr->message); g_error_free(gerr); sap_conn_remove(conn); return; } //client_to_be_authorized = &dst; ba2str(&dst, dstaddr); ba2str(&src, srcaddr); if(sap_check_weak_linkkey(srcaddr, dstaddr) == TRUE) { DBG("SAP weak_key was detected."); sap_connect_rsp(conn, SAP_STATUS_CONNECTION_FAILED, SAP_BUF_SIZE); sap_conn_remove(conn); return; } err = btd_request_authorization(&src, &dst, SAP_UUID, connect_auth_cb, conn); if (err < 0) { DBG("Authorization denied: %d %s", err, strerror(err)); sap_conn_remove(conn); return; } DBG("SAP incoming connection (sock %d) authorization.", g_io_channel_unix_get_fd(io)); }