libosmogsm  0.9.6-15.20170220git32ee5af8.fc34
Osmocom GSM library
gsup.h
1 /* Osmocom Generic Subscriber Update Protocol message encoder/decoder */
2 
3 /* (C) 2014 by sysmocom s.f.m.c. GmbH, Author: Jacob Erlbeck
4  * (C) 2016 by Harald Welte <laforge@gnumonks.org>
5  * All Rights Reserved
6  *
7  * This program is free software; you can redistribute it and/or modify
8  * it under the terms of the GNU General Public License as published by
9  * the Free Software Foundation; either version 2 of the License, or
10  * (at your option) any later version.
11  *
12  * This program is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with this program. If not, see <http://www.gnu.org/licenses/>.
19  *
20  */
21 #pragma once
22 
23 #include <stdint.h>
24 #include <osmocom/core/msgb.h>
25 #include <osmocom/gsm/protocol/gsm_23_003.h>
26 #include <osmocom/gsm/protocol/gsm_04_08_gprs.h>
27 #include <osmocom/crypt/auth.h>
28 
30 #define OSMO_GSUP_MAX_NUM_PDP_INFO 10 /* GSM 09.02 limits this to 50 */
32 #define OSMO_GSUP_MAX_NUM_AUTH_INFO 5
34 #define OSMO_GSUP_MAX_MSISDN_LEN 9
35 
36 #define OSMO_GSUP_PDP_TYPE_SIZE 2
37 
39 enum osmo_gsup_iei {
40  OSMO_GSUP_IMSI_IE = 0x01,
41  OSMO_GSUP_CAUSE_IE = 0x02,
42  OSMO_GSUP_AUTH_TUPLE_IE = 0x03,
43  OSMO_GSUP_PDP_INFO_COMPL_IE = 0x04,
44  OSMO_GSUP_PDP_INFO_IE = 0x05,
45  OSMO_GSUP_CANCEL_TYPE_IE = 0x06,
46  OSMO_GSUP_FREEZE_PTMSI_IE = 0x07,
47  OSMO_GSUP_MSISDN_IE = 0x08,
48  OSMO_GSUP_HLR_NUMBER_IE = 0x09,
49  OSMO_GSUP_PDP_CONTEXT_ID_IE = 0x10,
50  OSMO_GSUP_PDP_TYPE_IE = 0x11,
51  OSMO_GSUP_ACCESS_POINT_NAME_IE = 0x12,
52  OSMO_GSUP_PDP_QOS_IE = 0x13,
53  OSMO_GSUP_RAND_IE = 0x20,
54  OSMO_GSUP_SRES_IE = 0x21,
55  OSMO_GSUP_KC_IE = 0x22,
56  /* 3G support */
57  OSMO_GSUP_IK_IE = 0x23,
58  OSMO_GSUP_CK_IE = 0x24,
59  OSMO_GSUP_AUTN_IE = 0x25,
60  OSMO_GSUP_AUTS_IE = 0x26,
61  OSMO_GSUP_RES_IE = 0x27,
62  OSMO_GSUP_CN_DOMAIN_IE = 0x28,
63 };
64 
66 enum osmo_gsup_message_type {
67  OSMO_GSUP_MSGT_UPDATE_LOCATION_REQUEST = 0b00000100,
68  OSMO_GSUP_MSGT_UPDATE_LOCATION_ERROR = 0b00000101,
69  OSMO_GSUP_MSGT_UPDATE_LOCATION_RESULT = 0b00000110,
70 
71  OSMO_GSUP_MSGT_SEND_AUTH_INFO_REQUEST = 0b00001000,
72  OSMO_GSUP_MSGT_SEND_AUTH_INFO_ERROR = 0b00001001,
73  OSMO_GSUP_MSGT_SEND_AUTH_INFO_RESULT = 0b00001010,
74 
75  OSMO_GSUP_MSGT_AUTH_FAIL_REPORT = 0b00001011,
76 
77  OSMO_GSUP_MSGT_PURGE_MS_REQUEST = 0b00001100,
78  OSMO_GSUP_MSGT_PURGE_MS_ERROR = 0b00001101,
79  OSMO_GSUP_MSGT_PURGE_MS_RESULT = 0b00001110,
80 
81  OSMO_GSUP_MSGT_INSERT_DATA_REQUEST = 0b00010000,
82  OSMO_GSUP_MSGT_INSERT_DATA_ERROR = 0b00010001,
83  OSMO_GSUP_MSGT_INSERT_DATA_RESULT = 0b00010010,
84 
85  OSMO_GSUP_MSGT_DELETE_DATA_REQUEST = 0b00010100,
86  OSMO_GSUP_MSGT_DELETE_DATA_ERROR = 0b00010101,
87  OSMO_GSUP_MSGT_DELETE_DATA_RESULT = 0b00010110,
88 
89  OSMO_GSUP_MSGT_LOCATION_CANCEL_REQUEST = 0b00011100,
90  OSMO_GSUP_MSGT_LOCATION_CANCEL_ERROR = 0b00011101,
91  OSMO_GSUP_MSGT_LOCATION_CANCEL_RESULT = 0b00011110,
92 };
93 
94 #define OSMO_GSUP_IS_MSGT_REQUEST(msgt) (((msgt) & 0b00000011) == 0b00)
95 #define OSMO_GSUP_IS_MSGT_ERROR(msgt) (((msgt) & 0b00000011) == 0b01)
96 #define OSMO_GSUP_TO_MSGT_ERROR(msgt) (((msgt) & 0b11111100) | 0b01)
97 
98 extern const struct value_string osmo_gsup_message_type_names[];
99 static inline const char *
100 osmo_gsup_message_type_name(enum osmo_gsup_message_type val)
101 { return get_value_string(osmo_gsup_message_type_names, val); }
102 
103 enum osmo_gsup_cancel_type {
104  OSMO_GSUP_CANCEL_TYPE_UPDATE = 1, /* on wire: 0 */
105  OSMO_GSUP_CANCEL_TYPE_WITHDRAW = 2, /* on wire: 1 */
106 };
107 
108 enum osmo_gsup_cn_domain {
109  OSMO_GSUP_CN_DOMAIN_PS = 1,
110  OSMO_GSUP_CN_DOMAIN_CS = 2,
111 };
112 
115  unsigned int context_id;
116  int have_info;
118  uint16_t pdp_type;
121  const uint8_t *apn_enc;
123  size_t apn_enc_len;
126  const uint8_t *qos_enc;
128  size_t qos_enc_len;
129 };
130 
133  enum osmo_gsup_message_type message_type;
134  char imsi[GSM23003_IMSI_MAX_DIGITS+2];
135  enum gsm48_gmm_cause cause;
136  enum osmo_gsup_cancel_type cancel_type;
137  int pdp_info_compl;
138  int freeze_ptmsi;
139  struct osmo_auth_vector auth_vectors[OSMO_GSUP_MAX_NUM_AUTH_INFO];
140  size_t num_auth_vectors;
141  struct osmo_gsup_pdp_info pdp_infos[OSMO_GSUP_MAX_NUM_PDP_INFO];
142  size_t num_pdp_infos;
143  const uint8_t *msisdn_enc;
144  size_t msisdn_enc_len;
145  const uint8_t *hlr_enc;
146  size_t hlr_enc_len;
147  const uint8_t *auts;
148  const uint8_t *rand;
149  enum osmo_gsup_cn_domain cn_domain;
150 };
151 
152 int osmo_gsup_decode(const uint8_t *data, size_t data_len,
153  struct osmo_gsup_message *gsup_msg);
154 void osmo_gsup_encode(struct msgb *msg, const struct osmo_gsup_message *gsup_msg);
uint8_t data[0]
actual payload data
Definition: gsm_08_58.h:2
Definition: gsup.h:132
Definition: gsup.h:114
size_t qos_enc_len
Definition: gsup.h:128
const uint8_t * apn_enc
Definition: gsup.h:121
const uint8_t * qos_enc
Definition: gsup.h:126
uint16_t pdp_type
Definition: gsup.h:118
size_t apn_enc_len
Definition: gsup.h:123