blob: 7aae4c332b4e66a8155f3e57916e33a217da8aad [file] [log] [blame]
Harald Welte59b04682009-06-10 05:40:52 +08001#ifndef _GSM_SUBSCR_H
2#define _GSM_SUBSCR_H
3
Harald Welte59b04682009-06-10 05:40:52 +08004#include "gsm_data.h"
Pablo Neira Ayusodd5fff42011-03-22 16:47:59 +01005#include <osmocom/core/linuxlist.h>
Harald Welte59b04682009-06-10 05:40:52 +08006
7#define GSM_IMEI_LENGTH 17
8#define GSM_IMSI_LENGTH 17
Holger Hans Peter Freytherfb4e7832010-07-25 18:10:02 +08009#define GSM_NAME_LENGTH 160
Mike Habenc0c50792009-10-26 20:36:34 +010010
11#define GSM_EXTENSION_LENGTH 15 /* MSISDN can only be 15 digits length */
12#define GSM_MIN_EXTEN 20000
13#define GSM_MAX_EXTEN 49999
Harald Welte59b04682009-06-10 05:40:52 +080014
Jan Luebbee2974032009-08-12 10:12:52 +020015#define GSM_SUBSCRIBER_FIRST_CONTACT 0x00000001
Holger Hans Peter Freythercd8bacf2009-08-19 12:53:57 +020016#define tmsi_from_string(str) strtoul(str, NULL, 10)
Jan Luebbee2974032009-08-12 10:12:52 +020017
Holger Hans Peter Freyther2fb8ebf2013-07-27 21:07:57 +020018#define GSM_SUBSCRIBER_NO_EXPIRATION 0x0
19
Holger Hans Peter Freyther0fe0c8c2010-12-29 11:07:22 +010020struct vty;
21
Harald Weltef6845a72009-07-05 14:08:13 +020022struct gsm_equipment {
23 long long unsigned int id;
24 char imei[GSM_IMEI_LENGTH];
25 char name[GSM_NAME_LENGTH];
26
27 struct gsm48_classmark1 classmark1;
Holger Hans Peter Freyther7eb8a9a2011-04-18 17:04:00 +020028 uint8_t classmark2_len;
29 uint8_t classmark2[3];
30 uint8_t classmark3_len;
31 uint8_t classmark3[14];
Harald Weltef6845a72009-07-05 14:08:13 +020032};
33
Harald Welte59b04682009-06-10 05:40:52 +080034struct gsm_subscriber {
Harald Welte03740842009-06-10 23:11:52 +080035 struct gsm_network *net;
Harald Welte59b04682009-06-10 05:40:52 +080036 long long unsigned int id;
37 char imsi[GSM_IMSI_LENGTH];
Holger Hans Peter Freyther7eb8a9a2011-04-18 17:04:00 +020038 uint32_t tmsi;
39 uint16_t lac;
Harald Welte59b04682009-06-10 05:40:52 +080040 char name[GSM_NAME_LENGTH];
41 char extension[GSM_EXTENSION_LENGTH];
42 int authorized;
Jan Luebbefe7cc1e2012-12-27 00:27:16 +010043 time_t expire_lu;
Harald Welte59b04682009-06-10 05:40:52 +080044
Jan Luebbee2974032009-08-12 10:12:52 +020045 /* Temporary field which is not stored in the DB/HLR */
Holger Hans Peter Freyther7eb8a9a2011-04-18 17:04:00 +020046 uint32_t flags;
Jan Luebbee2974032009-08-12 10:12:52 +020047
Harald Weltef6845a72009-07-05 14:08:13 +020048 /* Every user can only have one equipment in use at any given
49 * point in time */
50 struct gsm_equipment equipment;
51
Harald Welte59b04682009-06-10 05:40:52 +080052 /* for internal management */
53 int use_count;
54 struct llist_head entry;
55
Holger Freyther93795ac2009-03-31 04:35:19 +020056 /* pending requests */
Holger Freyther8bdf7622009-04-18 13:48:55 +020057 int in_callback;
Holger Freyther93795ac2009-03-31 04:35:19 +020058 struct llist_head requests;
Harald Welte59b04682009-06-10 05:40:52 +080059};
60
61enum gsm_subscriber_field {
62 GSM_SUBSCRIBER_IMSI,
63 GSM_SUBSCRIBER_TMSI,
64 GSM_SUBSCRIBER_EXTENSION,
Harald Welte4531c6b2009-07-05 14:06:41 +020065 GSM_SUBSCRIBER_ID,
Harald Welte59b04682009-06-10 05:40:52 +080066};
67
68enum gsm_subscriber_update_reason {
69 GSM_SUBSCRIBER_UPDATE_ATTACHED,
70 GSM_SUBSCRIBER_UPDATE_DETACHED,
Harald Weltef6845a72009-07-05 14:08:13 +020071 GSM_SUBSCRIBER_UPDATE_EQUIPMENT,
Harald Welte59b04682009-06-10 05:40:52 +080072};
73
74struct gsm_subscriber *subscr_get(struct gsm_subscriber *subscr);
75struct gsm_subscriber *subscr_put(struct gsm_subscriber *subscr);
Holger Hans Peter Freytherabe587d2013-10-04 08:35:11 +020076struct gsm_subscriber *subscr_create_subscriber(struct gsm_network *net,
77 const char *imsi);
Harald Welte75350412009-07-23 18:46:00 +020078struct gsm_subscriber *subscr_get_by_tmsi(struct gsm_network *net,
Holger Hans Peter Freyther7eb8a9a2011-04-18 17:04:00 +020079 uint32_t tmsi);
Harald Welte75350412009-07-23 18:46:00 +020080struct gsm_subscriber *subscr_get_by_imsi(struct gsm_network *net,
81 const char *imsi);
82struct gsm_subscriber *subscr_get_by_extension(struct gsm_network *net,
83 const char *ext);
Harald Welte68b7df22009-08-08 16:03:15 +020084struct gsm_subscriber *subscr_get_by_id(struct gsm_network *net,
85 unsigned long long id);
Holger Hans Peter Freytherdcec9aa2010-11-15 09:15:01 +010086struct gsm_subscriber *subscr_get_or_create(struct gsm_network *net,
87 const char *imsi);
Harald Welte59b04682009-06-10 05:40:52 +080088int subscr_update(struct gsm_subscriber *s, struct gsm_bts *bts, int reason);
Holger Hans Peter Freyther000571f2010-12-27 22:43:28 +010089void subscr_put_channel(struct gsm_subscriber *subscr);
Holger Freyther93795ac2009-03-31 04:35:19 +020090void subscr_get_channel(struct gsm_subscriber *subscr,
Holger Hans Peter Freyther35672842009-08-20 13:33:51 +020091 int type, gsm_cbfn *cbfn, void *param);
Holger Hans Peter Freytherb0065af2010-11-15 13:32:33 +010092struct gsm_subscriber *subscr_active_by_tmsi(struct gsm_network *net,
93 uint32_t tmsi);
94struct gsm_subscriber *subscr_active_by_imsi(struct gsm_network *net,
95 const char *imsi);
Harald Welte59b04682009-06-10 05:40:52 +080096
Holger Hans Peter Freyther5b72b302010-12-28 22:12:30 +010097int subscr_pending_requests(struct gsm_subscriber *subscr);
Holger Hans Peter Freytherce69aec2010-12-28 22:21:55 +010098int subscr_pending_clear(struct gsm_subscriber *subscr);
Holger Hans Peter Freyther0fe0c8c2010-12-29 11:07:22 +010099int subscr_pending_dump(struct gsm_subscriber *subscr, struct vty *vty);
Holger Hans Peter Freythere5d806e2010-12-29 13:45:49 +0100100int subscr_pending_kick(struct gsm_subscriber *subscr);
Holger Hans Peter Freyther5b72b302010-12-28 22:12:30 +0100101
Harald Welte0747c6a2009-12-24 14:50:24 +0100102char *subscr_name(struct gsm_subscriber *subscr);
103
Holger Hans Peter Freytherec4fa9e2010-12-22 14:31:34 +0100104int subscr_purge_inactive(struct gsm_network *net);
Holger Hans Peter Freyther0c29e5f2010-12-22 18:12:11 +0100105void subscr_update_from_db(struct gsm_subscriber *subscr);
Jan Luebbefe7cc1e2012-12-27 00:27:16 +0100106void subscr_expire(struct gsm_network *net);
Holger Hans Peter Freytherc25021f2013-06-30 15:30:47 +0200107int subscr_update_expire_lu(struct gsm_subscriber *subscr, struct gsm_bts *bts);
Holger Hans Peter Freytherec4fa9e2010-12-22 14:31:34 +0100108
Harald Welte59b04682009-06-10 05:40:52 +0800109/* internal */
110struct gsm_subscriber *subscr_alloc(void);
Harald Welte (local)02d5efa2009-08-14 20:27:16 +0200111extern struct llist_head active_subscribers;
Harald Welte59b04682009-06-10 05:40:52 +0800112
113#endif /* _GSM_SUBSCR_H */