blob: 02cab40989d409dfca00a9cba02da066ad7432e7 [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
Holger Hans Peter Freythercd8bacf2009-08-19 12:53:57 +020016/* reserved according to GSM 03.03 ยง 2.4 */
17#define GSM_RESERVED_TMSI 0xFFFFFFFF
18
Jan Luebbe62cc86d2009-08-12 19:45:37 +020019
Jan Luebbee2974032009-08-12 10:12:52 +020020#define GSM_SUBSCRIBER_FIRST_CONTACT 0x00000001
Holger Hans Peter Freythercd8bacf2009-08-19 12:53:57 +020021#define tmsi_from_string(str) strtoul(str, NULL, 10)
Jan Luebbee2974032009-08-12 10:12:52 +020022
Harald Weltef6845a72009-07-05 14:08:13 +020023struct gsm_equipment {
24 long long unsigned int id;
25 char imei[GSM_IMEI_LENGTH];
26 char name[GSM_NAME_LENGTH];
27
28 struct gsm48_classmark1 classmark1;
29 u_int8_t classmark2_len;
30 u_int8_t classmark2[3];
31 u_int8_t classmark3_len;
32 u_int8_t classmark3[14];
33};
34
Harald Welte59b04682009-06-10 05:40:52 +080035struct gsm_subscriber {
Harald Welte03740842009-06-10 23:11:52 +080036 struct gsm_network *net;
Harald Welte59b04682009-06-10 05:40:52 +080037 long long unsigned int id;
38 char imsi[GSM_IMSI_LENGTH];
Holger Hans Peter Freythercd8bacf2009-08-19 12:53:57 +020039 u_int32_t tmsi;
Harald Welte59b04682009-06-10 05:40:52 +080040 u_int16_t lac;
41 char name[GSM_NAME_LENGTH];
42 char extension[GSM_EXTENSION_LENGTH];
43 int authorized;
44
Jan Luebbee2974032009-08-12 10:12:52 +020045 /* Temporary field which is not stored in the DB/HLR */
46 u_int32_t flags;
47
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);
Harald Welte75350412009-07-23 18:46:00 +020076struct gsm_subscriber *subscr_get_by_tmsi(struct gsm_network *net,
Holger Hans Peter Freythercd8bacf2009-08-19 12:53:57 +020077 u_int32_t tmsi);
Harald Welte75350412009-07-23 18:46:00 +020078struct gsm_subscriber *subscr_get_by_imsi(struct gsm_network *net,
79 const char *imsi);
80struct gsm_subscriber *subscr_get_by_extension(struct gsm_network *net,
81 const char *ext);
Harald Welte68b7df22009-08-08 16:03:15 +020082struct gsm_subscriber *subscr_get_by_id(struct gsm_network *net,
83 unsigned long long id);
Harald Welte59b04682009-06-10 05:40:52 +080084int subscr_update(struct gsm_subscriber *s, struct gsm_bts *bts, int reason);
Holger Hans Peter Freyther5e58a0e2010-06-16 14:02:41 +080085void subscr_put_channel(struct gsm_subscriber_connection *conn);
Holger Freyther93795ac2009-03-31 04:35:19 +020086void subscr_get_channel(struct gsm_subscriber *subscr,
Holger Hans Peter Freyther35672842009-08-20 13:33:51 +020087 int type, gsm_cbfn *cbfn, void *param);
Harald Welte59b04682009-06-10 05:40:52 +080088
Harald Welte0747c6a2009-12-24 14:50:24 +010089char *subscr_name(struct gsm_subscriber *subscr);
90
Harald Welte59b04682009-06-10 05:40:52 +080091/* internal */
92struct gsm_subscriber *subscr_alloc(void);
Harald Welte (local)02d5efa2009-08-14 20:27:16 +020093extern struct llist_head active_subscribers;
Harald Welte59b04682009-06-10 05:40:52 +080094
95#endif /* _GSM_SUBSCR_H */