blob: b5e8fb64ffce38bd5ee0f309582fe18527f00b47 [file] [log] [blame]
Harald Welte59b04682009-06-10 05:40:52 +08001#ifndef _GSM_SUBSCR_H
2#define _GSM_SUBSCR_H
3
4#include <sys/types.h>
5#include "gsm_data.h"
Harald Weltef4625b12010-02-20 16:24:02 +01006#include <osmocore/linuxlist.h>
Harald Welte59b04682009-06-10 05:40:52 +08007
8#define GSM_IMEI_LENGTH 17
9#define GSM_IMSI_LENGTH 17
Holger Hans Peter Freytherfb4e7832010-07-25 18:10:02 +080010#define GSM_NAME_LENGTH 160
Mike Habenc0c50792009-10-26 20:36:34 +010011
12#define GSM_EXTENSION_LENGTH 15 /* MSISDN can only be 15 digits length */
13#define GSM_MIN_EXTEN 20000
14#define GSM_MAX_EXTEN 49999
Harald Welte59b04682009-06-10 05:40:52 +080015
Jan Luebbee2974032009-08-12 10:12:52 +020016#define GSM_SUBSCRIBER_FIRST_CONTACT 0x00000001
Holger Hans Peter Freythercd8bacf2009-08-19 12:53:57 +020017#define tmsi_from_string(str) strtoul(str, NULL, 10)
Jan Luebbee2974032009-08-12 10:12:52 +020018
Harald Weltef6845a72009-07-05 14:08:13 +020019struct gsm_equipment {
20 long long unsigned int id;
21 char imei[GSM_IMEI_LENGTH];
22 char name[GSM_NAME_LENGTH];
23
24 struct gsm48_classmark1 classmark1;
25 u_int8_t classmark2_len;
26 u_int8_t classmark2[3];
27 u_int8_t classmark3_len;
28 u_int8_t classmark3[14];
29};
30
Harald Welte59b04682009-06-10 05:40:52 +080031struct gsm_subscriber {
Harald Welte03740842009-06-10 23:11:52 +080032 struct gsm_network *net;
Harald Welte59b04682009-06-10 05:40:52 +080033 long long unsigned int id;
34 char imsi[GSM_IMSI_LENGTH];
Holger Hans Peter Freythercd8bacf2009-08-19 12:53:57 +020035 u_int32_t tmsi;
Harald Welte59b04682009-06-10 05:40:52 +080036 u_int16_t lac;
37 char name[GSM_NAME_LENGTH];
38 char extension[GSM_EXTENSION_LENGTH];
39 int authorized;
40
Jan Luebbee2974032009-08-12 10:12:52 +020041 /* Temporary field which is not stored in the DB/HLR */
42 u_int32_t flags;
43
Harald Weltef6845a72009-07-05 14:08:13 +020044 /* Every user can only have one equipment in use at any given
45 * point in time */
46 struct gsm_equipment equipment;
47
Harald Welte59b04682009-06-10 05:40:52 +080048 /* for internal management */
49 int use_count;
50 struct llist_head entry;
51
Holger Freyther93795ac2009-03-31 04:35:19 +020052 /* pending requests */
Holger Freyther8bdf7622009-04-18 13:48:55 +020053 int in_callback;
Holger Freyther93795ac2009-03-31 04:35:19 +020054 struct llist_head requests;
Harald Welte59b04682009-06-10 05:40:52 +080055};
56
57enum gsm_subscriber_field {
58 GSM_SUBSCRIBER_IMSI,
59 GSM_SUBSCRIBER_TMSI,
60 GSM_SUBSCRIBER_EXTENSION,
Harald Welte4531c6b2009-07-05 14:06:41 +020061 GSM_SUBSCRIBER_ID,
Harald Welte59b04682009-06-10 05:40:52 +080062};
63
64enum gsm_subscriber_update_reason {
65 GSM_SUBSCRIBER_UPDATE_ATTACHED,
66 GSM_SUBSCRIBER_UPDATE_DETACHED,
Harald Weltef6845a72009-07-05 14:08:13 +020067 GSM_SUBSCRIBER_UPDATE_EQUIPMENT,
Harald Welte59b04682009-06-10 05:40:52 +080068};
69
70struct gsm_subscriber *subscr_get(struct gsm_subscriber *subscr);
71struct gsm_subscriber *subscr_put(struct gsm_subscriber *subscr);
Harald Welte75350412009-07-23 18:46:00 +020072struct gsm_subscriber *subscr_get_by_tmsi(struct gsm_network *net,
Holger Hans Peter Freythercd8bacf2009-08-19 12:53:57 +020073 u_int32_t tmsi);
Harald Welte75350412009-07-23 18:46:00 +020074struct gsm_subscriber *subscr_get_by_imsi(struct gsm_network *net,
75 const char *imsi);
76struct gsm_subscriber *subscr_get_by_extension(struct gsm_network *net,
77 const char *ext);
Harald Welte68b7df22009-08-08 16:03:15 +020078struct gsm_subscriber *subscr_get_by_id(struct gsm_network *net,
79 unsigned long long id);
Holger Hans Peter Freytherdcec9aa2010-11-15 09:15:01 +010080struct gsm_subscriber *subscr_get_or_create(struct gsm_network *net,
81 const char *imsi);
Harald Welte59b04682009-06-10 05:40:52 +080082int subscr_update(struct gsm_subscriber *s, struct gsm_bts *bts, int reason);
Holger Hans Peter Freyther5e58a0e2010-06-16 14:02:41 +080083void subscr_put_channel(struct gsm_subscriber_connection *conn);
Holger Freyther93795ac2009-03-31 04:35:19 +020084void subscr_get_channel(struct gsm_subscriber *subscr,
Holger Hans Peter Freyther35672842009-08-20 13:33:51 +020085 int type, gsm_cbfn *cbfn, void *param);
Holger Hans Peter Freytherb0065af2010-11-15 13:32:33 +010086struct gsm_subscriber *subscr_active_by_tmsi(struct gsm_network *net,
87 uint32_t tmsi);
88struct gsm_subscriber *subscr_active_by_imsi(struct gsm_network *net,
89 const char *imsi);
Harald Welte59b04682009-06-10 05:40:52 +080090
Harald Welte0747c6a2009-12-24 14:50:24 +010091char *subscr_name(struct gsm_subscriber *subscr);
92
Holger Hans Peter Freytherec4fa9e2010-12-22 14:31:34 +010093int subscr_purge_inactive(struct gsm_network *net);
94
Harald Welte59b04682009-06-10 05:40:52 +080095/* internal */
96struct gsm_subscriber *subscr_alloc(void);
Harald Welte (local)02d5efa2009-08-14 20:27:16 +020097extern struct llist_head active_subscribers;
Harald Welte59b04682009-06-10 05:40:52 +080098
99#endif /* _GSM_SUBSCR_H */