osmo-remsim/src/client/client.h

145 lines
4.0 KiB
C

#pragma once
#include <osmocom/core/linuxlist.h>
#include <osmocom/core/fsm.h>
#include <osmocom/abis/ipa.h>
#include <osmocom/rspro/RsproPDU.h>
#include "rspro_util.h"
#include "rspro_client_fsm.h"
#include "slotmap.h"
#include "debug.h"
/***********************************************************************
* frontend interface
***********************************************************************/
struct bankd_client;
struct frontend_phys_status {
struct {
/* all members can be 0 (inactive), 1 (active) or -1 (not supported/known) */
int reset_active;
int vcc_present;
int clk_active;
int card_present;
} flags;
uint16_t voltage_mv;
uint8_t fi;
uint8_t di;
uint8_t wi;
uint8_t waiting_time;
};
struct frontend_pts {
const uint8_t *buf;
size_t len;
};
struct frontend_tpdu {
const uint8_t *buf;
size_t len;
};
/* API from generic core to frontend (modem/cardem) */
int frontend_request_card_insert(struct bankd_client *bc);
int frontend_request_card_remove(struct bankd_client *bc);
int frontend_request_sim_remote(struct bankd_client *bc);
int frontend_request_sim_local(struct bankd_client *bc);
int frontend_request_modem_reset(struct bankd_client *bc);
int frontend_handle_card2modem(struct bankd_client *bc, const uint8_t *data, size_t len);
int frontend_handle_set_atr(struct bankd_client *bc, const uint8_t *data, size_t len);
int frontend_handle_slot_status(struct bankd_client *bc, const SlotPhysStatus_t *sts);
int frontend_append_script_env(struct bankd_client *bc, char **env, int idx, size_t max_env);
/* main.c */
struct osmo_st2_cardem_inst;
#define ATR_SIZE_MAX 55
struct client_config {
char *server_host;
int server_port;
int client_id;
int client_slot;
char *gsmtap_host;
bool keep_running;
char *event_script;
struct {
uint8_t data[ATR_SIZE_MAX];
uint8_t len;
} atr;
/* ignore any ATR received via RSPRO; only use the hard-coded default or
* optionally the ATR given at the command line */
bool atr_ignore_rspro;
struct {
int vendor_id;
int product_id;
int config_id;
int if_num;
int altsetting;
int addr;
char *path;
} usb;
};
struct bankd_client {
/* connection to the remsim-server (control) */
struct rspro_server_conn srv_conn;
/* connection to the remsim-bankd (data) */
struct rspro_server_conn bankd_conn;
/* CLIENT_MAIN fsm */
struct osmo_fsm_inst *main_fi;
/* remote component ID */
struct app_comp_id peer_comp_id;
struct bank_slot bankd_slot;
struct client_config *cfg;
struct osmo_st2_cardem_inst *cardem;
struct frontend_phys_status last_status;
void *data;
};
#define srvc2bankd_client(srvc) container_of(srvc, struct bankd_client, srv_conn)
#define bankdc2bankd_client(bdc) container_of(bdc, struct bankd_client, bankd_conn)
struct client_config *client_config_init(void *ctx);
struct bankd_client *remsim_client_create(void *ctx, const char *name, const char *software,
struct client_config *cfg);
void remsim_client_set_clslot(struct bankd_client *bc, int client_id, int slot_nr);
extern int client_user_main(struct bankd_client *g_client);
/***********************************************************************
* main FSM
***********************************************************************/
enum main_fsm_event {
MF_E_SRVC_CONNECTED, /* connection to server established (TCP + RSPRO level) */
MF_E_SRVC_LOST, /* connection to server was lost */
MF_E_SRVC_CONFIG_BANK, /* server instructs us to connect to bankd/slot */
MF_E_SRVC_RESET_REQ, /* RsproPDUchoice_PR_ResetStateReq */
MF_E_BANKD_CONNECTED, /* connection to bankd established (TCP + RSPRO level) */
MF_E_BANKD_LOST, /* connection to bankd was lost */
MF_E_BANKD_TPDU, /* RsproPDUchoice_PR_tpduCardToModem */
MF_E_BANKD_ATR, /* RsproPDUchoice_PR_setAtrReq */
MF_E_BANKD_SLOT_STATUS, /* bankSlotStatusInd */
MF_E_MDM_STATUS_IND, /* status from modem/cardem */
MF_E_MDM_PTS_IND, /* PTS indication from modem/cardem */
MF_E_MDM_TPDU, /* TPDU from modem/cardem */
};
struct osmo_fsm_inst *main_fsm_alloc(void *ctx, struct bankd_client *bc);