blob: 050941521b22c6e0702b2bdd6d4e799f38fd7416 [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
Harald Weltea2e6a7a2015-08-29 21:47:39 +020022/* 25.467 Section 7.1 */
23#define IUH_DEFAULT_SCTP_PORT 29169
24#define RNA_DEFAULT_SCTP_PORT 25471
25
26#define IUH_PPI_RUA 19
27#define IUH_PPI_HNBAP 20
28#define IUH_PPI_SABP 31
29#define IUH_PPI_RNA 42
30#define IUH_PPI_PUA 55
31
Harald Welteb3dae302015-08-30 12:20:09 +020032#define IUH_MSGB_SIZE 2048
Harald Weltea2e6a7a2015-08-29 21:47:39 +020033
34struct umts_cell_id {
35 uint16_t mcc; /*!< Mobile Country Code */
36 uint16_t mnc; /*!< Mobile Network Code */
37 uint16_t lac; /*!< Locaton Area Code */
38 uint16_t rac; /*!< Routing Area Code */
39 uint16_t sac; /*!< Service Area Code */
40 uint32_t cid; /*!< Cell ID */
41};
42
43struct hnb_gw;
44
Harald Welte90256ba2015-12-23 20:16:36 +010045enum hnbgw_cnlink_state {
46 /* we have just been initialized or were disconnected */
47 CNLINK_S_NULL,
48 /* establishment of the SUA/SCCP link is pending */
49 CNLINK_S_EST_PEND,
50 /* establishment of the SUA/SCCP link was confirmed */
51 CNLINK_S_EST_CONF,
52 /* we have esnt the RANAP RESET and wait for the ACK */
53 CNLINK_S_EST_RST_TX_WAIT_ACK,
54 /* we have received the RANAP RESET ACK and are active */
55 CNLINK_S_EST_ACTIVE,
56};
57
58struct hnbgw_cnlink {
59 struct llist_head list;
60 enum hnbgw_cnlink_state state;
61 struct hnb_gw *gw;
62 /* are we a PS connection (1) or CS (0) */
63 int is_ps;
64 /* timer for re-transmitting the RANAP Reset */
65 struct osmo_timer_list T_RafC;
66 /* reference to the SCCP User SAP by which we communicate */
67 struct osmo_sua_link *sua_link;
68 struct osmo_sccp_addr local_addr;
69 struct osmo_sccp_addr remote_addr;
70 uint32_t next_conn_id;
71
72 /* linked list of hnbgw_context_map */
73 struct llist_head map_list;
74};
75
Harald Welteba43de42015-08-29 20:33:16 +020076struct hnb_context {
77 /*! Entry in HNB-global list of HNB */
78 struct llist_head list;
Harald Weltea2e6a7a2015-08-29 21:47:39 +020079 /*! HNB-GW we are part of */
80 struct hnb_gw *gw;
Harald Welte3f712562015-09-07 21:53:25 +020081 /*! SCTP socket + write queue for Iuh to this specific HNB */
82 struct osmo_wqueue wqueue;
Harald Weltea2e6a7a2015-08-29 21:47:39 +020083 /*! copied from HNB-Identity-Info IE */
84 char identity_info[256];
85 /*! copied from Cell Identity IE */
86 struct umts_cell_id id;
Harald Welte3f712562015-09-07 21:53:25 +020087
88 /*! SCTP stream ID for HNBAP */
89 uint16_t hnbap_stream;
90 /*! SCTP stream ID for RUA */
91 uint16_t rua_stream;
Harald Welte90256ba2015-12-23 20:16:36 +010092
93 /* linked list of hnbgw_context_map */
94 struct llist_head map_list;
Harald Welteba43de42015-08-29 20:33:16 +020095};
96
97struct ue_context {
Harald Weltea2e6a7a2015-08-29 21:47:39 +020098 /*! Entry in the HNB-global list of UE */
Harald Welteba43de42015-08-29 20:33:16 +020099 struct llist_head list;
Harald Weltea2e6a7a2015-08-29 21:47:39 +0200100 /*! Unique Context ID for this UE */
Harald Welteba43de42015-08-29 20:33:16 +0200101 uint32_t context_id;
Harald Welteb534e5c2015-09-11 00:15:16 +0200102 char imsi[16+1];
Harald Weltea2e6a7a2015-08-29 21:47:39 +0200103 /*! UE is serviced via this HNB */
104 struct hnb_context *hnb;
Harald Welteba43de42015-08-29 20:33:16 +0200105};
106
107struct hnb_gw {
108 struct {
109 /*! SCTP port for Iuh listening */
110 uint16_t iuh_listen_port;
Harald Weltea2e6a7a2015-08-29 21:47:39 +0200111 /*! The UDP port where we receive multiplexed CS user
112 * plane traffic from HNBs */
113 uint16_t iuh_cs_mux_port;
114 uint16_t rnc_id;
Harald Welteba43de42015-08-29 20:33:16 +0200115 } config;
116 /*! SCTP listen socket for incoming connections */
117 struct osmo_fd listen_fd;
118 struct llist_head hnb_list;
Harald Welteb534e5c2015-09-11 00:15:16 +0200119 struct llist_head ue_list;
Harald Welte90256ba2015-12-23 20:16:36 +0100120 struct llist_head cn_list;
Harald Welteb534e5c2015-09-11 00:15:16 +0200121 uint32_t next_ue_ctx_id;
Harald Welteba43de42015-08-29 20:33:16 +0200122};
Harald Weltea2e6a7a2015-08-29 21:47:39 +0200123
124extern struct hnb_gw g_hnb_gw;
Harald Welteb534e5c2015-09-11 00:15:16 +0200125
126struct ue_context *ue_context_by_id(uint32_t id);
127struct ue_context *ue_context_by_imsi(const char *imsi);
128struct ue_context *ue_context_alloc(struct hnb_context *hnb, const char *imsi);
129void ue_context_free(struct ue_context *ue);
Harald Welte90256ba2015-12-23 20:16:36 +0100130
131struct hnb_context *hnb_context_alloc(struct hnb_gw *gw, int new_fd);
132void hnb_context_release(struct hnb_context *ctx);