int sap_connect_rsp(void *sap_device, uint8_t status) { struct sap_server *server = sap_device; struct sap_connection *conn = server->conn; char buf[SAP_BUF_SIZE]; struct sap_message *msg = (struct sap_message *) buf; struct sap_parameter *param = (struct sap_parameter *) msg->param; size_t size = sizeof(struct sap_message); if (!conn) return -EINVAL; DBG("state %d pr 0x%02x status 0x%02x", conn->state, conn->processing_req, status); if (conn->state != SAP_STATE_CONNECT_IN_PROGRESS) return -EPERM; memset(buf, 0, sizeof(buf)); msg->id = SAP_CONNECT_RESP; msg->nparam = 0x01; /* Add connection status */ param->id = SAP_PARAM_ID_CONN_STATUS; param->len = htons(SAP_PARAM_ID_CONN_STATUS_LEN); *param->val = status; size += PARAMETER_SIZE(SAP_PARAM_ID_CONN_STATUS_LEN); switch (status) { case SAP_STATUS_OK: sap_set_connected(server); break; case SAP_STATUS_OK_ONGOING_CALL: DBG("ongoing call. Wait for reset indication!"); conn->state = SAP_STATE_CONNECT_MODEM_BUSY; break; case SAP_STATUS_MAX_MSG_SIZE_NOT_SUPPORTED: /* Add MaxMsgSize */ msg->nparam++; param = (struct sap_parameter *) &buf[size]; param->id = SAP_PARAM_ID_MAX_MSG_SIZE; param->len = htons(SAP_PARAM_ID_MAX_MSG_SIZE_LEN); put_be16(SAP_BUF_SIZE, ¶m->val); size += PARAMETER_SIZE(SAP_PARAM_ID_MAX_MSG_SIZE_LEN); /* fall */ default: conn->state = SAP_STATE_DISCONNECTED; /* Timer will shutdown channel if client doesn't send * CONNECT_REQ or doesn't shutdown channel itself.*/ start_guard_timer(server, SAP_TIMER_NO_ACTIVITY); break; } conn->processing_req = SAP_NO_REQ; return send_message(conn, buf, size); }
int sap_connect_rsp(void *sap_device, uint8_t status, uint16_t maxmsgsize) { struct sap_connection *conn = sap_device; char buf[SAP_BUF_SIZE]; struct sap_message *msg = (struct sap_message *) buf; struct sap_parameter *param = (struct sap_parameter *) msg->param; size_t size = sizeof(struct sap_message); if (!conn) return -EINVAL; DBG("state %d pr 0x%02x status 0x%02x", conn->state, conn->processing_req, status); if (conn->state != SAP_STATE_CONNECT_IN_PROGRESS) return -EPERM; memset(buf, 0, sizeof(buf)); msg->id = SAP_CONNECT_RESP; msg->nparam = 0x01; /* Add connection status */ param->id = SAP_PARAM_ID_CONN_STATUS; param->len = htons(SAP_PARAM_ID_CONN_STATUS_LEN); *param->val = status; size += PARAMETER_SIZE(SAP_PARAM_ID_CONN_STATUS_LEN); /* Add MaxMsgSize */ if (maxmsgsize) { uint16_t *len; msg->nparam++; param = (struct sap_parameter *) &buf[size]; param->id = SAP_PARAM_ID_MAX_MSG_SIZE; param->len = htons(SAP_PARAM_ID_MAX_MSG_SIZE_LEN); len = (uint16_t *) ¶m->val; *len = htons(maxmsgsize); size += PARAMETER_SIZE(SAP_PARAM_ID_MAX_MSG_SIZE_LEN); } if (status == SAP_STATUS_OK) { sap_set_connected(conn); } else if (status == SAP_STATUS_OK_ONGOING_CALL) { DBG("ongoing call. Wait for reset indication!"); conn->state = SAP_STATE_CONNECT_MODEM_BUSY; } else { conn->state = SAP_STATE_DISCONNECTED; /* Timer will shutdown channel if client doesn't send * CONNECT_REQ or doesn't shutdown channel itself.*/ start_guard_timer(conn, SAP_TIMER_NO_ACTIVITY); } conn->processing_req = SAP_NO_REQ; return send_message(sap_device, buf, size); }
int sap_status_ind(void *sap_device, uint8_t status_change) { struct sap_connection *conn = sap_device; char buf[SAP_BUF_SIZE]; struct sap_message *msg = (struct sap_message *) buf; struct sap_parameter *param = (struct sap_parameter *) msg->param; size_t size = sizeof(struct sap_message); if (!conn) return -EINVAL; DBG("state %d pr 0x%02x sc 0x%02x", conn->state, conn->processing_req, status_change); /* Might be need to change state to connected after ongoing call.*/ if (conn->state == SAP_STATE_CONNECT_MODEM_BUSY && status_change == SAP_STATUS_CHANGE_CARD_RESET) sap_set_connected(conn); if (conn->state != SAP_STATE_CONNECTED && conn->state != SAP_STATE_GRACEFUL_DISCONNECT) return 0; memset(buf, 0, sizeof(buf)); msg->id = SAP_STATUS_IND; msg->nparam = 0x01; /* Add status change. */ param->id = SAP_PARAM_ID_STATUS_CHANGE; param->len = htons(SAP_PARAM_ID_STATUS_CHANGE_LEN); *param->val = status_change; size += PARAMETER_SIZE(SAP_PARAM_ID_STATUS_CHANGE_LEN); return send_message(sap_device, buf, size); }
static int disconnect_ind(void *sap_device, uint8_t disc_type) { struct sap_connection *conn = sap_device; char buf[SAP_BUF_SIZE]; struct sap_message *msg = (struct sap_message *) buf; struct sap_parameter *param = (struct sap_parameter *) msg->param; size_t size = sizeof(struct sap_message); if (!conn) return -EINVAL; DBG("data %p state %d disc_type 0x%02x", conn, conn->state, disc_type); if (conn->state != SAP_STATE_GRACEFUL_DISCONNECT && conn->state != SAP_STATE_IMMEDIATE_DISCONNECT) { error("Processing error (state %d pr 0x%02x)", conn->state, conn->processing_req); return -EPERM; } memset(buf, 0, sizeof(buf)); msg->id = SAP_DISCONNECT_IND; msg->nparam = 0x01; /* Add disconnection type param. */ param->id = SAP_PARAM_ID_DISCONNECT_IND; param->len = htons(SAP_PARAM_ID_DISCONNECT_IND_LEN); *param->val = disc_type; size += PARAMETER_SIZE(SAP_PARAM_ID_DISCONNECT_IND_LEN); return send_message(sap_device, buf, size); }
int sap_status_ind(void *sap_device, uint8_t status_change) { struct sap_connection *conn = sap_device; char buf[SAP_BUF_SIZE]; struct sap_message *msg = (struct sap_message *) buf; struct sap_parameter *param = (struct sap_parameter *) msg->param; size_t size = sizeof(struct sap_message); if (!conn) return -EINVAL; DBG("state %d pr 0x%02x sc 0x%02x", conn->state, conn->processing_req, status_change); if (conn->state != SAP_STATE_CONNECTED && conn->state != SAP_STATE_GRACEFUL_DISCONNECT) { DBG("state is invalid!!!"); return 0; } memset(buf, 0, sizeof(buf)); msg->id = SAP_STATUS_IND; msg->nparam = 0x01; /* Add status change. */ param->id = SAP_PARAM_ID_STATUS_CHANGE; param->len = htons(SAP_PARAM_ID_STATUS_CHANGE_LEN); *param->val = status_change; size += PARAMETER_SIZE(SAP_PARAM_ID_STATUS_CHANGE_LEN); return send_message(sap_device, buf, size); }
static size_t add_result_parameter(uint8_t result, struct sap_parameter *param) { param->id = SAP_PARAM_ID_RESULT_CODE; param->len = htons(SAP_PARAM_ID_RESULT_CODE_LEN); *param->val = result; return PARAMETER_SIZE(SAP_PARAM_ID_RESULT_CODE_LEN); }
int sap_status_ind(void *sap_device, uint8_t status_change) { struct sap_server *server = sap_device; struct sap_connection *conn = server->conn; char buf[SAP_BUF_SIZE]; struct sap_message *msg = (struct sap_message *) buf; struct sap_parameter *param = (struct sap_parameter *) msg->param; size_t size = sizeof(struct sap_message); if (!conn) return -EINVAL; DBG("state %d pr 0x%02x sc 0x%02x", conn->state, conn->processing_req, status_change); switch (conn->state) { case SAP_STATE_CONNECT_MODEM_BUSY: if (status_change != SAP_STATUS_CHANGE_CARD_RESET) break; /* Change state to connected after ongoing call ended */ sap_set_connected(server); /* fall */ case SAP_STATE_CONNECTED: case SAP_STATE_GRACEFUL_DISCONNECT: memset(buf, 0, sizeof(buf)); msg->id = SAP_STATUS_IND; msg->nparam = 0x01; /* Add status change. */ param->id = SAP_PARAM_ID_STATUS_CHANGE; param->len = htons(SAP_PARAM_ID_STATUS_CHANGE_LEN); *param->val = status_change; size += PARAMETER_SIZE(SAP_PARAM_ID_STATUS_CHANGE_LEN); return send_message(conn, buf, size); case SAP_STATE_DISCONNECTED: case SAP_STATE_CONNECT_IN_PROGRESS: case SAP_STATE_IMMEDIATE_DISCONNECT: case SAP_STATE_CLIENT_DISCONNECT: break; } return 0; }
int sap_transfer_atr_rsp(void *sap_device, uint8_t result, uint8_t *atr, uint16_t length) { struct sap_server *server = sap_device; struct sap_connection *conn = server->conn; char buf[SAP_BUF_SIZE]; struct sap_message *msg = (struct sap_message *) buf; struct sap_parameter *param = (struct sap_parameter *) msg->param; size_t size = sizeof(struct sap_message); if (!conn) return -EINVAL; DBG("result 0x%02x state %d pr 0x%02x len %d", result, conn->state, conn->processing_req, length); if (conn->processing_req != SAP_TRANSFER_ATR_REQ) return 0; if (result == SAP_RESULT_OK && (!atr || (atr && length == 0x00))) return -EINVAL; memset(buf, 0, sizeof(buf)); msg->id = SAP_TRANSFER_ATR_RESP; msg->nparam = 0x01; size += add_result_parameter(result, param); /* Add ATR response */ if (result == SAP_RESULT_OK) { msg->nparam++; param = (struct sap_parameter *) &buf[size]; param->id = SAP_PARAM_ID_ATR; param->len = htons(length); size += PARAMETER_SIZE(length); if (size > SAP_BUF_SIZE) return -EOVERFLOW; memcpy(param->val, atr, length); } conn->processing_req = SAP_NO_REQ; return send_message(conn, buf, size); }
int sap_transfer_apdu_rsp(void *sap_device, uint8_t result, uint8_t *apdu, uint16_t length) { struct sap_connection *conn = sap_device; char buf[SAP_BUF_SIZE]; struct sap_message *msg = (struct sap_message *) buf; struct sap_parameter *param = (struct sap_parameter *) msg->param; size_t size = sizeof(struct sap_message); if (!conn) return -EINVAL; DBG("state %d pr 0x%02x", conn->state, conn->processing_req); if (conn->processing_req != SAP_TRANSFER_APDU_REQ) return 0; if (result == SAP_RESULT_OK && (!apdu || (apdu && length == 0x00))) return -EINVAL; memset(buf, 0, sizeof(buf)); msg->id = SAP_TRANSFER_APDU_RESP; msg->nparam = 0x01; size += add_result_parameter(result, param); /* Add APDU response. */ if (result == SAP_RESULT_OK) { msg->nparam++; param = (struct sap_parameter *) &buf[size]; param->id = SAP_PARAM_ID_RESPONSE_APDU; param->len = htons(length); size += PARAMETER_SIZE(length); if (size > SAP_BUF_SIZE) return -EOVERFLOW; memcpy(param->val, apdu, length); } conn->processing_req = SAP_NO_REQ; return send_message(sap_device, buf, size); }
static int disconnect_ind(struct sap_connection *conn, uint8_t disc_type) { char buf[SAP_BUF_SIZE]; struct sap_message *msg = (struct sap_message *) buf; struct sap_parameter *param = (struct sap_parameter *) msg->param; size_t size = sizeof(struct sap_message); DBG("data %p state %d disc_type 0x%02x", conn, conn->state, disc_type); memset(buf, 0, sizeof(buf)); msg->id = SAP_DISCONNECT_IND; msg->nparam = 0x01; /* Add disconnection type param. */ param->id = SAP_PARAM_ID_DISCONNECT_IND; param->len = htons(SAP_PARAM_ID_DISCONNECT_IND_LEN); *param->val = disc_type; size += PARAMETER_SIZE(SAP_PARAM_ID_DISCONNECT_IND_LEN); return send_message(conn, buf, size); }
int sap_transfer_card_reader_status_rsp(void *sap_device, uint8_t result, uint8_t status) { struct sap_server *server = sap_device; struct sap_connection *conn = server->conn; char buf[SAP_BUF_SIZE]; struct sap_message *msg = (struct sap_message *) buf; struct sap_parameter *param = (struct sap_parameter *) msg->param; size_t size = sizeof(struct sap_message); if (!conn) return -EINVAL; DBG("state %d pr 0x%02x result 0x%02x", conn->state, conn->processing_req, result); if (conn->processing_req != SAP_TRANSFER_CARD_READER_STATUS_REQ) return 0; memset(buf, 0, sizeof(buf)); msg->id = SAP_TRANSFER_CARD_READER_STATUS_RESP; msg->nparam = 0x01; size += add_result_parameter(result, param); /* Add card reader status. */ if (result == SAP_RESULT_OK) { msg->nparam++; param = (struct sap_parameter *) &buf[size]; param->id = SAP_PARAM_ID_CARD_READER_STATUS; param->len = htons(SAP_PARAM_ID_CARD_READER_STATUS_LEN); *param->val = status; size += PARAMETER_SIZE(SAP_PARAM_ID_CARD_READER_STATUS_LEN); } conn->processing_req = SAP_NO_REQ; return send_message(conn, buf, size); }
int sap_connect_rsp(void *sap_device, uint8_t status, uint16_t maxmsgsize) { struct sap_connection *conn = sap_device; char buf[SAP_BUF_SIZE]; struct sap_message *msg = (struct sap_message *) buf; struct sap_parameter *param = (struct sap_parameter *) msg->param; size_t size = sizeof(struct sap_message); if (!conn) return -EINVAL; DBG("state %d pr 0x%02x status 0x%02x", conn->state, conn->processing_req, status); if (conn->state != SAP_STATE_CONNECT_IN_PROGRESS) return -EPERM; memset(buf, 0, sizeof(buf)); msg->id = SAP_CONNECT_RESP; msg->nparam = 0x01; /* Add connection status */ param->id = SAP_PARAM_ID_CONN_STATUS; param->len = htons(SAP_PARAM_ID_CONN_STATUS_LEN); *param->val = status; size += PARAMETER_SIZE(SAP_PARAM_ID_CONN_STATUS_LEN); /* Add MaxMsgSize */ if (maxmsgsize && (status == SAP_STATUS_MAX_MSG_SIZE_NOT_SUPPORTED || status == SAP_STATUS_MAX_MSG_SIZE_TOO_SMALL)) { uint16_t *len; msg->nparam++; param = (struct sap_parameter *) &buf[size]; param->id = SAP_PARAM_ID_MAX_MSG_SIZE; param->len = htons(SAP_PARAM_ID_MAX_MSG_SIZE_LEN); len = (uint16_t *) ¶m->val; *len = htons(maxmsgsize); size += PARAMETER_SIZE(SAP_PARAM_ID_MAX_MSG_SIZE_LEN); } if (status == SAP_STATUS_OK) { gboolean connected = TRUE; DBG("sap - emitting property changed signal connected=true"); emit_property_changed(connection, server->path, SAP_SERVER_INTERFACE, "Connected", DBUS_TYPE_BOOLEAN, &connected); conn->state = SAP_STATE_CONNECTED; } else { DBG("sap connection status=%d",status); conn->state = SAP_STATE_DISCONNECTED; /* Timer will shutdown channel if client doesn't send * CONNECT_REQ or doesn't shutdown channel itself.*/ start_guard_timer(conn, SAP_TIMER_NO_ACTIVITY); } conn->processing_req = SAP_NO_REQ; return send_message(sap_device, buf, size); }