blob: ec6c2c001bb6512a691db5144eb9f3c27d654bd5 [file] [log] [blame]
Harald Welte59b04682009-06-10 05:40:52 +08001#ifndef _GSM_04_08_H
2#define _GSM_04_08_H
3
Pablo Neira Ayusodd5fff42011-03-22 16:47:59 +01004#include <osmocom/gsm/gsm48.h>
Harald Welte5d977a82011-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 Freyther36897102009-08-01 07:26:59 +02009
Harald Welte59b04682009-06-10 05:40:52 +080010struct msgb;
11struct gsm_bts;
12struct gsm_subscriber;
Harald Welte03740842009-06-10 23:11:52 +080013struct gsm_network;
Harald Welte36fe2e82009-07-23 21:13:03 +020014struct gsm_trans;
Holger Hans Peter Freythered4e3bd2010-06-15 13:16:52 +080015struct gsm_subscriber_connection;
Harald Welte59b04682009-06-10 05:40:52 +080016
Harald Welte532dcca2010-12-23 23:00:21 +010017#define GSM48_ALLOC_SIZE 2048
18#define GSM48_ALLOC_HEADROOM 256
Harald Welted8285192010-05-01 14:22:44 +020019
20static inline struct msgb *gsm48_msgb_alloc(void)
21{
22 return msgb_alloc_headroom(GSM48_ALLOC_SIZE, GSM48_ALLOC_HEADROOM,
23 "GSM 04.08");
24}
25
Harald Welte59b04682009-06-10 05:40:52 +080026/* config options controlling the behaviour of the lower leves */
27void gsm0408_allow_everyone(int allow);
Holger Hans Peter Freythered4e3bd2010-06-15 13:16:52 +080028void gsm0408_clear_request(struct gsm_subscriber_connection *conn, uint32_t cause);
Harald Weltee8d16172010-12-22 23:17:50 +010029void gsm0408_clear_all_trans(struct gsm_network *net, int protocol);
Holger Hans Peter Freytherb9795792010-06-17 16:41:25 +080030int gsm0408_dispatch(struct gsm_subscriber_connection *conn, struct msgb *msg);
Harald Welte59b04682009-06-10 05:40:52 +080031
Holger Hans Peter Freyther7eb8a9a2011-04-18 17:04:00 +020032int gsm0408_rcvmsg(struct msgb *msg, uint8_t link_id);
Holger Hans Peter Freyther425cfc42010-07-05 15:34:16 +080033int gsm0408_new_conn(struct gsm_subscriber_connection *conn);
Holger Hans Peter Freyther7eb8a9a2011-04-18 17:04:00 +020034enum gsm_chan_t get_ctype_by_chreq(struct gsm_network *bts, uint8_t ra);
Harald Welte5d977a82011-07-23 10:53:30 +020035/* don't use "enum gsm_chreq_reason_t" to avoid circular dependency */
36int get_reason_by_chreq(uint8_t ra, int neci);
Holger Hans Peter Freytherf0f37f12010-09-06 09:36:02 +080037void gsm_net_update_ctype(struct gsm_network *net);
Harald Welte59b04682009-06-10 05:40:52 +080038
Holger Hans Peter Freyther3d315272010-06-15 14:16:02 +080039int gsm48_tx_mm_info(struct gsm_subscriber_connection *conn);
Holger Hans Peter Freyther7eb8a9a2011-04-18 17:04:00 +020040int gsm48_tx_mm_auth_req(struct gsm_subscriber_connection *conn, uint8_t *rand, int key_seq);
Holger Hans Peter Freyther5a38f922010-06-16 12:30:50 +080041int gsm48_tx_mm_auth_rej(struct gsm_subscriber_connection *conn);
Harald Welte59b04682009-06-10 05:40:52 +080042int gsm48_send_rr_release(struct gsm_lchan *lchan);
Holger Hans Peter Freytherb94719d2009-10-05 14:00:14 +020043int gsm48_send_rr_ciph_mode(struct gsm_lchan *lchan, int want_imeisv);
Holger Hans Peter Freyther7eb8a9a2011-04-18 17:04:00 +020044int gsm48_send_rr_app_info(struct gsm_subscriber_connection *conn, uint8_t apdu_id,
45 uint8_t apdu_len, const uint8_t *apdu);
46int gsm48_send_rr_ass_cmd(struct gsm_lchan *dest_lchan, struct gsm_lchan *lchan, uint8_t power_class);
Harald Welted0841fa2009-12-17 00:25:18 +010047int gsm48_send_ho_cmd(struct gsm_lchan *old_lchan, struct gsm_lchan *new_lchan,
Holger Hans Peter Freyther7eb8a9a2011-04-18 17:04:00 +020048 uint8_t power_command, uint8_t ho_ref);
Harald Welte59b04682009-06-10 05:40:52 +080049
Harald Weltef4e4b8a2010-12-22 23:57:45 +010050int mncc_tx_to_cc(struct gsm_network *net, int msg_type, void *arg);
Harald Welte03740842009-06-10 23:11:52 +080051
Harald Welte59b04682009-06-10 05:40:52 +080052/* convert a ASCII phone number to call-control BCD */
Holger Hans Peter Freyther7eb8a9a2011-04-18 17:04:00 +020053int encode_bcd_number(uint8_t *bcd_lv, uint8_t max_len,
Harald Welteb8a18b52009-06-10 12:08:54 +080054 int h_len, const char *input);
Holger Hans Peter Freyther7eb8a9a2011-04-18 17:04:00 +020055int decode_bcd_number(char *output, int output_len, const uint8_t *bcd_lv,
Harald Welteb8a18b52009-06-10 12:08:54 +080056 int h_len);
Harald Welte59b04682009-06-10 05:40:52 +080057
Holger Hans Peter Freyther7eb8a9a2011-04-18 17:04:00 +020058int send_siemens_mrpci(struct gsm_lchan *lchan, uint8_t *classmark2_lv);
Holger Hans Peter Freyther088ca3a2010-05-16 01:07:20 +080059int gsm48_extract_mi(uint8_t *classmark2, int length, char *mi_string, uint8_t *mi_type);
Holger Hans Peter Freyther7eb8a9a2011-04-18 17:04:00 +020060int gsm48_paging_extract_mi(struct gsm48_pag_resp *pag, int length, char *mi_string, uint8_t *mi_type);
Holger Hans Peter Freyther0b83e542010-06-21 10:46:44 +080061int gsm48_handle_paging_resp(struct gsm_subscriber_connection *conn, struct msgb *msg, struct gsm_subscriber *subscr);
Holger Hans Peter Freythera269ece2009-08-21 04:57:35 +020062
Holger Hans Peter Freyther7eb8a9a2011-04-18 17:04:00 +020063int gsm48_lchan_modify(struct gsm_lchan *lchan, uint8_t lchan_mode);
Holger Hans Peter Freyther9e6d6ce2009-10-22 15:23:11 +020064int gsm48_rx_rr_modif_ack(struct msgb *msg);
Harald Weltec20bd1d2009-11-29 19:07:28 +010065int gsm48_parse_meas_rep(struct gsm_meas_rep *rep, struct msgb *msg);
66
Holger Hans Peter Freythera44eea52010-06-15 19:39:27 +080067struct msgb *gsm48_create_mm_serv_rej(enum gsm48_reject_value value);
Holger Hans Peter Freyther8073cbd2010-06-15 19:40:05 +080068struct msgb *gsm48_create_loc_upd_rej(uint8_t cause);
Harald Weltea42a93f2010-06-14 22:26:10 +020069void gsm48_lchan2chan_desc(struct gsm48_chan_desc *cd,
70 const struct gsm_lchan *lchan);
Holger Hans Peter Freythercf0f3362009-10-22 15:13:00 +020071
Harald Welte59b04682009-06-10 05:40:52 +080072#endif