blob: e88baa7674f9c5d5ae00587bca6e6e5e01c108b4 [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 Welteba43de42015-08-29 20:33:16 +02006
Harald Welteb3dae302015-08-30 12:20:09 +02007#define DEBUG
8#include <osmocom/core/logging.h>
9
Harald Welte3f712562015-09-07 21:53:25 +020010#define msgb_ppid(msg) (msg)->cb[0]
11
Harald Welteb3dae302015-08-30 12:20:09 +020012enum {
13 DMAIN,
14};
15
16
Harald Weltea2e6a7a2015-08-29 21:47:39 +020017/* 25.467 Section 7.1 */
18#define IUH_DEFAULT_SCTP_PORT 29169
19#define RNA_DEFAULT_SCTP_PORT 25471
20
21#define IUH_PPI_RUA 19
22#define IUH_PPI_HNBAP 20
23#define IUH_PPI_SABP 31
24#define IUH_PPI_RNA 42
25#define IUH_PPI_PUA 55
26
Harald Welteb3dae302015-08-30 12:20:09 +020027#define IUH_MSGB_SIZE 2048
Harald Weltea2e6a7a2015-08-29 21:47:39 +020028
29struct umts_cell_id {
30 uint16_t mcc; /*!< Mobile Country Code */
31 uint16_t mnc; /*!< Mobile Network Code */
32 uint16_t lac; /*!< Locaton Area Code */
33 uint16_t rac; /*!< Routing Area Code */
34 uint16_t sac; /*!< Service Area Code */
35 uint32_t cid; /*!< Cell ID */
36};
37
38struct hnb_gw;
39
Harald Welteba43de42015-08-29 20:33:16 +020040struct hnb_context {
41 /*! Entry in HNB-global list of HNB */
42 struct llist_head list;
Harald Weltea2e6a7a2015-08-29 21:47:39 +020043 /*! HNB-GW we are part of */
44 struct hnb_gw *gw;
Harald Welte3f712562015-09-07 21:53:25 +020045 /*! SCTP socket + write queue for Iuh to this specific HNB */
46 struct osmo_wqueue wqueue;
Harald Weltea2e6a7a2015-08-29 21:47:39 +020047 /*! copied from HNB-Identity-Info IE */
48 char identity_info[256];
49 /*! copied from Cell Identity IE */
50 struct umts_cell_id id;
Harald Welte3f712562015-09-07 21:53:25 +020051
52 /*! SCTP stream ID for HNBAP */
53 uint16_t hnbap_stream;
54 /*! SCTP stream ID for RUA */
55 uint16_t rua_stream;
Harald Welteba43de42015-08-29 20:33:16 +020056};
57
58struct ue_context {
Harald Weltea2e6a7a2015-08-29 21:47:39 +020059 /*! Entry in the HNB-global list of UE */
Harald Welteba43de42015-08-29 20:33:16 +020060 struct llist_head list;
Harald Weltea2e6a7a2015-08-29 21:47:39 +020061 /*! Unique Context ID for this UE */
Harald Welteba43de42015-08-29 20:33:16 +020062 uint32_t context_id;
Harald Welteb534e5c2015-09-11 00:15:16 +020063 char imsi[16+1];
Harald Weltea2e6a7a2015-08-29 21:47:39 +020064 /*! UE is serviced via this HNB */
65 struct hnb_context *hnb;
Harald Welteba43de42015-08-29 20:33:16 +020066};
67
68struct hnb_gw {
69 struct {
70 /*! SCTP port for Iuh listening */
71 uint16_t iuh_listen_port;
Harald Weltea2e6a7a2015-08-29 21:47:39 +020072 /*! The UDP port where we receive multiplexed CS user
73 * plane traffic from HNBs */
74 uint16_t iuh_cs_mux_port;
75 uint16_t rnc_id;
Harald Welteba43de42015-08-29 20:33:16 +020076 } config;
77 /*! SCTP listen socket for incoming connections */
78 struct osmo_fd listen_fd;
79 struct llist_head hnb_list;
Harald Welteb534e5c2015-09-11 00:15:16 +020080 struct llist_head ue_list;
81 uint32_t next_ue_ctx_id;
Harald Welteba43de42015-08-29 20:33:16 +020082};
Harald Weltea2e6a7a2015-08-29 21:47:39 +020083
84extern struct hnb_gw g_hnb_gw;
Harald Welteb534e5c2015-09-11 00:15:16 +020085
86struct ue_context *ue_context_by_id(uint32_t id);
87struct ue_context *ue_context_by_imsi(const char *imsi);
88struct ue_context *ue_context_alloc(struct hnb_context *hnb, const char *imsi);
89void ue_context_free(struct ue_context *ue);