blob: f01a47ff07519db43a11e45e28925077fc910622 [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"
Holger Freyther12aa50d2009-01-01 18:02:05 +00006#include "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
10#define GSM_TMSI_LENGTH 17
11#define GSM_NAME_LENGTH 128
Jan Luebbe391d86e2008-12-27 22:33:34 +000012#define GSM_EXTENSION_LENGTH 128
Jan Luebbe5c15c852008-12-27 15:59:25 +000013
Jan Luebbeebcce2a2009-08-12 19:45:37 +020014#define GSM_MIN_EXTEN 20000
15#define GSM_MAX_EXTEN 49999
16
Jan Luebbeb0dfc312009-08-12 10:12:52 +020017#define GSM_SUBSCRIBER_FIRST_CONTACT 0x00000001
18
Harald Weltec2e302d2009-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 Welte52b1f982008-12-23 20:25:15 +000031struct gsm_subscriber {
Harald Welte4bfdfe72009-06-10 23:11:52 +080032 struct gsm_network *net;
Holger Freyther213b20b2009-06-02 03:24:54 +000033 long long unsigned int id;
Jan Luebbe5c15c852008-12-27 15:59:25 +000034 char imsi[GSM_IMSI_LENGTH];
35 char tmsi[GSM_TMSI_LENGTH];
36 u_int16_t lac;
37 char name[GSM_NAME_LENGTH];
Jan Luebbe391d86e2008-12-27 22:33:34 +000038 char extension[GSM_EXTENSION_LENGTH];
Jan Luebbe6e2e5452008-12-27 16:47:55 +000039 int authorized;
Holger Freyther12aa50d2009-01-01 18:02:05 +000040
Jan Luebbeb0dfc312009-08-12 10:12:52 +020041 /* Temporary field which is not stored in the DB/HLR */
42 u_int32_t flags;
43
Harald Weltec2e302d2009-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
Holger Freyther862cfff2009-06-04 14:15:33 +000048 /* for internal management */
Holger Freyther12aa50d2009-01-01 18:02:05 +000049 int use_count;
50 struct llist_head entry;
Harald Weltef7c43522009-06-09 20:24:21 +000051
Holger Freyther04866d42009-03-31 04:35:19 +020052 /* pending requests */
Holger Freyther85a7b362009-04-18 13:48:55 +020053 int in_callback;
Holger Freyther04866d42009-03-31 04:35:19 +020054 struct llist_head requests;
Harald Welte52b1f982008-12-23 20:25:15 +000055};
56
Jan Luebbe5c15c852008-12-27 15:59:25 +000057enum gsm_subscriber_field {
58 GSM_SUBSCRIBER_IMSI,
59 GSM_SUBSCRIBER_TMSI,
Holger Freyther9c564b82009-02-09 23:39:20 +000060 GSM_SUBSCRIBER_EXTENSION,
Harald Weltebe3e3782009-07-05 14:06:41 +020061 GSM_SUBSCRIBER_ID,
Jan Luebbe5c15c852008-12-27 15:59:25 +000062};
Harald Welte52b1f982008-12-23 20:25:15 +000063
Holger Freyther4a49e772009-04-12 05:37:29 +000064enum gsm_subscriber_update_reason {
65 GSM_SUBSCRIBER_UPDATE_ATTACHED,
66 GSM_SUBSCRIBER_UPDATE_DETACHED,
Harald Weltec2e302d2009-07-05 14:08:13 +020067 GSM_SUBSCRIBER_UPDATE_EQUIPMENT,
Holger Freyther4a49e772009-04-12 05:37:29 +000068};
69
Holger Freyther12aa50d2009-01-01 18:02:05 +000070struct gsm_subscriber *subscr_get(struct gsm_subscriber *subscr);
71struct gsm_subscriber *subscr_put(struct gsm_subscriber *subscr);
Harald Welte9176bd42009-07-23 18:46:00 +020072struct gsm_subscriber *subscr_get_by_tmsi(struct gsm_network *net,
73 const char *tmsi);
74struct 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 Welte76042182009-08-08 16:03:15 +020078struct gsm_subscriber *subscr_get_by_id(struct gsm_network *net,
79 unsigned long long id);
Holger Freyther4a49e772009-04-12 05:37:29 +000080int subscr_update(struct gsm_subscriber *s, struct gsm_bts *bts, int reason);
Holger Freythera1f92f02009-04-12 05:37:52 +000081void subscr_put_channel(struct gsm_lchan *lchan);
Holger Freyther04866d42009-03-31 04:35:19 +020082void subscr_get_channel(struct gsm_subscriber *subscr,
83 struct gsm_network *network, int type,
84 gsm_cbfn *cbfn, void *param);
Holger Freythera471a412009-01-04 03:47:05 +000085
86/* internal */
87struct gsm_subscriber *subscr_alloc(void);
Harald Welte (local)15920de2009-08-14 20:27:16 +020088extern struct llist_head active_subscribers;
Holger Freyther12aa50d2009-01-01 18:02:05 +000089
Harald Welte52b1f982008-12-23 20:25:15 +000090#endif /* _GSM_SUBSCR_H */