blob: 4880d48c8ac6b2e41ddec3b9a02512a9c72087f6 [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>
Harald Welteba43de42015-08-29 20:33:16 +02008
Harald Welteb3dae302015-08-30 12:20:09 +02009#define DEBUG
10#include <osmocom/core/logging.h>
11
Harald Welte90256ba2015-12-23 20:16:36 +010012
Harald Welteb3dae302015-08-30 12:20:09 +020013enum {
14 DMAIN,
Daniel Willmannbded9842015-12-17 11:51:17 +010015 DHNBAP,
Harald Welte75a4e652015-12-22 23:59:24 +010016 DSUA,
Harald Weltef42317b2015-12-23 15:36:31 +010017 DRUA,
18 DRANAP,
Harald Welteb3dae302015-08-30 12:20:09 +020019};
20
21
Neels Hofmeyrc7ccdd42016-10-13 14:43:49 +020022#define HNBGW_LOCAL_IP_DEFAULT "0.0.0.0"
Neels Hofmeyr5ee050c2016-10-13 15:12:18 +020023#define HNBGW_IUCS_REMOTE_IP_DEFAULT "127.0.0.1"
24#define HNBGW_IUPS_REMOTE_IP_DEFAULT "127.0.0.2"
Neels Hofmeyrc7ccdd42016-10-13 14:43:49 +020025
Harald Weltea2e6a7a2015-08-29 21:47:39 +020026/* 25.467 Section 7.1 */
27#define IUH_DEFAULT_SCTP_PORT 29169
28#define RNA_DEFAULT_SCTP_PORT 25471
29
30#define IUH_PPI_RUA 19
31#define IUH_PPI_HNBAP 20
32#define IUH_PPI_SABP 31
33#define IUH_PPI_RNA 42
34#define IUH_PPI_PUA 55
35
Harald Welteb3dae302015-08-30 12:20:09 +020036#define IUH_MSGB_SIZE 2048
Harald Weltea2e6a7a2015-08-29 21:47:39 +020037
38struct umts_cell_id {
39 uint16_t mcc; /*!< Mobile Country Code */
40 uint16_t mnc; /*!< Mobile Network Code */
41 uint16_t lac; /*!< Locaton Area Code */
42 uint16_t rac; /*!< Routing Area Code */
43 uint16_t sac; /*!< Service Area Code */
44 uint32_t cid; /*!< Cell ID */
45};
46
47struct hnb_gw;
48
Harald Welte90256ba2015-12-23 20:16:36 +010049enum hnbgw_cnlink_state {
50 /* we have just been initialized or were disconnected */
51 CNLINK_S_NULL,
52 /* establishment of the SUA/SCCP link is pending */
53 CNLINK_S_EST_PEND,
54 /* establishment of the SUA/SCCP link was confirmed */
55 CNLINK_S_EST_CONF,
56 /* we have esnt the RANAP RESET and wait for the ACK */
57 CNLINK_S_EST_RST_TX_WAIT_ACK,
58 /* we have received the RANAP RESET ACK and are active */
59 CNLINK_S_EST_ACTIVE,
60};
61
62struct hnbgw_cnlink {
63 struct llist_head list;
64 enum hnbgw_cnlink_state state;
65 struct hnb_gw *gw;
66 /* are we a PS connection (1) or CS (0) */
67 int is_ps;
68 /* timer for re-transmitting the RANAP Reset */
69 struct osmo_timer_list T_RafC;
70 /* reference to the SCCP User SAP by which we communicate */
Neels Hofmeyr0a437222016-07-06 15:58:48 +020071 struct osmo_sccp_user *sua_user;
72 struct osmo_sccp_link *sua_link;
Harald Welte90256ba2015-12-23 20:16:36 +010073 struct osmo_sccp_addr local_addr;
74 struct osmo_sccp_addr remote_addr;
75 uint32_t next_conn_id;
76
77 /* linked list of hnbgw_context_map */
78 struct llist_head map_list;
79};
80
Harald Welteba43de42015-08-29 20:33:16 +020081struct hnb_context {
82 /*! Entry in HNB-global list of HNB */
83 struct llist_head list;
Harald Weltea2e6a7a2015-08-29 21:47:39 +020084 /*! HNB-GW we are part of */
85 struct hnb_gw *gw;
Harald Welte3f712562015-09-07 21:53:25 +020086 /*! SCTP socket + write queue for Iuh to this specific HNB */
Daniel Willmann6480cad2016-01-06 18:06:26 +010087 struct osmo_stream_srv *conn;
Harald Weltea2e6a7a2015-08-29 21:47:39 +020088 /*! copied from HNB-Identity-Info IE */
89 char identity_info[256];
90 /*! copied from Cell Identity IE */
91 struct umts_cell_id id;
Harald Welte3f712562015-09-07 21:53:25 +020092
93 /*! SCTP stream ID for HNBAP */
94 uint16_t hnbap_stream;
95 /*! SCTP stream ID for RUA */
96 uint16_t rua_stream;
Harald Welte90256ba2015-12-23 20:16:36 +010097
98 /* linked list of hnbgw_context_map */
99 struct llist_head map_list;
Harald Welteba43de42015-08-29 20:33:16 +0200100};
101
102struct ue_context {
Harald Weltea2e6a7a2015-08-29 21:47:39 +0200103 /*! Entry in the HNB-global list of UE */
Harald Welteba43de42015-08-29 20:33:16 +0200104 struct llist_head list;
Harald Weltea2e6a7a2015-08-29 21:47:39 +0200105 /*! Unique Context ID for this UE */
Harald Welteba43de42015-08-29 20:33:16 +0200106 uint32_t context_id;
Harald Welteb534e5c2015-09-11 00:15:16 +0200107 char imsi[16+1];
Neels Hofmeyrf33e8352016-09-22 18:06:59 +0200108 uint32_t tmsi;
Harald Weltea2e6a7a2015-08-29 21:47:39 +0200109 /*! UE is serviced via this HNB */
110 struct hnb_context *hnb;
Harald Welteba43de42015-08-29 20:33:16 +0200111};
112
113struct hnb_gw {
114 struct {
Neels Hofmeyrc7ccdd42016-10-13 14:43:49 +0200115 const char *iuh_local_ip;
Harald Welteba43de42015-08-29 20:33:16 +0200116 /*! SCTP port for Iuh listening */
Neels Hofmeyrc7ccdd42016-10-13 14:43:49 +0200117 uint16_t iuh_local_port;
Harald Weltea2e6a7a2015-08-29 21:47:39 +0200118 /*! The UDP port where we receive multiplexed CS user
119 * plane traffic from HNBs */
120 uint16_t iuh_cs_mux_port;
Neels Hofmeyr5ee050c2016-10-13 15:12:18 +0200121 const char *iucs_remote_ip;
122 uint16_t iucs_remote_port;
123 const char *iups_remote_ip;
124 uint16_t iups_remote_port;
Harald Weltea2e6a7a2015-08-29 21:47:39 +0200125 uint16_t rnc_id;
Neels Hofmeyr12181a92016-04-25 15:05:32 +0200126 bool hnbap_allow_tmsi;
Harald Welteba43de42015-08-29 20:33:16 +0200127 } config;
128 /*! SCTP listen socket for incoming connections */
Daniel Willmann6480cad2016-01-06 18:06:26 +0100129 struct osmo_stream_srv_link *iuh;
Harald Weltec4338de2015-12-24 00:40:52 +0100130 /* list of struct hnb_context */
Harald Welteba43de42015-08-29 20:33:16 +0200131 struct llist_head hnb_list;
Harald Weltec4338de2015-12-24 00:40:52 +0100132 /* list of struct ue_context */
Harald Welteb534e5c2015-09-11 00:15:16 +0200133 struct llist_head ue_list;
Harald Weltec4338de2015-12-24 00:40:52 +0100134 /* list of struct hnbgw_cnlink */
Harald Welte90256ba2015-12-23 20:16:36 +0100135 struct llist_head cn_list;
Harald Weltec4338de2015-12-24 00:40:52 +0100136 /* next availble UE Context ID */
Harald Welteb534e5c2015-09-11 00:15:16 +0200137 uint32_t next_ue_ctx_id;
Harald Weltec4338de2015-12-24 00:40:52 +0100138
139 /* currently active CN links for CS and PS */
140 struct hnbgw_cnlink *cnlink_cs;
141 struct hnbgw_cnlink *cnlink_ps;
Harald Welteba43de42015-08-29 20:33:16 +0200142};
Harald Weltea2e6a7a2015-08-29 21:47:39 +0200143
Neels Hofmeyr4d8eb4c2016-08-18 01:03:44 +0200144extern void *talloc_asn1_ctx;
145
Harald Weltec4338de2015-12-24 00:40:52 +0100146struct ue_context *ue_context_by_id(struct hnb_gw *gw, uint32_t id);
147struct ue_context *ue_context_by_imsi(struct hnb_gw *gw, const char *imsi);
Neels Hofmeyrf33e8352016-09-22 18:06:59 +0200148struct ue_context *ue_context_by_tmsi(struct hnb_gw *gw, uint32_t tmsi);
149struct ue_context *ue_context_alloc(struct hnb_context *hnb, const char *imsi,
150 uint32_t tmsi);
Harald Welteb534e5c2015-09-11 00:15:16 +0200151void ue_context_free(struct ue_context *ue);
Harald Welte90256ba2015-12-23 20:16:36 +0100152
Daniel Willmann6480cad2016-01-06 18:06:26 +0100153struct hnb_context *hnb_context_alloc(struct hnb_gw *gw, struct osmo_stream_srv_link *link, int new_fd);
Harald Welte90256ba2015-12-23 20:16:36 +0100154void hnb_context_release(struct hnb_context *ctx);
Neels Hofmeyr4d8eb4c2016-08-18 01:03:44 +0200155
156void hnbgw_vty_init(struct hnb_gw *gw, void *tall_ctx);
Neels Hofmeyrc510fc22016-10-13 16:58:04 +0200157int hnbgw_vty_go_parent(struct vty *vty);