blob: bfc8027dbf1239b1eb4599a9548ca2fa7801d67d [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>
Neels Hofmeyrc4628a32018-12-07 14:47:34 +01007#include <osmocom/msc/transaction.h>
Harald Welteb2268642011-07-23 10:53:30 +02008
Harald Welte8470bf22008-12-25 23:28:35 +00009struct msgb;
10struct gsm_bts;
Harald Welte4bfdfe72009-06-10 23:11:52 +080011struct gsm_network;
Harald Welte39e2ead2009-07-23 21:13:03 +020012struct gsm_trans;
Neels Hofmeyrc036b792018-11-29 22:37:51 +010013struct ran_conn;
Andreas Eversberg73266522014-01-19 11:47:44 +010014struct amr_multirate_conf;
Holger Hans Peter Freyther615ed462015-09-24 11:30:58 +020015struct amr_mode;
Neels Hofmeyrc4628a32018-12-07 14:47:34 +010016struct msc_a;
Harald Welte8470bf22008-12-25 23:28:35 +000017
Harald Welte985263e2010-12-23 23:00:21 +010018#define GSM48_ALLOC_SIZE 2048
19#define GSM48_ALLOC_HEADROOM 256
Harald Welte3c69a4c2010-05-01 14:22:44 +020020
Holger Hans Peter Freyther8239e062016-01-25 22:03:25 +010021static inline struct msgb *gsm48_msgb_alloc_name(const char *name)
Harald Welte3c69a4c2010-05-01 14:22:44 +020022{
23 return msgb_alloc_headroom(GSM48_ALLOC_SIZE, GSM48_ALLOC_HEADROOM,
Holger Hans Peter Freyther8239e062016-01-25 22:03:25 +010024 name);
Harald Welte3c69a4c2010-05-01 14:22:44 +020025}
26
Neels Hofmeyrc4628a32018-12-07 14:47:34 +010027void cm_service_request_concludes(struct msc_a *msc_a, struct msgb *msg, enum osmo_cm_service_type type);
Harald Welte2483f1b2016-06-19 18:06:02 +020028
Holger Freythere97f7fb2008-12-31 18:52:11 +000029/* config options controlling the behaviour of the lower leves */
Neels Hofmeyrc4628a32018-12-07 14:47:34 +010030void gsm0408_clear_all_trans(struct gsm_network *net, enum trans_type type);
Holger Freythere97f7fb2008-12-31 18:52:11 +000031
Holger Hans Peter Freytherc42ad8b2011-04-18 17:04:00 +020032int gsm0408_rcvmsg(struct msgb *msg, uint8_t link_id);
Harald Welteb2268642011-07-23 10:53:30 +020033/* don't use "enum gsm_chreq_reason_t" to avoid circular dependency */
Holger Hans Peter Freyther78891072010-09-06 09:36:02 +080034void gsm_net_update_ctype(struct gsm_network *net);
Harald Welte8470bf22008-12-25 23:28:35 +000035
Neels Hofmeyrc4628a32018-12-07 14:47:34 +010036int gsm48_tx_simple(struct msc_a *msc_a, uint8_t pdisc, uint8_t msg_type);
37int gsm48_tx_mm_info(struct msc_a *msc_a);
38int gsm48_tx_mm_auth_req(struct msc_a *msc_a, uint8_t *rand, uint8_t *autn, int key_seq);
39int gsm48_tx_mm_auth_rej(struct msc_a *msc_a);
40int gsm48_tx_mm_serv_ack(struct msc_a *msc_a);
41int gsm48_tx_mm_serv_rej(struct msc_a *msc_a, enum gsm48_reject_value value);
Holger Freythere64a7a32009-02-06 21:55:37 +000042int gsm48_send_rr_release(struct gsm_lchan *lchan);
Holger Hans Peter Freytherca6bc1d2009-10-05 14:00:14 +020043int gsm48_send_rr_ciph_mode(struct gsm_lchan *lchan, int want_imeisv);
Neels Hofmeyrc4628a32018-12-07 14:47:34 +010044int gsm48_send_rr_app_info(struct msc_a *msc_a, uint8_t apdu_id, uint8_t apdu_len, const uint8_t *apdu);
Holger Hans Peter Freytherc42ad8b2011-04-18 17:04:00 +020045int gsm48_send_rr_ass_cmd(struct gsm_lchan *dest_lchan, struct gsm_lchan *lchan, uint8_t power_class);
Neels Hofmeyrc4628a32018-12-07 14:47:34 +010046int gsm48_send_ho_cmd(struct gsm_lchan *old_lchan, struct gsm_lchan *new_lchan, uint8_t power_command, uint8_t ho_ref);
Harald Welte8470bf22008-12-25 23:28:35 +000047
Neels Hofmeyr52558742019-05-09 01:23:09 +020048int mncc_tx_to_cc(struct gsm_network *net, void *arg);
Harald Welte4bfdfe72009-06-10 23:11:52 +080049
Harald Welte0932d1e2009-02-16 22:53:52 +000050/* convert a ASCII phone number to call-control BCD */
Holger Hans Peter Freytherc42ad8b2011-04-18 17:04:00 +020051int encode_bcd_number(uint8_t *bcd_lv, uint8_t max_len,
Harald Welte0c389302009-06-10 12:08:54 +080052 int h_len, const char *input);
Holger Hans Peter Freytherc42ad8b2011-04-18 17:04:00 +020053int decode_bcd_number(char *output, int output_len, const uint8_t *bcd_lv,
Harald Welte0c389302009-06-10 12:08:54 +080054 int h_len);
Harald Welte0932d1e2009-02-16 22:53:52 +000055
Holger Hans Peter Freytherc42ad8b2011-04-18 17:04:00 +020056int send_siemens_mrpci(struct gsm_lchan *lchan, uint8_t *classmark2_lv);
Holger Hans Peter Freytheradc14782009-08-21 04:57:35 +020057
Holger Hans Peter Freytherc42ad8b2011-04-18 17:04:00 +020058int gsm48_lchan_modify(struct gsm_lchan *lchan, uint8_t lchan_mode);
Holger Hans Peter Freytherf520e642009-10-22 15:23:11 +020059int gsm48_rx_rr_modif_ack(struct msgb *msg);
Harald Welte3c7dc6e2009-11-29 19:07:28 +010060
Holger Hans Peter Freyther2c0f1662010-06-15 19:39:27 +080061struct msgb *gsm48_create_mm_serv_rej(enum gsm48_reject_value value);
Holger Hans Peter Freyther230a4d82010-06-15 19:40:05 +080062struct msgb *gsm48_create_loc_upd_rej(uint8_t cause);
Harald Weltea39b0f22010-06-14 22:26:10 +020063void gsm48_lchan2chan_desc(struct gsm48_chan_desc *cd,
64 const struct gsm_lchan *lchan);
Holger Hans Peter Freytherff3f2602009-10-22 15:13:00 +020065
Neels Hofmeyrc036b792018-11-29 22:37:51 +010066void release_security_operation(struct ran_conn *conn);
67void allocate_security_operation(struct ran_conn *conn);
Harald Weltecf149ee2012-01-23 16:40:24 +010068
Harald Welte0de69a22017-05-27 13:18:50 +020069int gsm48_multirate_config(uint8_t *lv, const struct amr_multirate_conf *mr, const struct amr_mode *modes);
Andreas Eversberg73266522014-01-19 11:47:44 +010070
Philipp Maierfbf66102017-04-09 12:32:51 +020071int gsm48_tch_rtp_create(struct gsm_trans *trans);
Neels Hofmeyrc036b792018-11-29 22:37:51 +010072int gsm48_conn_sendmsg(struct msgb *msg, struct ran_conn *conn, struct gsm_trans *trans);
Harald Welte0df904d2018-12-03 11:00:04 +010073struct msgb *gsm48_create_mm_info(struct gsm_network *net);
Philipp Maierfbf66102017-04-09 12:32:51 +020074
Neels Hofmeyrc4628a32018-12-07 14:47:34 +010075int gsm0408_rcv_cc(struct msc_a *msc_a, struct msgb *msg);
76int gsm0408_rcv_mm(struct msc_a *msc_a, struct msgb *msg);
77int gsm0408_rcv_rr(struct msc_a *msc_a, struct msgb *msg);
78
79int msc_vlr_tx_cm_serv_acc(void *msc_conn_ref, enum osmo_cm_service_type cm_service_type);
80
81int compl_l3_msg_is_r99(const struct msgb *msg);
82
Harald Welte52b1f982008-12-23 20:25:15 +000083#endif