[layer23] Adding LAC and TMSI (both optional) to test card (rplmn)
[osmocom-bb.git] / src / host / layer23 / include / osmocom / bb / mobile / subscriber.h
1 #ifndef _SUBSCRIBER_H
2 #define _SUBSCRIBER_H
3
4 /* GSM 04.08 4.1.2.2 SIM update status */
5 #define GSM_SIM_U0_NULL         0
6 #define GSM_SIM_U1_UPDATED      1
7 #define GSM_SIM_U2_NOT_UPDATED  2
8 #define GSM_SIM_U3_ROAMING_NA   3
9
10 struct gsm_sub_plmn_list {
11         struct llist_head       entry;
12         uint16_t                mcc, mnc;
13 };
14
15 struct gsm_sub_plmn_na {
16         struct llist_head       entry;
17         uint16_t                mcc, mnc;
18         uint8_t                 cause;
19 };
20
21 #define GSM_IMSI_LENGTH         16
22
23 enum {
24         GSM_SIM_TYPE_NONE = 0,
25         GSM_SIM_TYPE_READER,
26         GSM_SIM_TYPE_TEST
27 };
28
29 struct gsm_subscriber {
30         struct osmocom_ms       *ms;
31
32         /* status */
33         uint8_t                 sim_type; /* type of sim */
34         uint8_t                 sim_valid; /* sim inserted and valid */
35         uint8_t                 ustate; /* update status */
36         uint8_t                 imsi_attached; /* attached state */
37
38         /* IMSI & co */
39         char                    imsi[GSM_IMSI_LENGTH];
40         char                    msisdn[31]; /* may include access codes */
41         char                    iccid[21]; /* 20 + termination */
42
43         /* TMSI / LAI */
44         uint32_t                tmsi; /* invalid tmsi: 0xffffffff */
45         uint16_t                mcc, mnc, lac; /* invalid lac: 0x0000 */
46
47
48         /* key */
49         uint8_t                 key_seq; /* ciphering key sequence number */
50         uint8_t                 key[8]; /* 64 bit */
51
52         /* other */
53         struct llist_head       plmn_list; /* PLMN Selector field */
54         struct llist_head       plmn_na; /* not allowed PLMNs */
55         uint8_t                 t6m_hplmn; /* timer for hplmn search */
56
57         /* special things */
58         uint8_t                 always_search_hplmn;
59                 /* search hplmn in other countries also (for test cards) */
60         char                    sim_name[31]; /* name to load/save sim */
61         char                    sim_spn[17]; /* name of service privider */
62
63         /* PLMN last registered */
64         uint8_t                 plmn_valid;
65         uint16_t                plmn_mcc, plmn_mnc;
66
67         /* our access */
68         uint8_t                 acc_barr; /* if we may access, if cell barred */
69         uint16_t                acc_class; /* bitmask of what we may access */
70
71         /* talk to SIM */
72         uint8_t                 sim_state;
73         uint8_t                 sim_pin_required; /* state: wait for PIN */
74         uint8_t                 sim_file_index;
75         uint32_t                sim_handle_query;
76         uint32_t                sim_handle_update;
77         uint32_t                sim_handle_key;
78 };
79
80 int gsm_subscr_init(struct osmocom_ms *ms);
81 int gsm_subscr_exit(struct osmocom_ms *ms);
82 int gsm_subscr_testcard(struct osmocom_ms *ms, uint16_t mcc, uint16_t mnc,
83         uint16_t lac, uint32_t tmsi);
84 int gsm_subscr_simcard(struct osmocom_ms *ms);
85 void gsm_subscr_sim_pin(struct osmocom_ms *ms, char *pin1, char *pin2,
86         int8_t mode);
87 int gsm_subscr_write_loci(struct osmocom_ms *ms);
88 int gsm_subscr_generate_kc(struct osmocom_ms *ms, uint8_t key_seq,
89         uint8_t *rand, uint8_t no_sim);
90 int gsm_subscr_remove(struct osmocom_ms *ms);
91 void new_sim_ustate(struct gsm_subscriber *subscr, int state);
92 int gsm_subscr_del_forbidden_plmn(struct gsm_subscriber *subscr, uint16_t mcc,
93         uint16_t mnc);
94 int gsm_subscr_add_forbidden_plmn(struct gsm_subscriber *subscr, uint16_t mcc,
95                                         uint16_t mnc, uint8_t cause);
96 int gsm_subscr_is_forbidden_plmn(struct gsm_subscriber *subscr, uint16_t mcc,
97                                         uint16_t mnc);
98 int gsm_subscr_dump_forbidden_plmn(struct osmocom_ms *ms,
99                         void (*print)(void *, const char *, ...), void *priv);
100 void gsm_subscr_dump(struct gsm_subscriber *subscr,
101                         void (*print)(void *, const char *, ...), void *priv);
102 char *gsm_check_imsi(const char *imsi);
103
104 #endif /* _SUBSCRIBER_H */
105