Harald Welte | 52b1f98 | 2008-12-23 20:25:15 +0000 | [diff] [blame] | 1 | #ifndef _GSM_SUBSCR_H |
| 2 | #define _GSM_SUBSCR_H |
| 3 | |
Neels Hofmeyr | ab04fb2 | 2016-05-30 22:32:51 +0200 | [diff] [blame] | 4 | #include <stdbool.h> |
| 5 | |
Pablo Neira Ayuso | 136f453 | 2011-03-22 16:47:59 +0100 | [diff] [blame] | 6 | #include <osmocom/core/linuxlist.h> |
Harald Welte | d3fa84d | 2016-04-20 17:50:17 +0200 | [diff] [blame] | 7 | #include <osmocom/gsm/protocol/gsm_23_003.h> |
Harald Welte | 52b1f98 | 2008-12-23 20:25:15 +0000 | [diff] [blame] | 8 | |
Neels Hofmeyr | ab04fb2 | 2016-05-30 22:32:51 +0200 | [diff] [blame] | 9 | #include <openbsc/gsm_data.h> |
Max | e6052c4 | 2016-06-30 10:25:49 +0200 | [diff] [blame] | 10 | |
Holger Hans Peter Freyther | fa530cd | 2010-07-25 18:10:02 +0800 | [diff] [blame] | 11 | #define GSM_NAME_LENGTH 160 |
Mike Haben | 2449b37 | 2009-10-26 20:36:34 +0100 | [diff] [blame] | 12 | |
| 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 Luebbe | 5c15c85 | 2008-12-27 15:59:25 +0000 | [diff] [blame] | 16 | |
Jan Luebbe | b0dfc31 | 2009-08-12 10:12:52 +0200 | [diff] [blame] | 17 | #define GSM_SUBSCRIBER_FIRST_CONTACT 0x00000001 |
Jacob Erlbeck | 33b6dad | 2014-11-12 10:12:11 +0100 | [diff] [blame] | 18 | /* gprs_sgsn.h defines additional flags including and above bit 16 (0x10000) */ |
Jan Luebbe | b0dfc31 | 2009-08-12 10:12:52 +0200 | [diff] [blame] | 19 | |
Holger Hans Peter Freyther | c63f6f1 | 2013-07-27 21:07:57 +0200 | [diff] [blame] | 20 | #define GSM_SUBSCRIBER_NO_EXPIRATION 0x0 |
| 21 | |
Holger Hans Peter Freyther | 763b42a | 2010-12-29 11:07:22 +0100 | [diff] [blame] | 22 | struct vty; |
Jacob Erlbeck | 02ab91e | 2014-11-12 09:53:45 +0100 | [diff] [blame] | 23 | struct sgsn_mm_ctx; |
Jacob Erlbeck | a1e0373 | 2014-12-02 11:28:38 +0100 | [diff] [blame] | 24 | struct sgsn_subscriber_data; |
Holger Hans Peter Freyther | 763b42a | 2010-12-29 11:07:22 +0100 | [diff] [blame] | 25 | |
Holger Hans Peter Freyther | d6d7aff | 2015-04-06 12:03:45 +0200 | [diff] [blame] | 26 | struct subscr_request; |
| 27 | |
Jacob Erlbeck | 1e30a28 | 2014-12-03 09:28:24 +0100 | [diff] [blame] | 28 | struct gsm_subscriber_group { |
| 29 | struct gsm_network *net; |
| 30 | |
| 31 | int keep_subscr; |
| 32 | }; |
| 33 | |
Harald Welte | c2e302d | 2009-07-05 14:08:13 +0200 | [diff] [blame] | 34 | struct gsm_equipment { |
| 35 | long long unsigned int id; |
Harald Welte | d3fa84d | 2016-04-20 17:50:17 +0200 | [diff] [blame] | 36 | char imei[GSM23003_IMEISV_NUM_DIGITS+1]; |
Harald Welte | c2e302d | 2009-07-05 14:08:13 +0200 | [diff] [blame] | 37 | char name[GSM_NAME_LENGTH]; |
| 38 | |
| 39 | struct gsm48_classmark1 classmark1; |
Holger Hans Peter Freyther | c42ad8b | 2011-04-18 17:04:00 +0200 | [diff] [blame] | 40 | uint8_t classmark2_len; |
| 41 | uint8_t classmark2[3]; |
| 42 | uint8_t classmark3_len; |
| 43 | uint8_t classmark3[14]; |
Harald Welte | c2e302d | 2009-07-05 14:08:13 +0200 | [diff] [blame] | 44 | }; |
| 45 | |
Harald Welte | 52b1f98 | 2008-12-23 20:25:15 +0000 | [diff] [blame] | 46 | struct gsm_subscriber { |
Jacob Erlbeck | 1e30a28 | 2014-12-03 09:28:24 +0100 | [diff] [blame] | 47 | struct gsm_subscriber_group *group; |
Holger Freyther | 213b20b | 2009-06-02 03:24:54 +0000 | [diff] [blame] | 48 | long long unsigned int id; |
Harald Welte | d3fa84d | 2016-04-20 17:50:17 +0200 | [diff] [blame] | 49 | char imsi[GSM23003_IMSI_MAX_DIGITS+1]; |
Holger Hans Peter Freyther | c42ad8b | 2011-04-18 17:04:00 +0200 | [diff] [blame] | 50 | uint32_t tmsi; |
| 51 | uint16_t lac; |
Jan Luebbe | 5c15c85 | 2008-12-27 15:59:25 +0000 | [diff] [blame] | 52 | char name[GSM_NAME_LENGTH]; |
Jan Luebbe | 391d86e | 2008-12-27 22:33:34 +0000 | [diff] [blame] | 53 | char extension[GSM_EXTENSION_LENGTH]; |
Jan Luebbe | 6e2e545 | 2008-12-27 16:47:55 +0000 | [diff] [blame] | 54 | int authorized; |
Jan Luebbe | bfbdeec | 2012-12-27 00:27:16 +0100 | [diff] [blame] | 55 | time_t expire_lu; |
Holger Freyther | 12aa50d | 2009-01-01 18:02:05 +0000 | [diff] [blame] | 56 | |
Jacob Erlbeck | 70d8e31 | 2014-12-03 11:08:23 +0100 | [diff] [blame] | 57 | /* Don't delete subscribers even if group->keep_subscr is not set */ |
| 58 | int keep_in_ram; |
| 59 | |
Jan Luebbe | b0dfc31 | 2009-08-12 10:12:52 +0200 | [diff] [blame] | 60 | /* Temporary field which is not stored in the DB/HLR */ |
Holger Hans Peter Freyther | c42ad8b | 2011-04-18 17:04:00 +0200 | [diff] [blame] | 61 | uint32_t flags; |
Jan Luebbe | b0dfc31 | 2009-08-12 10:12:52 +0200 | [diff] [blame] | 62 | |
Harald Welte | c2e302d | 2009-07-05 14:08:13 +0200 | [diff] [blame] | 63 | /* Every user can only have one equipment in use at any given |
| 64 | * point in time */ |
| 65 | struct gsm_equipment equipment; |
| 66 | |
Holger Freyther | 862cfff | 2009-06-04 14:15:33 +0000 | [diff] [blame] | 67 | /* for internal management */ |
Holger Freyther | 12aa50d | 2009-01-01 18:02:05 +0000 | [diff] [blame] | 68 | int use_count; |
| 69 | struct llist_head entry; |
Harald Welte | f7c4352 | 2009-06-09 20:24:21 +0000 | [diff] [blame] | 70 | |
Holger Freyther | 04866d4 | 2009-03-31 04:35:19 +0200 | [diff] [blame] | 71 | /* pending requests */ |
Holger Hans Peter Freyther | d6d7aff | 2015-04-06 12:03:45 +0200 | [diff] [blame] | 72 | int is_paging; |
Holger Freyther | 04866d4 | 2009-03-31 04:35:19 +0200 | [diff] [blame] | 73 | struct llist_head requests; |
Jacob Erlbeck | 02ab91e | 2014-11-12 09:53:45 +0100 | [diff] [blame] | 74 | |
| 75 | /* GPRS/SGSN related fields */ |
Jacob Erlbeck | a1e0373 | 2014-12-02 11:28:38 +0100 | [diff] [blame] | 76 | struct sgsn_subscriber_data *sgsn_data; |
Harald Welte | 52b1f98 | 2008-12-23 20:25:15 +0000 | [diff] [blame] | 77 | }; |
| 78 | |
Jan Luebbe | 5c15c85 | 2008-12-27 15:59:25 +0000 | [diff] [blame] | 79 | enum gsm_subscriber_field { |
| 80 | GSM_SUBSCRIBER_IMSI, |
| 81 | GSM_SUBSCRIBER_TMSI, |
Holger Freyther | 9c564b8 | 2009-02-09 23:39:20 +0000 | [diff] [blame] | 82 | GSM_SUBSCRIBER_EXTENSION, |
Harald Welte | be3e378 | 2009-07-05 14:06:41 +0200 | [diff] [blame] | 83 | GSM_SUBSCRIBER_ID, |
Jan Luebbe | 5c15c85 | 2008-12-27 15:59:25 +0000 | [diff] [blame] | 84 | }; |
Harald Welte | 52b1f98 | 2008-12-23 20:25:15 +0000 | [diff] [blame] | 85 | |
Holger Freyther | 4a49e77 | 2009-04-12 05:37:29 +0000 | [diff] [blame] | 86 | enum gsm_subscriber_update_reason { |
| 87 | GSM_SUBSCRIBER_UPDATE_ATTACHED, |
| 88 | GSM_SUBSCRIBER_UPDATE_DETACHED, |
Harald Welte | c2e302d | 2009-07-05 14:08:13 +0200 | [diff] [blame] | 89 | GSM_SUBSCRIBER_UPDATE_EQUIPMENT, |
Holger Freyther | 4a49e77 | 2009-04-12 05:37:29 +0000 | [diff] [blame] | 90 | }; |
| 91 | |
Holger Freyther | 12aa50d | 2009-01-01 18:02:05 +0000 | [diff] [blame] | 92 | struct gsm_subscriber *subscr_get(struct gsm_subscriber *subscr); |
| 93 | struct gsm_subscriber *subscr_put(struct gsm_subscriber *subscr); |
Jacob Erlbeck | 1e30a28 | 2014-12-03 09:28:24 +0100 | [diff] [blame] | 94 | struct gsm_subscriber *subscr_create_subscriber(struct gsm_subscriber_group *sgrp, |
Max | e6052c4 | 2016-06-30 10:25:49 +0200 | [diff] [blame] | 95 | const char *imsi); |
Jacob Erlbeck | 1e30a28 | 2014-12-03 09:28:24 +0100 | [diff] [blame] | 96 | struct gsm_subscriber *subscr_get_by_tmsi(struct gsm_subscriber_group *sgrp, |
Holger Hans Peter Freyther | c42ad8b | 2011-04-18 17:04:00 +0200 | [diff] [blame] | 97 | uint32_t tmsi); |
Jacob Erlbeck | 1e30a28 | 2014-12-03 09:28:24 +0100 | [diff] [blame] | 98 | struct gsm_subscriber *subscr_get_by_imsi(struct gsm_subscriber_group *sgrp, |
Harald Welte | 9176bd4 | 2009-07-23 18:46:00 +0200 | [diff] [blame] | 99 | const char *imsi); |
Jacob Erlbeck | 1e30a28 | 2014-12-03 09:28:24 +0100 | [diff] [blame] | 100 | struct gsm_subscriber *subscr_get_by_extension(struct gsm_subscriber_group *sgrp, |
Harald Welte | 9176bd4 | 2009-07-23 18:46:00 +0200 | [diff] [blame] | 101 | const char *ext); |
Jacob Erlbeck | 1e30a28 | 2014-12-03 09:28:24 +0100 | [diff] [blame] | 102 | struct gsm_subscriber *subscr_get_by_id(struct gsm_subscriber_group *sgrp, |
Harald Welte | 7604218 | 2009-08-08 16:03:15 +0200 | [diff] [blame] | 103 | unsigned long long id); |
Jacob Erlbeck | 1e30a28 | 2014-12-03 09:28:24 +0100 | [diff] [blame] | 104 | struct gsm_subscriber *subscr_get_or_create(struct gsm_subscriber_group *sgrp, |
Holger Hans Peter Freyther | d740b68 | 2010-11-15 09:15:01 +0100 | [diff] [blame] | 105 | const char *imsi); |
Holger Freyther | 4a49e77 | 2009-04-12 05:37:29 +0000 | [diff] [blame] | 106 | int subscr_update(struct gsm_subscriber *s, struct gsm_bts *bts, int reason); |
Jacob Erlbeck | 1e30a28 | 2014-12-03 09:28:24 +0100 | [diff] [blame] | 107 | struct gsm_subscriber *subscr_active_by_tmsi(struct gsm_subscriber_group *sgrp, |
Holger Hans Peter Freyther | 8dfd241 | 2010-11-15 13:32:33 +0100 | [diff] [blame] | 108 | uint32_t tmsi); |
Jacob Erlbeck | 1e30a28 | 2014-12-03 09:28:24 +0100 | [diff] [blame] | 109 | struct gsm_subscriber *subscr_active_by_imsi(struct gsm_subscriber_group *sgrp, |
Holger Hans Peter Freyther | 8dfd241 | 2010-11-15 13:32:33 +0100 | [diff] [blame] | 110 | const char *imsi); |
Holger Freyther | a471a41 | 2009-01-04 03:47:05 +0000 | [diff] [blame] | 111 | |
Harald Welte | 2e6d468 | 2009-12-24 14:50:24 +0100 | [diff] [blame] | 112 | char *subscr_name(struct gsm_subscriber *subscr); |
| 113 | |
Jacob Erlbeck | 1e30a28 | 2014-12-03 09:28:24 +0100 | [diff] [blame] | 114 | int subscr_purge_inactive(struct gsm_subscriber_group *sgrp); |
Holger Hans Peter Freyther | abd0cac | 2010-12-22 18:12:11 +0100 | [diff] [blame] | 115 | void subscr_update_from_db(struct gsm_subscriber *subscr); |
Jacob Erlbeck | 1e30a28 | 2014-12-03 09:28:24 +0100 | [diff] [blame] | 116 | void subscr_expire(struct gsm_subscriber_group *sgrp); |
Holger Hans Peter Freyther | e7bd863 | 2013-06-30 15:30:47 +0200 | [diff] [blame] | 117 | int subscr_update_expire_lu(struct gsm_subscriber *subscr, struct gsm_bts *bts); |
Holger Hans Peter Freyther | f694d5f | 2010-12-22 14:31:34 +0100 | [diff] [blame] | 118 | |
Holger Hans Peter Freyther | d6d7aff | 2015-04-06 12:03:45 +0200 | [diff] [blame] | 119 | /* |
| 120 | * Paging handling with authentication |
| 121 | */ |
| 122 | struct subscr_request *subscr_request_channel(struct gsm_subscriber *subscr, |
| 123 | int type, gsm_cbfn *cbfn, void *param); |
| 124 | void subscr_remove_request(struct subscr_request *req); |
| 125 | |
Holger Freyther | a471a41 | 2009-01-04 03:47:05 +0000 | [diff] [blame] | 126 | /* internal */ |
| 127 | struct gsm_subscriber *subscr_alloc(void); |
Harald Welte (local) | 15920de | 2009-08-14 20:27:16 +0200 | [diff] [blame] | 128 | extern struct llist_head active_subscribers; |
Holger Freyther | 12aa50d | 2009-01-01 18:02:05 +0000 | [diff] [blame] | 129 | |
Harald Welte | 52b1f98 | 2008-12-23 20:25:15 +0000 | [diff] [blame] | 130 | #endif /* _GSM_SUBSCR_H */ |