blob: c365bc7d7db1442f98848859e00ac275a8cd2d25 [file] [log] [blame]
Harald Welte52b1f982008-12-23 20:25:15 +00001#ifndef _GSM_SUBSCR_H
2#define _GSM_SUBSCR_H
3
4#include <sys/types.h>
5#include "gsm_data.h"
Harald Weltedfe6c7d2010-02-20 16:24:02 +01006#include <osmocore/linuxlist.h>
Harald Welte52b1f982008-12-23 20:25:15 +00007
Jan Luebbefac25fc2008-12-27 18:04:34 +00008#define GSM_IMEI_LENGTH 17
Jan Luebbe5c15c852008-12-27 15:59:25 +00009#define GSM_IMSI_LENGTH 17
Holger Hans Peter Freytherfa530cd2010-07-25 18:10:02 +080010#define GSM_NAME_LENGTH 160
Mike Haben2449b372009-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
Jan Luebbe5c15c852008-12-27 15:59:25 +000015
Jan Luebbeb0dfc312009-08-12 10:12:52 +020016#define GSM_SUBSCRIBER_FIRST_CONTACT 0x00000001
Holger Hans Peter Freyther22230252009-08-19 12:53:57 +020017#define tmsi_from_string(str) strtoul(str, NULL, 10)
Jan Luebbeb0dfc312009-08-12 10:12:52 +020018
Holger Hans Peter Freyther763b42a2010-12-29 11:07:22 +010019struct vty;
20
Harald Weltec2e302d2009-07-05 14:08:13 +020021struct gsm_equipment {
22 long long unsigned int id;
23 char imei[GSM_IMEI_LENGTH];
24 char name[GSM_NAME_LENGTH];
25
26 struct gsm48_classmark1 classmark1;
27 u_int8_t classmark2_len;
28 u_int8_t classmark2[3];
29 u_int8_t classmark3_len;
30 u_int8_t classmark3[14];
31};
32
Harald Welte52b1f982008-12-23 20:25:15 +000033struct gsm_subscriber {
Harald Welte4bfdfe72009-06-10 23:11:52 +080034 struct gsm_network *net;
Holger Freyther213b20b2009-06-02 03:24:54 +000035 long long unsigned int id;
Jan Luebbe5c15c852008-12-27 15:59:25 +000036 char imsi[GSM_IMSI_LENGTH];
Holger Hans Peter Freyther22230252009-08-19 12:53:57 +020037 u_int32_t tmsi;
Jan Luebbe5c15c852008-12-27 15:59:25 +000038 u_int16_t lac;
39 char name[GSM_NAME_LENGTH];
Jan Luebbe391d86e2008-12-27 22:33:34 +000040 char extension[GSM_EXTENSION_LENGTH];
Jan Luebbe6e2e5452008-12-27 16:47:55 +000041 int authorized;
Holger Freyther12aa50d2009-01-01 18:02:05 +000042
Jan Luebbeb0dfc312009-08-12 10:12:52 +020043 /* Temporary field which is not stored in the DB/HLR */
44 u_int32_t flags;
45
Harald Weltec2e302d2009-07-05 14:08:13 +020046 /* Every user can only have one equipment in use at any given
47 * point in time */
48 struct gsm_equipment equipment;
49
Holger Freyther862cfff2009-06-04 14:15:33 +000050 /* for internal management */
Holger Freyther12aa50d2009-01-01 18:02:05 +000051 int use_count;
52 struct llist_head entry;
Harald Weltef7c43522009-06-09 20:24:21 +000053
Holger Freyther04866d42009-03-31 04:35:19 +020054 /* pending requests */
Holger Freyther85a7b362009-04-18 13:48:55 +020055 int in_callback;
Holger Freyther04866d42009-03-31 04:35:19 +020056 struct llist_head requests;
Harald Welte52b1f982008-12-23 20:25:15 +000057};
58
Jan Luebbe5c15c852008-12-27 15:59:25 +000059enum gsm_subscriber_field {
60 GSM_SUBSCRIBER_IMSI,
61 GSM_SUBSCRIBER_TMSI,
Holger Freyther9c564b82009-02-09 23:39:20 +000062 GSM_SUBSCRIBER_EXTENSION,
Harald Weltebe3e3782009-07-05 14:06:41 +020063 GSM_SUBSCRIBER_ID,
Jan Luebbe5c15c852008-12-27 15:59:25 +000064};
Harald Welte52b1f982008-12-23 20:25:15 +000065
Holger Freyther4a49e772009-04-12 05:37:29 +000066enum gsm_subscriber_update_reason {
67 GSM_SUBSCRIBER_UPDATE_ATTACHED,
68 GSM_SUBSCRIBER_UPDATE_DETACHED,
Harald Weltec2e302d2009-07-05 14:08:13 +020069 GSM_SUBSCRIBER_UPDATE_EQUIPMENT,
Holger Freyther4a49e772009-04-12 05:37:29 +000070};
71
Holger Freyther12aa50d2009-01-01 18:02:05 +000072struct gsm_subscriber *subscr_get(struct gsm_subscriber *subscr);
73struct gsm_subscriber *subscr_put(struct gsm_subscriber *subscr);
Harald Welte9176bd42009-07-23 18:46:00 +020074struct gsm_subscriber *subscr_get_by_tmsi(struct gsm_network *net,
Holger Hans Peter Freyther22230252009-08-19 12:53:57 +020075 u_int32_t tmsi);
Harald Welte9176bd42009-07-23 18:46:00 +020076struct gsm_subscriber *subscr_get_by_imsi(struct gsm_network *net,
77 const char *imsi);
78struct gsm_subscriber *subscr_get_by_extension(struct gsm_network *net,
79 const char *ext);
Harald Welte76042182009-08-08 16:03:15 +020080struct gsm_subscriber *subscr_get_by_id(struct gsm_network *net,
81 unsigned long long id);
Holger Hans Peter Freytherd740b682010-11-15 09:15:01 +010082struct gsm_subscriber *subscr_get_or_create(struct gsm_network *net,
83 const char *imsi);
Holger Freyther4a49e772009-04-12 05:37:29 +000084int subscr_update(struct gsm_subscriber *s, struct gsm_bts *bts, int reason);
Holger Hans Peter Freyther725966d2010-12-27 22:43:28 +010085void subscr_put_channel(struct gsm_subscriber *subscr);
Holger Freyther04866d42009-03-31 04:35:19 +020086void subscr_get_channel(struct gsm_subscriber *subscr,
Holger Hans Peter Freythere4e8bf42009-08-20 13:33:51 +020087 int type, gsm_cbfn *cbfn, void *param);
Holger Hans Peter Freyther8dfd2412010-11-15 13:32:33 +010088struct gsm_subscriber *subscr_active_by_tmsi(struct gsm_network *net,
89 uint32_t tmsi);
90struct gsm_subscriber *subscr_active_by_imsi(struct gsm_network *net,
91 const char *imsi);
Holger Freythera471a412009-01-04 03:47:05 +000092
Holger Hans Peter Freytherebdd3cb2010-12-28 22:12:30 +010093int subscr_pending_requests(struct gsm_subscriber *subscr);
Holger Hans Peter Freytherfc857412010-12-28 22:21:55 +010094int subscr_pending_clear(struct gsm_subscriber *subscr);
Holger Hans Peter Freyther763b42a2010-12-29 11:07:22 +010095int subscr_pending_dump(struct gsm_subscriber *subscr, struct vty *vty);
Holger Hans Peter Freyther451eb292010-12-29 13:45:49 +010096int subscr_pending_kick(struct gsm_subscriber *subscr);
Holger Hans Peter Freytherebdd3cb2010-12-28 22:12:30 +010097
Harald Welte2e6d4682009-12-24 14:50:24 +010098char *subscr_name(struct gsm_subscriber *subscr);
99
Holger Hans Peter Freytherf694d5f2010-12-22 14:31:34 +0100100int subscr_purge_inactive(struct gsm_network *net);
Holger Hans Peter Freytherabd0cac2010-12-22 18:12:11 +0100101void subscr_update_from_db(struct gsm_subscriber *subscr);
Holger Hans Peter Freytherf694d5f2010-12-22 14:31:34 +0100102
Holger Freythera471a412009-01-04 03:47:05 +0000103/* internal */
104struct gsm_subscriber *subscr_alloc(void);
Harald Welte (local)15920de2009-08-14 20:27:16 +0200105extern struct llist_head active_subscribers;
Holger Freyther12aa50d2009-01-01 18:02:05 +0000106
Harald Welte52b1f982008-12-23 20:25:15 +0000107#endif /* _GSM_SUBSCR_H */