Neels Hofmeyr | bfa8878 | 2016-05-20 21:38:32 +0200 | [diff] [blame] | 1 | #pragma once |
| 2 | |
| 3 | #include <stdbool.h> |
Neels Hofmeyr | 2188a77 | 2016-05-20 21:59:55 +0200 | [diff] [blame] | 4 | #include <stdint.h> |
| 5 | |
| 6 | #include <osmocom/core/linuxlist.h> |
| 7 | #include <osmocom/gsm/gsm48.h> |
Philipp Maier | efe85d3 | 2017-04-09 12:32:51 +0200 | [diff] [blame^] | 8 | #include <osmocom/sigtran/sccp_sap.h> |
Neels Hofmeyr | 2188a77 | 2016-05-20 21:59:55 +0200 | [diff] [blame] | 9 | |
| 10 | #include <openbsc/common.h> |
Neels Hofmeyr | bfa8878 | 2016-05-20 21:38:32 +0200 | [diff] [blame] | 11 | |
| 12 | struct sgsn_pdp_ctx; |
| 13 | struct msgb; |
Neels Hofmeyr | 2188a77 | 2016-05-20 21:59:55 +0200 | [diff] [blame] | 14 | struct gsm_auth_tuple; |
Philipp Maier | efe85d3 | 2017-04-09 12:32:51 +0200 | [diff] [blame^] | 15 | struct osmo_sccp_addr; |
| 16 | struct osmo_ss7_instance; |
Neels Hofmeyr | bfa8878 | 2016-05-20 21:38:32 +0200 | [diff] [blame] | 17 | |
| 18 | struct RANAP_RAB_SetupOrModifiedItemIEs_s; |
| 19 | struct RANAP_GlobalRNC_ID; |
Neels Hofmeyr | 2188a77 | 2016-05-20 21:59:55 +0200 | [diff] [blame] | 20 | struct RANAP_Cause; |
| 21 | |
| 22 | /* Debugging switches from asn1c and osmo-iuh */ |
| 23 | extern int asn_debug; |
| 24 | extern int asn1_xer_print; |
Neels Hofmeyr | bfa8878 | 2016-05-20 21:38:32 +0200 | [diff] [blame] | 25 | |
| 26 | struct ue_conn_ctx { |
| 27 | struct llist_head list; |
Philipp Maier | efe85d3 | 2017-04-09 12:32:51 +0200 | [diff] [blame^] | 28 | /* TODO: It's not needed to store the full SCCP address for each |
| 29 | * UE. Rather than that, a pointer to the RNC should be far |
| 30 | * sufficient */ |
| 31 | struct osmo_sccp_addr sccp_addr; |
Neels Hofmeyr | bfa8878 | 2016-05-20 21:38:32 +0200 | [diff] [blame] | 32 | uint32_t conn_id; |
| 33 | int integrity_active; |
| 34 | struct gprs_ra_id ra_id; |
Neels Hofmeyr | 2188a77 | 2016-05-20 21:59:55 +0200 | [diff] [blame] | 35 | enum nsap_addr_enc rab_assign_addr_enc; |
Neels Hofmeyr | bfa8878 | 2016-05-20 21:38:32 +0200 | [diff] [blame] | 36 | }; |
| 37 | |
| 38 | enum iu_event_type { |
| 39 | IU_EVENT_RAB_ASSIGN, |
| 40 | IU_EVENT_SECURITY_MODE_COMPLETE, |
| 41 | IU_EVENT_IU_RELEASE, /* An actual Iu Release message was received */ |
| 42 | IU_EVENT_LINK_INVALIDATED, /* A SUA link was lost or closed down */ |
Neels Hofmeyr | bfa8878 | 2016-05-20 21:38:32 +0200 | [diff] [blame] | 43 | }; |
| 44 | |
| 45 | extern const struct value_string iu_event_type_names[]; |
| 46 | static inline const char *iu_event_type_str(enum iu_event_type e) |
| 47 | { |
| 48 | return get_value_string(iu_event_type_names, e); |
| 49 | } |
| 50 | |
| 51 | /* Implementations of iu_recv_cb_t shall find the ue_conn_ctx in msg->dst. */ |
| 52 | typedef int (* iu_recv_cb_t )(struct msgb *msg, struct gprs_ra_id *ra_id, |
Neels Hofmeyr | bfa8878 | 2016-05-20 21:38:32 +0200 | [diff] [blame] | 53 | uint16_t *sai); |
| 54 | |
| 55 | typedef int (* iu_event_cb_t )(struct ue_conn_ctx *ue_ctx, |
| 56 | enum iu_event_type type, void *data); |
| 57 | |
| 58 | typedef int (* iu_rab_ass_resp_cb_t )(struct ue_conn_ctx *ue_ctx, uint8_t rab_id, |
| 59 | struct RANAP_RAB_SetupOrModifiedItemIEs_s *setup_ies); |
| 60 | |
Philipp Maier | efe85d3 | 2017-04-09 12:32:51 +0200 | [diff] [blame^] | 61 | int iu_init(void *ctx, struct osmo_sccp_instance *sccp, |
Neels Hofmeyr | bfa8878 | 2016-05-20 21:38:32 +0200 | [diff] [blame] | 62 | iu_recv_cb_t iu_recv_cb, iu_event_cb_t iu_event_cb); |
| 63 | |
Neels Hofmeyr | bfa8878 | 2016-05-20 21:38:32 +0200 | [diff] [blame] | 64 | int iu_tx(struct msgb *msg, uint8_t sapi); |
| 65 | |
| 66 | int iu_page_cs(const char *imsi, const uint32_t *tmsi, uint16_t lac); |
| 67 | int iu_page_ps(const char *imsi, const uint32_t *ptmsi, uint16_t lac, uint8_t rac); |
| 68 | |
| 69 | int iu_rab_act(struct ue_conn_ctx *ue_ctx, struct msgb *msg); |
| 70 | int iu_rab_deact(struct ue_conn_ctx *ue_ctx, uint8_t rab_id); |
| 71 | int iu_tx_sec_mode_cmd(struct ue_conn_ctx *uectx, struct gsm_auth_tuple *tp, |
| 72 | int send_ck, int new_key); |
Neels Hofmeyr | 2188a77 | 2016-05-20 21:59:55 +0200 | [diff] [blame] | 73 | int iu_tx_common_id(struct ue_conn_ctx *ue_ctx, const char *imsi); |
| 74 | int iu_tx_release(struct ue_conn_ctx *ctx, const struct RANAP_Cause *cause); |
Neels Hofmeyr | 9bc42ec | 2016-08-29 13:02:12 +0200 | [diff] [blame] | 75 | |
Neels Hofmeyr | 2188a77 | 2016-05-20 21:59:55 +0200 | [diff] [blame] | 76 | void iu_vty_init(int iu_parent_node, enum nsap_addr_enc *rab_assign_addr_enc); |
| 77 | int iu_vty_config_write(struct vty *vty, const char *indent); |