blob: fc8298dcf6c89f3d72546609d76cd425197b47ab [file] [log] [blame]
Harald Welteba43de42015-08-29 20:33:16 +02001#pragma once
2
3#include <osmocom/core/select.h>
4#include <osmocom/core/linuxlist.h>
Harald Welte3f712562015-09-07 21:53:25 +02005#include <osmocom/core/write_queue.h>
Harald Welte90256ba2015-12-23 20:16:36 +01006#include <osmocom/core/timer.h>
7#include <osmocom/sigtran/sccp_sap.h>
Neels Hofmeyr0f88c112017-07-03 16:49:43 +02008#include <osmocom/sigtran/osmo_ss7.h>
Maxbfeea672017-12-27 22:53:36 +01009#include <osmocom/ctrl/control_if.h>
Harald Welteb3dae302015-08-30 12:20:09 +020010#define DEBUG
11#include <osmocom/core/logging.h>
12
Harald Welte90256ba2015-12-23 20:16:36 +010013
Harald Welteb3dae302015-08-30 12:20:09 +020014enum {
15 DMAIN,
Daniel Willmannbded9842015-12-17 11:51:17 +010016 DHNBAP,
Harald Weltef42317b2015-12-23 15:36:31 +010017 DRUA,
18 DRANAP,
Harald Welteb3dae302015-08-30 12:20:09 +020019};
20
Harald Weltec6d93452020-12-30 13:36:20 +010021#define LOGHNB(x, ss, lvl, fmt, args ...) \
22 LOGP(ss, lvl, "%s " fmt, hnb_context_name(x), ## args)
23
Maxbfeea672017-12-27 22:53:36 +010024enum hnb_ctrl_node {
25 CTRL_NODE_HNB = _LAST_CTRL_NODE,
26 _LAST_CTRL_NODE_HNB
27};
Harald Welteb3dae302015-08-30 12:20:09 +020028
Neels Hofmeyrc7ccdd42016-10-13 14:43:49 +020029#define HNBGW_LOCAL_IP_DEFAULT "0.0.0.0"
Neels Hofmeyr0f88c112017-07-03 16:49:43 +020030/* TODO: CS and PS now both connect to OsmoSTP, i.e. that's always going to be the same address. Drop the
31 * duplicity. */
Neels Hofmeyr5ee050c2016-10-13 15:12:18 +020032#define HNBGW_IUCS_REMOTE_IP_DEFAULT "127.0.0.1"
Neels Hofmeyr0f88c112017-07-03 16:49:43 +020033#define HNBGW_IUPS_REMOTE_IP_DEFAULT "127.0.0.1"
Neels Hofmeyrc7ccdd42016-10-13 14:43:49 +020034
Harald Weltea2e6a7a2015-08-29 21:47:39 +020035/* 25.467 Section 7.1 */
36#define IUH_DEFAULT_SCTP_PORT 29169
37#define RNA_DEFAULT_SCTP_PORT 25471
38
39#define IUH_PPI_RUA 19
40#define IUH_PPI_HNBAP 20
41#define IUH_PPI_SABP 31
42#define IUH_PPI_RNA 42
43#define IUH_PPI_PUA 55
44
Harald Welteb3dae302015-08-30 12:20:09 +020045#define IUH_MSGB_SIZE 2048
Harald Weltea2e6a7a2015-08-29 21:47:39 +020046
47struct umts_cell_id {
48 uint16_t mcc; /*!< Mobile Country Code */
49 uint16_t mnc; /*!< Mobile Network Code */
50 uint16_t lac; /*!< Locaton Area Code */
51 uint16_t rac; /*!< Routing Area Code */
52 uint16_t sac; /*!< Service Area Code */
53 uint32_t cid; /*!< Cell ID */
54};
55
56struct hnb_gw;
57
Harald Welte90256ba2015-12-23 20:16:36 +010058enum hnbgw_cnlink_state {
59 /* we have just been initialized or were disconnected */
60 CNLINK_S_NULL,
61 /* establishment of the SUA/SCCP link is pending */
62 CNLINK_S_EST_PEND,
63 /* establishment of the SUA/SCCP link was confirmed */
64 CNLINK_S_EST_CONF,
65 /* we have esnt the RANAP RESET and wait for the ACK */
66 CNLINK_S_EST_RST_TX_WAIT_ACK,
67 /* we have received the RANAP RESET ACK and are active */
68 CNLINK_S_EST_ACTIVE,
69};
70
71struct hnbgw_cnlink {
72 struct llist_head list;
73 enum hnbgw_cnlink_state state;
74 struct hnb_gw *gw;
Harald Welte90256ba2015-12-23 20:16:36 +010075 /* timer for re-transmitting the RANAP Reset */
76 struct osmo_timer_list T_RafC;
77 /* reference to the SCCP User SAP by which we communicate */
Neels Hofmeyr0f88c112017-07-03 16:49:43 +020078 struct osmo_sccp_instance *sccp;
79 struct osmo_sccp_user *sccp_user;
Harald Welte90256ba2015-12-23 20:16:36 +010080 uint32_t next_conn_id;
81
82 /* linked list of hnbgw_context_map */
83 struct llist_head map_list;
84};
85
Harald Welteba43de42015-08-29 20:33:16 +020086struct hnb_context {
87 /*! Entry in HNB-global list of HNB */
88 struct llist_head list;
Harald Weltea2e6a7a2015-08-29 21:47:39 +020089 /*! HNB-GW we are part of */
90 struct hnb_gw *gw;
Harald Welte3f712562015-09-07 21:53:25 +020091 /*! SCTP socket + write queue for Iuh to this specific HNB */
Daniel Willmann6480cad2016-01-06 18:06:26 +010092 struct osmo_stream_srv *conn;
Harald Weltea2e6a7a2015-08-29 21:47:39 +020093 /*! copied from HNB-Identity-Info IE */
94 char identity_info[256];
95 /*! copied from Cell Identity IE */
96 struct umts_cell_id id;
Harald Welte3f712562015-09-07 21:53:25 +020097
98 /*! SCTP stream ID for HNBAP */
99 uint16_t hnbap_stream;
100 /*! SCTP stream ID for RUA */
101 uint16_t rua_stream;
Harald Welte90256ba2015-12-23 20:16:36 +0100102
Stefan Sperlingc964a2c2018-02-19 17:02:12 +0100103 /*! True if a HNB-REGISTER-REQ from this HNB has been accepted. Note that
104 * this entire data structure is freed if the HNB sends HNB-DE-REGISTER-REQ. */
105 bool hnb_registered;
106
Harald Welte90256ba2015-12-23 20:16:36 +0100107 /* linked list of hnbgw_context_map */
108 struct llist_head map_list;
Harald Welteba43de42015-08-29 20:33:16 +0200109};
110
111struct ue_context {
Harald Weltea2e6a7a2015-08-29 21:47:39 +0200112 /*! Entry in the HNB-global list of UE */
Harald Welteba43de42015-08-29 20:33:16 +0200113 struct llist_head list;
Harald Weltea2e6a7a2015-08-29 21:47:39 +0200114 /*! Unique Context ID for this UE */
Harald Welteba43de42015-08-29 20:33:16 +0200115 uint32_t context_id;
Harald Welteb534e5c2015-09-11 00:15:16 +0200116 char imsi[16+1];
Neels Hofmeyrf33e8352016-09-22 18:06:59 +0200117 uint32_t tmsi;
Harald Weltea2e6a7a2015-08-29 21:47:39 +0200118 /*! UE is serviced via this HNB */
119 struct hnb_context *hnb;
Harald Welteba43de42015-08-29 20:33:16 +0200120};
121
122struct hnb_gw {
123 struct {
Neels Hofmeyrc7ccdd42016-10-13 14:43:49 +0200124 const char *iuh_local_ip;
Harald Welteba43de42015-08-29 20:33:16 +0200125 /*! SCTP port for Iuh listening */
Neels Hofmeyrc7ccdd42016-10-13 14:43:49 +0200126 uint16_t iuh_local_port;
Harald Weltea2e6a7a2015-08-29 21:47:39 +0200127 /*! The UDP port where we receive multiplexed CS user
128 * plane traffic from HNBs */
129 uint16_t iuh_cs_mux_port;
Neels Hofmeyrecbdc5c2017-07-31 13:13:24 +0200130 const char *iucs_remote_addr_name;
131 const char *iups_remote_addr_name;
Harald Weltea2e6a7a2015-08-29 21:47:39 +0200132 uint16_t rnc_id;
Neels Hofmeyr12181a92016-04-25 15:05:32 +0200133 bool hnbap_allow_tmsi;
Harald Weltec6d93452020-12-30 13:36:20 +0100134 /*! print hnb-id (true) or MCC-MNC-LAC-RAC-SAC (false) in logs */
135 bool log_prefix_hnb_id;
Harald Welteba43de42015-08-29 20:33:16 +0200136 } config;
137 /*! SCTP listen socket for incoming connections */
Daniel Willmann6480cad2016-01-06 18:06:26 +0100138 struct osmo_stream_srv_link *iuh;
Harald Weltec4338de2015-12-24 00:40:52 +0100139 /* list of struct hnb_context */
Harald Welteba43de42015-08-29 20:33:16 +0200140 struct llist_head hnb_list;
Harald Weltec4338de2015-12-24 00:40:52 +0100141 /* list of struct ue_context */
Harald Welteb534e5c2015-09-11 00:15:16 +0200142 struct llist_head ue_list;
Harald Weltec4338de2015-12-24 00:40:52 +0100143 /* next availble UE Context ID */
Harald Welteb534e5c2015-09-11 00:15:16 +0200144 uint32_t next_ue_ctx_id;
Maxef727412017-12-26 19:27:43 +0100145 struct ctrl_handle *ctrl;
Harald Weltec4338de2015-12-24 00:40:52 +0100146 /* currently active CN links for CS and PS */
Neels Hofmeyr0f88c112017-07-03 16:49:43 +0200147 struct {
Neels Hofmeyrecbdc5c2017-07-31 13:13:24 +0200148 struct osmo_sccp_instance *client;
Neels Hofmeyr0f88c112017-07-03 16:49:43 +0200149 struct hnbgw_cnlink *cnlink;
150 struct osmo_sccp_addr local_addr;
Neels Hofmeyrecbdc5c2017-07-31 13:13:24 +0200151 struct osmo_sccp_addr iucs_remote_addr;
152 struct osmo_sccp_addr iups_remote_addr;
Neels Hofmeyr0f88c112017-07-03 16:49:43 +0200153 } sccp;
Harald Welteba43de42015-08-29 20:33:16 +0200154};
Harald Weltea2e6a7a2015-08-29 21:47:39 +0200155
Neels Hofmeyr4d8eb4c2016-08-18 01:03:44 +0200156extern void *talloc_asn1_ctx;
157
Maxbfeea672017-12-27 22:53:36 +0100158struct hnb_context *hnb_context_by_id(struct hnb_gw *gw, uint32_t cid);
Stefan Sperling319c2852018-10-29 18:19:14 +0100159struct hnb_context *hnb_context_by_identity_info(struct hnb_gw *gw, const char *identity_info);
Harald Weltec6d93452020-12-30 13:36:20 +0100160const char *hnb_context_name(struct hnb_context *ctx);
Maxbfeea672017-12-27 22:53:36 +0100161unsigned hnb_contexts(const struct hnb_gw *gw);
162
Harald Weltec4338de2015-12-24 00:40:52 +0100163struct ue_context *ue_context_by_id(struct hnb_gw *gw, uint32_t id);
164struct ue_context *ue_context_by_imsi(struct hnb_gw *gw, const char *imsi);
Neels Hofmeyrf33e8352016-09-22 18:06:59 +0200165struct ue_context *ue_context_by_tmsi(struct hnb_gw *gw, uint32_t tmsi);
166struct ue_context *ue_context_alloc(struct hnb_context *hnb, const char *imsi,
167 uint32_t tmsi);
Harald Welteb534e5c2015-09-11 00:15:16 +0200168void ue_context_free(struct ue_context *ue);
Harald Welte90256ba2015-12-23 20:16:36 +0100169
Daniel Willmann6480cad2016-01-06 18:06:26 +0100170struct hnb_context *hnb_context_alloc(struct hnb_gw *gw, struct osmo_stream_srv_link *link, int new_fd);
Alexander Couzensad4ea3b2018-07-24 19:04:47 +0200171void hnb_context_release(struct hnb_context *ctx);
Neels Hofmeyr4d8eb4c2016-08-18 01:03:44 +0200172
173void hnbgw_vty_init(struct hnb_gw *gw, void *tall_ctx);
Neels Hofmeyrc510fc22016-10-13 16:58:04 +0200174int hnbgw_vty_go_parent(struct vty *vty);