diff options
author | Jacob Erlbeck <jerlbeck@sysmocom.de> | 2014-12-11 16:54:14 +0100 |
---|---|---|
committer | Holger Hans Peter Freyther <holger@moiji-mobile.com> | 2015-01-10 21:26:18 +0100 |
commit | f3a271fa73ea58a628a51aa310e1da20a5526f31 (patch) | |
tree | 94c8b849e641080324a2c878ca93ee8695fbae3d /openbsc/include/openbsc | |
parent | 46684dcfd2d0aadcf63f9493d0d84afe467c7193 (diff) |
gprs: Add encoder/decoder for the Subscriber Update Protocol
This patch adds functions to encode and decode GSUP messages. This
does not include the layer 1 framing (IPA). The messages so far
supported are: send_auth_info_*, update_location_*,
location_cancellation_*.
Sponsored-by: On-Waves ehf
Diffstat (limited to 'openbsc/include/openbsc')
-rw-r--r-- | openbsc/include/openbsc/Makefile.am | 2 | ||||
-rw-r--r-- | openbsc/include/openbsc/gprs_gsup_messages.h | 103 |
2 files changed, 104 insertions, 1 deletions
diff --git a/openbsc/include/openbsc/Makefile.am b/openbsc/include/openbsc/Makefile.am index 70365f2b3..92978e7ce 100644 --- a/openbsc/include/openbsc/Makefile.am +++ b/openbsc/include/openbsc/Makefile.am @@ -15,7 +15,7 @@ noinst_HEADERS = abis_nm.h abis_rsl.h db.h gsm_04_08.h gsm_data.h \ bss.h gsm_data_shared.h ipaccess.h mncc_int.h \ arfcn_range_encode.h nat_rewrite_trie.h bsc_nat_callstats.h \ osmux.h mgcp_transcode.h rtp.h gprs_utils.h \ - gprs_gb_parse.h smpp.h meas_feed.h + gprs_gb_parse.h smpp.h meas_feed.h gprs_gsup_messages.h openbsc_HEADERS = gsm_04_08.h meas_rep.h bsc_api.h openbscdir = $(includedir)/openbsc diff --git a/openbsc/include/openbsc/gprs_gsup_messages.h b/openbsc/include/openbsc/gprs_gsup_messages.h new file mode 100644 index 000000000..f1a9978a3 --- /dev/null +++ b/openbsc/include/openbsc/gprs_gsup_messages.h @@ -0,0 +1,103 @@ +/* GPRS Subscriber Update Protocol message encoder/decoder */ + +/* (C) 2014 by Sysmocom s.f.m.c. GmbH + * All Rights Reserved + * + * Author: Jacob Erlbeck + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + */ +#pragma once + +#include <stdint.h> +#include <openbsc/gsm_04_08_gprs.h> +#include <openbsc/gsm_data.h> +/* Needed for GSM_IMSI_LENGTH: */ +#include <openbsc/gsm_subscriber.h> + +#define GPRS_GSUP_MAX_NUM_PDP_INFO 10 /* GSM 09.02 limits this to 50 */ +#define GPRS_GSUP_MAX_NUM_AUTH_INFO 5 + +#define GPRS_GSUP_PDP_TYPE_SIZE 2 + +enum gprs_gsup_iei { + GPRS_GSUP_IMSI_IE = 0x01, + GPRS_GSUP_CAUSE_IE = 0x02, + GPRS_GSUP_AUTH_TUPLE_IE = 0x03, + GPRS_GSUP_PDP_INFO_COMPL_IE = 0x04, + GPRS_GSUP_PDP_INFO_IE = 0x05, + GPRS_GSUP_CANCEL_TYPE_IE = 0x06, + GPRS_GSUP_PDP_CONTEXT_ID_IE = 0x10, + GPRS_GSUP_PDP_TYPE_IE = 0x11, + GPRS_GSUP_ACCESS_POINT_NAME_IE = 0x12, + GPRS_GSUP_RAND_IE = 0x20, + GPRS_GSUP_SRES_IE = 0x21, + GPRS_GSUP_KC_IE = 0x22 +}; + +enum gprs_gsup_message_type { + GPRS_GSUP_MSGT_UPDATE_LOCATION_REQUEST = 0b00000100, + GPRS_GSUP_MSGT_UPDATE_LOCATION_ERROR = 0b00000101, + GPRS_GSUP_MSGT_UPDATE_LOCATION_RESULT = 0b00000110, + + GPRS_GSUP_MSGT_SEND_AUTH_INFO_REQUEST = 0b00001000, + GPRS_GSUP_MSGT_SEND_AUTH_INFO_ERROR = 0b00001001, + GPRS_GSUP_MSGT_SEND_AUTH_INFO_RESULT = 0b00001010, + + GPRS_GSUP_MSGT_PURGE_MS_REQUEST = 0b00001100, + GPRS_GSUP_MSGT_PURGE_MS_ERROR = 0b00001101, + GPRS_GSUP_MSGT_PURGE_MS_RESULT = 0b00001110, + + GPRS_GSUP_MSGT_INSERT_DATA_REQUEST = 0b00010000, + GPRS_GSUP_MSGT_INSERT_DATA_ERROR = 0b00010001, + GPRS_GSUP_MSGT_INSERT_DATA_RESULT = 0b00010010, + + GPRS_GSUP_MSGT_DELETE_DATA_REQUEST = 0b00010100, + GPRS_GSUP_MSGT_DELETE_DATA_ERROR = 0b00010101, + GPRS_GSUP_MSGT_DELETE_DATA_RESULT = 0b00010110, + + GPRS_GSUP_MSGT_LOCATION_CANCEL_REQUEST = 0b00011100, + GPRS_GSUP_MSGT_LOCATION_CANCEL_ERROR = 0b00011101, + GPRS_GSUP_MSGT_LOCATION_CANCEL_RESULT = 0b00011110, +}; + +enum gprs_gsup_cancel_type { + GPRS_GSUP_CANCEL_TYPE_UPDATE = 1, /* on wire: 0 */ + GPRS_GSUP_CANCEL_TYPE_WITHDRAW = 2, /* on wire: 1 */ +}; + +struct gprs_gsup_pdp_info { + unsigned int context_id; + int have_info; + uint16_t pdp_type; + const uint8_t *apn_enc; + size_t apn_enc_len; +}; + +struct gprs_gsup_message { + enum gprs_gsup_message_type message_type; + char imsi[GSM_IMSI_LENGTH]; + enum gsm48_gmm_cause cause; + enum gprs_gsup_cancel_type cancel_type; + int pdp_info_compl; + struct gsm_auth_tuple auth_tuples[GPRS_GSUP_MAX_NUM_AUTH_INFO]; + size_t num_auth_tuples; + struct gprs_gsup_pdp_info pdp_infos[GPRS_GSUP_MAX_NUM_PDP_INFO]; + size_t num_pdp_infos; +}; + +int gprs_gsup_decode(const uint8_t *data, size_t data_len, + struct gprs_gsup_message *gsup_msg); +void gprs_gsup_encode(struct msgb *msg, const struct gprs_gsup_message *gsup_msg); |