blob: f3fb0e07a30864abaf91c8287b81d08ceee2201e [file] [log] [blame]
Neels Hofmeyr79921222018-11-30 01:46:51 +01001#pragma once
2
Vadim Yanitskiyffc7f392020-01-18 18:39:41 +07003#include <osmocom/core/tdef.h>
4
Neels Hofmeyrc4628a32018-12-07 14:47:34 +01005#include <osmocom/gsm/protocol/gsm_04_08.h>
6#include <osmocom/gsm/gsm0808.h>
7
Neels Hofmeyr79921222018-11-30 01:46:51 +01008struct msgb;
9struct gsm_network;
10struct vlr_subscr;
11
Vadim Yanitskiyffc7f392020-01-18 18:39:41 +070012extern struct osmo_tdef_group msc_tdef_group[];
Vadim Yanitskiybaf71a72020-01-25 10:49:14 +070013extern struct osmo_tdef msc_tdefs_vlr[];
Vadim Yanitskiyffc7f392020-01-18 18:39:41 +070014
Neels Hofmeyr79921222018-11-30 01:46:51 +010015#define MSC_HLR_REMOTE_IP_DEFAULT "127.0.0.1"
16#define MSC_HLR_REMOTE_PORT_DEFAULT OSMO_GSUP_PORT
17
Neels Hofmeyrc4628a32018-12-07 14:47:34 +010018/* TS 48.008 DLCI containing DCCH/ACCH + SAPI */
19#define OMSC_LINKID_CB(__msgb) (__msgb)->cb[3]
20
Neels Hofmeyr79921222018-11-30 01:46:51 +010021enum nsap_addr_enc {
22 NSAP_ADDR_ENC_X213,
23 NSAP_ADDR_ENC_V4RAW,
24};
25
Neels Hofmeyrc4628a32018-12-07 14:47:34 +010026#define MAX_A5_KEY_LEN (128/8)
27
28struct geran_encr {
29 /*! alg_id is in encoded format:
30 * alg_id == 1 means A5/0 i.e. no encryption, alg_id == 4 means A5/3.
31 * alg_id == 0 means no such IE was present. */
32 uint8_t alg_id;
33 uint8_t key_len;
34 uint8_t key[MAX_A5_KEY_LEN];
Neels Hofmeyr6ce2edc2021-06-09 22:26:11 +020035 bool kc128_present;
36 uint8_t kc128[MAX_A5_KEY_LEN];
Neels Hofmeyrc4628a32018-12-07 14:47:34 +010037};
38
39enum complete_layer3_type {
40 COMPLETE_LAYER3_NONE,
41 COMPLETE_LAYER3_LU,
42 COMPLETE_LAYER3_CM_SERVICE_REQ,
43 COMPLETE_LAYER3_PAGING_RESP,
Neels Hofmeyrae98b972021-07-27 03:46:49 +020044 COMPLETE_LAYER3_CM_RE_ESTABLISH_REQ,
Neels Hofmeyrc4628a32018-12-07 14:47:34 +010045};
46
47extern const struct value_string complete_layer3_type_names[];
48static inline const char *complete_layer3_type_name(enum complete_layer3_type val)
49{
50 return get_value_string(complete_layer3_type_names, val);
51}
52
53struct cell_ids_entry {
54 struct llist_head entry;
55 struct gsm0808_cell_id_list2 cell_ids;
56};
57
Neels Hofmeyr79921222018-11-30 01:46:51 +010058typedef int (*mncc_recv_cb_t)(struct gsm_network *, struct msgb *);
59
60struct gsm_network *gsm_network_init(void *ctx, mncc_recv_cb_t mncc_recv);
Neels Hofmeyr80447eb2018-12-05 01:11:28 +010061void gsm_network_set_mncc_sock_path(struct gsm_network *net, const char *mncc_sock_path);
Neels Hofmeyr79921222018-11-30 01:46:51 +010062
Neels Hofmeyrc4628a32018-12-07 14:47:34 +010063extern const struct vlr_ops msc_vlr_ops;
Neels Hofmeyr79921222018-11-30 01:46:51 +010064int msc_vlr_alloc(struct gsm_network *net);
65int msc_vlr_start(struct gsm_network *net);
Neels Hofmeyrc4628a32018-12-07 14:47:34 +010066int msc_gsup_client_start(struct gsm_network *net);
Neels Hofmeyr79921222018-11-30 01:46:51 +010067
Neels Hofmeyrc4628a32018-12-07 14:47:34 +010068uint32_t msc_cc_next_outgoing_callref();