blob: 7e656145a7bfa5f98b8b2588b8e691cef636d9bc [file] [log] [blame]
Harald Welte52b1f982008-12-23 20:25:15 +00001#ifndef _GSM_SUBSCR_H
2#define _GSM_SUBSCR_H
3
Neels Hofmeyrab04fb22016-05-30 22:32:51 +02004#include <stdbool.h>
5
Pablo Neira Ayuso136f4532011-03-22 16:47:59 +01006#include <osmocom/core/linuxlist.h>
Harald Welted3fa84d2016-04-20 17:50:17 +02007#include <osmocom/gsm/protocol/gsm_23_003.h>
Harald Welte52b1f982008-12-23 20:25:15 +00008
Neels Hofmeyrab04fb22016-05-30 22:32:51 +02009#include <openbsc/gsm_data.h>
Maxe6052c42016-06-30 10:25:49 +020010
Holger Hans Peter Freytherfa530cd2010-07-25 18:10:02 +080011#define GSM_NAME_LENGTH 160
Mike Haben2449b372009-10-26 20:36:34 +010012
13#define GSM_EXTENSION_LENGTH 15 /* MSISDN can only be 15 digits length */
14#define GSM_MIN_EXTEN 20000
15#define GSM_MAX_EXTEN 49999
Jan Luebbe5c15c852008-12-27 15:59:25 +000016
Jan Luebbeb0dfc312009-08-12 10:12:52 +020017#define GSM_SUBSCRIBER_FIRST_CONTACT 0x00000001
Jacob Erlbeck33b6dad2014-11-12 10:12:11 +010018/* gprs_sgsn.h defines additional flags including and above bit 16 (0x10000) */
Jan Luebbeb0dfc312009-08-12 10:12:52 +020019
Holger Hans Peter Freytherc63f6f12013-07-27 21:07:57 +020020#define GSM_SUBSCRIBER_NO_EXPIRATION 0x0
21
Holger Hans Peter Freyther763b42a2010-12-29 11:07:22 +010022struct vty;
Jacob Erlbeck02ab91e2014-11-12 09:53:45 +010023struct sgsn_mm_ctx;
Jacob Erlbecka1e03732014-12-02 11:28:38 +010024struct sgsn_subscriber_data;
Holger Hans Peter Freyther763b42a2010-12-29 11:07:22 +010025
Holger Hans Peter Freytherd6d7aff2015-04-06 12:03:45 +020026struct subscr_request;
27
Jacob Erlbeck1e30a282014-12-03 09:28:24 +010028struct gsm_subscriber_group {
29 struct gsm_network *net;
30
31 int keep_subscr;
32};
33
Harald Weltec2e302d2009-07-05 14:08:13 +020034struct gsm_equipment {
35 long long unsigned int id;
Harald Welted3fa84d2016-04-20 17:50:17 +020036 char imei[GSM23003_IMEISV_NUM_DIGITS+1];
Harald Weltec2e302d2009-07-05 14:08:13 +020037 char name[GSM_NAME_LENGTH];
38
39 struct gsm48_classmark1 classmark1;
Holger Hans Peter Freytherc42ad8b2011-04-18 17:04:00 +020040 uint8_t classmark2_len;
41 uint8_t classmark2[3];
42 uint8_t classmark3_len;
43 uint8_t classmark3[14];
Harald Weltec2e302d2009-07-05 14:08:13 +020044};
45
Harald Welte52b1f982008-12-23 20:25:15 +000046struct gsm_subscriber {
Jacob Erlbeck1e30a282014-12-03 09:28:24 +010047 struct gsm_subscriber_group *group;
Holger Freyther213b20b2009-06-02 03:24:54 +000048 long long unsigned int id;
Harald Welted3fa84d2016-04-20 17:50:17 +020049 char imsi[GSM23003_IMSI_MAX_DIGITS+1];
Holger Hans Peter Freytherc42ad8b2011-04-18 17:04:00 +020050 uint32_t tmsi;
51 uint16_t lac;
Jan Luebbe5c15c852008-12-27 15:59:25 +000052 char name[GSM_NAME_LENGTH];
Jan Luebbe391d86e2008-12-27 22:33:34 +000053 char extension[GSM_EXTENSION_LENGTH];
Jan Luebbe6e2e5452008-12-27 16:47:55 +000054 int authorized;
Jan Luebbebfbdeec2012-12-27 00:27:16 +010055 time_t expire_lu;
Holger Freyther12aa50d2009-01-01 18:02:05 +000056
Jacob Erlbeck70d8e312014-12-03 11:08:23 +010057 /* Don't delete subscribers even if group->keep_subscr is not set */
58 int keep_in_ram;
59
Jan Luebbeb0dfc312009-08-12 10:12:52 +020060 /* Temporary field which is not stored in the DB/HLR */
Holger Hans Peter Freytherc42ad8b2011-04-18 17:04:00 +020061 uint32_t flags;
Jan Luebbeb0dfc312009-08-12 10:12:52 +020062
Harald Weltec2e302d2009-07-05 14:08:13 +020063 /* Every user can only have one equipment in use at any given
64 * point in time */
65 struct gsm_equipment equipment;
66
Holger Freyther862cfff2009-06-04 14:15:33 +000067 /* for internal management */
Holger Freyther12aa50d2009-01-01 18:02:05 +000068 int use_count;
69 struct llist_head entry;
Harald Weltef7c43522009-06-09 20:24:21 +000070
Holger Freyther04866d42009-03-31 04:35:19 +020071 /* pending requests */
Holger Hans Peter Freytherd6d7aff2015-04-06 12:03:45 +020072 int is_paging;
Holger Freyther04866d42009-03-31 04:35:19 +020073 struct llist_head requests;
Jacob Erlbeck02ab91e2014-11-12 09:53:45 +010074
75 /* GPRS/SGSN related fields */
Jacob Erlbecka1e03732014-12-02 11:28:38 +010076 struct sgsn_subscriber_data *sgsn_data;
Harald Welte52b1f982008-12-23 20:25:15 +000077};
78
Jan Luebbe5c15c852008-12-27 15:59:25 +000079enum gsm_subscriber_field {
80 GSM_SUBSCRIBER_IMSI,
81 GSM_SUBSCRIBER_TMSI,
Holger Freyther9c564b82009-02-09 23:39:20 +000082 GSM_SUBSCRIBER_EXTENSION,
Harald Weltebe3e3782009-07-05 14:06:41 +020083 GSM_SUBSCRIBER_ID,
Jan Luebbe5c15c852008-12-27 15:59:25 +000084};
Harald Welte52b1f982008-12-23 20:25:15 +000085
Holger Freyther4a49e772009-04-12 05:37:29 +000086enum gsm_subscriber_update_reason {
87 GSM_SUBSCRIBER_UPDATE_ATTACHED,
88 GSM_SUBSCRIBER_UPDATE_DETACHED,
Harald Weltec2e302d2009-07-05 14:08:13 +020089 GSM_SUBSCRIBER_UPDATE_EQUIPMENT,
Holger Freyther4a49e772009-04-12 05:37:29 +000090};
91
Holger Freyther12aa50d2009-01-01 18:02:05 +000092struct gsm_subscriber *subscr_get(struct gsm_subscriber *subscr);
93struct gsm_subscriber *subscr_put(struct gsm_subscriber *subscr);
Jacob Erlbeck1e30a282014-12-03 09:28:24 +010094struct gsm_subscriber *subscr_create_subscriber(struct gsm_subscriber_group *sgrp,
Maxe6052c42016-06-30 10:25:49 +020095 const char *imsi);
Jacob Erlbeck1e30a282014-12-03 09:28:24 +010096struct gsm_subscriber *subscr_get_by_tmsi(struct gsm_subscriber_group *sgrp,
Holger Hans Peter Freytherc42ad8b2011-04-18 17:04:00 +020097 uint32_t tmsi);
Jacob Erlbeck1e30a282014-12-03 09:28:24 +010098struct gsm_subscriber *subscr_get_by_imsi(struct gsm_subscriber_group *sgrp,
Harald Welte9176bd42009-07-23 18:46:00 +020099 const char *imsi);
Jacob Erlbeck1e30a282014-12-03 09:28:24 +0100100struct gsm_subscriber *subscr_get_by_extension(struct gsm_subscriber_group *sgrp,
Harald Welte9176bd42009-07-23 18:46:00 +0200101 const char *ext);
Jacob Erlbeck1e30a282014-12-03 09:28:24 +0100102struct gsm_subscriber *subscr_get_by_id(struct gsm_subscriber_group *sgrp,
Harald Welte76042182009-08-08 16:03:15 +0200103 unsigned long long id);
Jacob Erlbeck1e30a282014-12-03 09:28:24 +0100104struct gsm_subscriber *subscr_get_or_create(struct gsm_subscriber_group *sgrp,
Holger Hans Peter Freytherd740b682010-11-15 09:15:01 +0100105 const char *imsi);
Holger Freyther4a49e772009-04-12 05:37:29 +0000106int subscr_update(struct gsm_subscriber *s, struct gsm_bts *bts, int reason);
Jacob Erlbeck1e30a282014-12-03 09:28:24 +0100107struct gsm_subscriber *subscr_active_by_tmsi(struct gsm_subscriber_group *sgrp,
Holger Hans Peter Freyther8dfd2412010-11-15 13:32:33 +0100108 uint32_t tmsi);
Jacob Erlbeck1e30a282014-12-03 09:28:24 +0100109struct gsm_subscriber *subscr_active_by_imsi(struct gsm_subscriber_group *sgrp,
Holger Hans Peter Freyther8dfd2412010-11-15 13:32:33 +0100110 const char *imsi);
Holger Freythera471a412009-01-04 03:47:05 +0000111
Harald Welte2e6d4682009-12-24 14:50:24 +0100112char *subscr_name(struct gsm_subscriber *subscr);
113
Jacob Erlbeck1e30a282014-12-03 09:28:24 +0100114int subscr_purge_inactive(struct gsm_subscriber_group *sgrp);
Holger Hans Peter Freytherabd0cac2010-12-22 18:12:11 +0100115void subscr_update_from_db(struct gsm_subscriber *subscr);
Jacob Erlbeck1e30a282014-12-03 09:28:24 +0100116void subscr_expire(struct gsm_subscriber_group *sgrp);
Holger Hans Peter Freythere7bd8632013-06-30 15:30:47 +0200117int subscr_update_expire_lu(struct gsm_subscriber *subscr, struct gsm_bts *bts);
Holger Hans Peter Freytherf694d5f2010-12-22 14:31:34 +0100118
Holger Hans Peter Freytherd6d7aff2015-04-06 12:03:45 +0200119/*
120 * Paging handling with authentication
121 */
122struct subscr_request *subscr_request_channel(struct gsm_subscriber *subscr,
123 int type, gsm_cbfn *cbfn, void *param);
124void subscr_remove_request(struct subscr_request *req);
125
Holger Freythera471a412009-01-04 03:47:05 +0000126/* internal */
127struct gsm_subscriber *subscr_alloc(void);
Harald Welte (local)15920de2009-08-14 20:27:16 +0200128extern struct llist_head active_subscribers;
Holger Freyther12aa50d2009-01-01 18:02:05 +0000129
Harald Welte52b1f982008-12-23 20:25:15 +0000130#endif /* _GSM_SUBSCR_H */