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_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 sap_io_destroy(void *data) { struct sap_connection *conn = data; gboolean connected = FALSE; DBG("conn %p", conn); if (!conn || !conn->io) return; stop_guard_timer(conn); if (conn->state != SAP_STATE_CONNECT_IN_PROGRESS && conn->state != SAP_STATE_CONNECT_MODEM_BUSY) emit_property_changed(connection, server->path, SAP_SERVER_INTERFACE, "Connected", DBUS_TYPE_BOOLEAN, &connected); if (conn->state == SAP_STATE_CONNECT_IN_PROGRESS || conn->state == SAP_STATE_CONNECT_MODEM_BUSY || conn->state == SAP_STATE_CONNECTED || conn->state == SAP_STATE_GRACEFUL_DISCONNECT) sap_disconnect_req(NULL, 1); sap_conn_remove(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); }
static void sap_io_destroy(void *data) { struct sap_server *server = data; struct sap_connection *conn = server->conn; DBG("conn %p", conn); if (!conn || !conn->io) return; stop_guard_timer(server); if (conn->state != SAP_STATE_CONNECT_IN_PROGRESS && conn->state != SAP_STATE_CONNECT_MODEM_BUSY) g_dbus_emit_property_changed(btd_get_dbus_connection(), adapter_get_path(server->adapter), SAP_SERVER_INTERFACE, "Connected"); if (conn->state == SAP_STATE_CONNECT_IN_PROGRESS || conn->state == SAP_STATE_CONNECT_MODEM_BUSY || conn->state == SAP_STATE_CONNECTED || conn->state == SAP_STATE_GRACEFUL_DISCONNECT) sap_disconnect_req(server, 1); sap_server_remove_conn(server); }
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); }