blob: 8fcbcb33479914d830c7d5ce0ec40576ee0e67ba [file] [log] [blame]
Harald Welte24173fb2018-08-24 20:37:28 +02001#pragma once
2
Harald Welte8e46ab62020-02-14 12:55:43 +01003#include <osmocom/core/linuxlist.h>
Harald Welte24173fb2018-08-24 20:37:28 +02004#include <osmocom/core/fsm.h>
5#include <osmocom/abis/ipa.h>
Harald Weltef9995a32018-10-14 20:40:05 +02006#include <osmocom/rspro/RsproPDU.h>
Harald Welte24173fb2018-08-24 20:37:28 +02007
8#include "rspro_util.h"
Harald Welte3cded632019-03-09 12:59:41 +01009#include "rspro_client_fsm.h"
Harald Welte9cf013a2019-03-11 22:19:19 +010010#include "slotmap.h"
Harald Weltea4e0a232018-10-14 17:44:25 +020011#include "debug.h"
Harald Welte24173fb2018-08-24 20:37:28 +020012
Harald Welte0e968cc2020-02-22 18:16:16 +010013/***********************************************************************
14 * frontend interface
15 ***********************************************************************/
16
17struct bankd_client;
18
19struct frontend_phys_status {
20 struct {
21 /* all members can be 0 (inactive), 1 (active) or -1 (not supported/known) */
22 int reset_active;
23 int vcc_present;
24 int clk_active;
25 int card_present;
26 } flags;
27 uint16_t voltage_mv;
28 uint8_t fi;
29 uint8_t di;
30 uint8_t wi;
31 uint8_t waiting_time;
32};
33
34struct frontend_pts {
35 const uint8_t *buf;
36 size_t len;
37};
38
39struct frontend_tpdu {
40 const uint8_t *buf;
41 size_t len;
42};
43
44/* API from generic core to frontend (modem/cardem) */
45int frontend_request_card_insert(struct bankd_client *bc);
Harald Welte7b87ba12021-09-08 21:38:35 +020046int frontend_request_card_remove(struct bankd_client *bc);
Harald Welte0e968cc2020-02-22 18:16:16 +010047int frontend_request_sim_remote(struct bankd_client *bc);
Harald Welte7b87ba12021-09-08 21:38:35 +020048int frontend_request_sim_local(struct bankd_client *bc);
Harald Welte0e968cc2020-02-22 18:16:16 +010049int frontend_request_modem_reset(struct bankd_client *bc);
50int frontend_handle_card2modem(struct bankd_client *bc, const uint8_t *data, size_t len);
51int frontend_handle_set_atr(struct bankd_client *bc, const uint8_t *data, size_t len);
52int frontend_handle_slot_status(struct bankd_client *bc, const SlotPhysStatus_t *sts);
Harald Weltee580c932020-05-24 16:03:56 +020053int frontend_append_script_env(struct bankd_client *bc, char **env, int idx, size_t max_env);
Harald Welte0e968cc2020-02-22 18:16:16 +010054
Harald Welte24173fb2018-08-24 20:37:28 +020055/* main.c */
56
Harald Welte0e968cc2020-02-22 18:16:16 +010057struct osmo_st2_cardem_inst;
Harald Welte5ed46932019-12-17 00:02:36 +010058
Harald Welte6a0248b2019-12-17 01:11:24 +010059#define ATR_SIZE_MAX 55
60struct client_config {
61 char *server_host;
62 int server_port;
63
64 int client_id;
65 int client_slot;
66
67 char *gsmtap_host;
68 bool keep_running;
69
70 char *event_script;
71
72 struct {
73 uint8_t data[ATR_SIZE_MAX];
74 uint8_t len;
75 } atr;
Harald Weltec8c77e02022-07-24 12:54:24 +020076 /* ignore any ATR received via RSPRO; only use the hard-coded default or
77 * optionally the ATR given at the command line */
78 bool atr_ignore_rspro;
Harald Welte6a0248b2019-12-17 01:11:24 +010079
80 struct {
81 int vendor_id;
82 int product_id;
83 int config_id;
84 int if_num;
85 int altsetting;
86 int addr;
87 char *path;
88 } usb;
89};
90
Harald Welte24173fb2018-08-24 20:37:28 +020091struct bankd_client {
92 /* connection to the remsim-server (control) */
Harald Weltee56f2b92019-03-02 17:02:13 +010093 struct rspro_server_conn srv_conn;
Harald Welte3e9860b2019-12-02 23:04:54 +010094 /* connection to the remsim-bankd (data) */
95 struct rspro_server_conn bankd_conn;
Harald Welte0e968cc2020-02-22 18:16:16 +010096 /* CLIENT_MAIN fsm */
97 struct osmo_fsm_inst *main_fi;
Harald Welte24173fb2018-08-24 20:37:28 +020098
Harald Weltee56f2b92019-03-02 17:02:13 +010099 /* remote component ID */
100 struct app_comp_id peer_comp_id;
Harald Welte24173fb2018-08-24 20:37:28 +0200101
Harald Welte9cf013a2019-03-11 22:19:19 +0100102 struct bank_slot bankd_slot;
Harald Welte5ed46932019-12-17 00:02:36 +0100103
Harald Welte6a0248b2019-12-17 01:11:24 +0100104 struct client_config *cfg;
Harald Welte0e968cc2020-02-22 18:16:16 +0100105 struct osmo_st2_cardem_inst *cardem;
106 struct frontend_phys_status last_status;
Harald Welte9fac4962020-02-14 21:01:23 +0100107 void *data;
Harald Welte24173fb2018-08-24 20:37:28 +0200108};
Harald Welte1200c822020-02-13 20:43:27 +0100109
Harald Welte8e46ab62020-02-14 12:55:43 +0100110#define srvc2bankd_client(srvc) container_of(srvc, struct bankd_client, srv_conn)
111#define bankdc2bankd_client(bdc) container_of(bdc, struct bankd_client, bankd_conn)
Harald Welte1200c822020-02-13 20:43:27 +0100112
Harald Welte0e968cc2020-02-22 18:16:16 +0100113struct client_config *client_config_init(void *ctx);
114struct bankd_client *remsim_client_create(void *ctx, const char *name, const char *software,
115 struct client_config *cfg);
Harald Welte879ee412020-02-14 14:21:33 +0100116void remsim_client_set_clslot(struct bankd_client *bc, int client_id, int slot_nr);
117
Harald Welte1200c822020-02-13 20:43:27 +0100118extern int client_user_main(struct bankd_client *g_client);
Harald Welte0e968cc2020-02-22 18:16:16 +0100119
120
121/***********************************************************************
122 * main FSM
123 ***********************************************************************/
124
125enum main_fsm_event {
126 MF_E_SRVC_CONNECTED, /* connection to server established (TCP + RSPRO level) */
127 MF_E_SRVC_LOST, /* connection to server was lost */
128 MF_E_SRVC_CONFIG_BANK, /* server instructs us to connect to bankd/slot */
129 MF_E_SRVC_RESET_REQ, /* RsproPDUchoice_PR_ResetStateReq */
130
131 MF_E_BANKD_CONNECTED, /* connection to bankd established (TCP + RSPRO level) */
132 MF_E_BANKD_LOST, /* connection to bankd was lost */
133 MF_E_BANKD_TPDU, /* RsproPDUchoice_PR_tpduCardToModem */
134 MF_E_BANKD_ATR, /* RsproPDUchoice_PR_setAtrReq */
135 MF_E_BANKD_SLOT_STATUS, /* bankSlotStatusInd */
136
137 MF_E_MDM_STATUS_IND, /* status from modem/cardem */
138 MF_E_MDM_PTS_IND, /* PTS indication from modem/cardem */
139 MF_E_MDM_TPDU, /* TPDU from modem/cardem */
140};
141struct osmo_fsm_inst *main_fsm_alloc(void *ctx, struct bankd_client *bc);
142
143
144