blob: cb632f632bcf0258af56183d16ece36a1d9af056 [file] [log] [blame]
Harald Welte52b1f982008-12-23 20:25:15 +00001#ifndef _GSM_04_08_H
2#define _GSM_04_08_H
3
Pablo Neira Ayuso136f4532011-03-22 16:47:59 +01004#include <osmocom/gsm/gsm48.h>
Harald Welteb2268642011-07-23 10:53:30 +02005#include <osmocom/gsm/gsm_utils.h>
6#include <osmocom/gsm/protocol/gsm_04_08.h>
7
8#include <openbsc/meas_rep.h>
Holger Hans Peter Freyther1494a762009-08-01 07:26:59 +02009
Harald Welte8470bf22008-12-25 23:28:35 +000010struct msgb;
11struct gsm_bts;
Harald Welte0932d1e2009-02-16 22:53:52 +000012struct gsm_subscriber;
Harald Welte4bfdfe72009-06-10 23:11:52 +080013struct gsm_network;
Harald Welte39e2ead2009-07-23 21:13:03 +020014struct gsm_trans;
Holger Hans Peter Freytherf6fb3ef2010-06-15 13:16:52 +080015struct gsm_subscriber_connection;
Andreas Eversberg73266522014-01-19 11:47:44 +010016struct amr_multirate_conf;
Holger Hans Peter Freyther615ed462015-09-24 11:30:58 +020017struct amr_mode;
Harald Welte8470bf22008-12-25 23:28:35 +000018
Harald Welte985263e2010-12-23 23:00:21 +010019#define GSM48_ALLOC_SIZE 2048
20#define GSM48_ALLOC_HEADROOM 256
Harald Welte3c69a4c2010-05-01 14:22:44 +020021
Holger Hans Peter Freyther8239e062016-01-25 22:03:25 +010022static inline struct msgb *gsm48_msgb_alloc_name(const char *name)
Harald Welte3c69a4c2010-05-01 14:22:44 +020023{
24 return msgb_alloc_headroom(GSM48_ALLOC_SIZE, GSM48_ALLOC_HEADROOM,
Holger Hans Peter Freyther8239e062016-01-25 22:03:25 +010025 name);
Harald Welte3c69a4c2010-05-01 14:22:44 +020026}
27
Andreas Eversberg4d4944a2013-03-10 11:49:35 +010028static inline int get_radio_link_timeout(struct gsm48_cell_options *cell_options)
29{
30 return (cell_options->radio_link_timeout + 1) << 2;
31}
32
33static inline void set_radio_link_timeout(struct gsm48_cell_options *cell_options, int value)
34{
35 if (value < 4)
36 value = 4;
37 if (value > 64)
38 value = 64;
39 cell_options->radio_link_timeout = (value >> 2) - 1;
40}
41
Holger Freythere97f7fb2008-12-31 18:52:11 +000042/* config options controlling the behaviour of the lower leves */
Holger Freyther89824fc2008-12-30 16:18:18 +000043void gsm0408_allow_everyone(int allow);
Holger Hans Peter Freytherf6fb3ef2010-06-15 13:16:52 +080044void gsm0408_clear_request(struct gsm_subscriber_connection *conn, uint32_t cause);
Harald Welte371efe52010-12-22 23:17:50 +010045void gsm0408_clear_all_trans(struct gsm_network *net, int protocol);
Holger Hans Peter Freyther97643312010-06-17 16:41:25 +080046int gsm0408_dispatch(struct gsm_subscriber_connection *conn, struct msgb *msg);
Holger Freythere97f7fb2008-12-31 18:52:11 +000047
Holger Hans Peter Freytherc42ad8b2011-04-18 17:04:00 +020048int gsm0408_rcvmsg(struct msgb *msg, uint8_t link_id);
Holger Hans Peter Freyther02d39b22010-07-05 15:34:16 +080049int gsm0408_new_conn(struct gsm_subscriber_connection *conn);
Holger Hans Peter Freytherc42ad8b2011-04-18 17:04:00 +020050enum gsm_chan_t get_ctype_by_chreq(struct gsm_network *bts, uint8_t ra);
Harald Welteb2268642011-07-23 10:53:30 +020051/* don't use "enum gsm_chreq_reason_t" to avoid circular dependency */
52int get_reason_by_chreq(uint8_t ra, int neci);
Holger Hans Peter Freyther78891072010-09-06 09:36:02 +080053void gsm_net_update_ctype(struct gsm_network *net);
Harald Welte8470bf22008-12-25 23:28:35 +000054
Holger Hans Peter Freyther91401742010-06-15 14:16:02 +080055int gsm48_tx_mm_info(struct gsm_subscriber_connection *conn);
Neels Hofmeyrd6755152017-01-27 00:25:47 +010056int gsm48_tx_mm_auth_req(struct gsm_subscriber_connection *conn, uint8_t *rand,
57 uint8_t *autn, int key_seq);
Holger Hans Peter Freythere9ed3402010-06-16 12:30:50 +080058int gsm48_tx_mm_auth_rej(struct gsm_subscriber_connection *conn);
Jacob Erlbeck24d3b912013-10-31 15:36:41 +010059int gsm48_tx_mm_serv_ack(struct gsm_subscriber_connection *conn);
60int gsm48_tx_mm_serv_rej(struct gsm_subscriber_connection *conn,
61 enum gsm48_reject_value value);
Holger Freythere64a7a32009-02-06 21:55:37 +000062int gsm48_send_rr_release(struct gsm_lchan *lchan);
Holger Hans Peter Freytherca6bc1d2009-10-05 14:00:14 +020063int gsm48_send_rr_ciph_mode(struct gsm_lchan *lchan, int want_imeisv);
Holger Hans Peter Freytherc42ad8b2011-04-18 17:04:00 +020064int gsm48_send_rr_app_info(struct gsm_subscriber_connection *conn, uint8_t apdu_id,
65 uint8_t apdu_len, const uint8_t *apdu);
66int gsm48_send_rr_ass_cmd(struct gsm_lchan *dest_lchan, struct gsm_lchan *lchan, uint8_t power_class);
Harald Welte7a7a0d52009-12-17 00:25:18 +010067int gsm48_send_ho_cmd(struct gsm_lchan *old_lchan, struct gsm_lchan *new_lchan,
Holger Hans Peter Freytherc42ad8b2011-04-18 17:04:00 +020068 uint8_t power_command, uint8_t ho_ref);
Harald Welte8470bf22008-12-25 23:28:35 +000069
Harald Welte76556372010-12-22 23:57:45 +010070int mncc_tx_to_cc(struct gsm_network *net, int msg_type, void *arg);
Harald Welte4bfdfe72009-06-10 23:11:52 +080071
Harald Welte0932d1e2009-02-16 22:53:52 +000072/* convert a ASCII phone number to call-control BCD */
Holger Hans Peter Freytherc42ad8b2011-04-18 17:04:00 +020073int encode_bcd_number(uint8_t *bcd_lv, uint8_t max_len,
Harald Welte0c389302009-06-10 12:08:54 +080074 int h_len, const char *input);
Holger Hans Peter Freytherc42ad8b2011-04-18 17:04:00 +020075int decode_bcd_number(char *output, int output_len, const uint8_t *bcd_lv,
Harald Welte0c389302009-06-10 12:08:54 +080076 int h_len);
Harald Welte0932d1e2009-02-16 22:53:52 +000077
Holger Hans Peter Freytherc42ad8b2011-04-18 17:04:00 +020078int send_siemens_mrpci(struct gsm_lchan *lchan, uint8_t *classmark2_lv);
Holger Hans Peter Freytherb7b9c1d2010-05-16 01:07:20 +080079int gsm48_extract_mi(uint8_t *classmark2, int length, char *mi_string, uint8_t *mi_type);
Holger Hans Peter Freytherc42ad8b2011-04-18 17:04:00 +020080int gsm48_paging_extract_mi(struct gsm48_pag_resp *pag, int length, char *mi_string, uint8_t *mi_type);
Holger Hans Peter Freytherdb4ef0d2010-06-21 10:46:44 +080081int gsm48_handle_paging_resp(struct gsm_subscriber_connection *conn, struct msgb *msg, struct gsm_subscriber *subscr);
Holger Hans Peter Freytheradc14782009-08-21 04:57:35 +020082
Holger Hans Peter Freytherc42ad8b2011-04-18 17:04:00 +020083int gsm48_lchan_modify(struct gsm_lchan *lchan, uint8_t lchan_mode);
Holger Hans Peter Freytherf520e642009-10-22 15:23:11 +020084int gsm48_rx_rr_modif_ack(struct msgb *msg);
Harald Welte3c7dc6e2009-11-29 19:07:28 +010085int gsm48_parse_meas_rep(struct gsm_meas_rep *rep, struct msgb *msg);
86
Holger Hans Peter Freyther2c0f1662010-06-15 19:39:27 +080087struct msgb *gsm48_create_mm_serv_rej(enum gsm48_reject_value value);
Holger Hans Peter Freyther230a4d82010-06-15 19:40:05 +080088struct msgb *gsm48_create_loc_upd_rej(uint8_t cause);
Harald Weltea39b0f22010-06-14 22:26:10 +020089void gsm48_lchan2chan_desc(struct gsm48_chan_desc *cd,
90 const struct gsm_lchan *lchan);
Holger Hans Peter Freytherff3f2602009-10-22 15:13:00 +020091
Harald Weltecf149ee2012-01-23 16:40:24 +010092void release_security_operation(struct gsm_subscriber_connection *conn);
93void allocate_security_operation(struct gsm_subscriber_connection *conn);
94
Holger Hans Peter Freyther615ed462015-09-24 11:30:58 +020095int gsm48_multirate_config(uint8_t *lv, struct amr_multirate_conf *mr, struct amr_mode *modes);
Andreas Eversberg73266522014-01-19 11:47:44 +010096
Harald Welte52b1f982008-12-23 20:25:15 +000097#endif