blob: 3476c4f90791122b93009e7dbba17395b8156993 [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,
Daniel Willmannbded9842015-12-17 11:51:17 +010014 DHNBAP,
Harald Welteb3dae302015-08-30 12:20:09 +020015};
16
17
Harald Weltea2e6a7a2015-08-29 21:47:39 +020018/* 25.467 Section 7.1 */
19#define IUH_DEFAULT_SCTP_PORT 29169
20#define RNA_DEFAULT_SCTP_PORT 25471
21
22#define IUH_PPI_RUA 19
23#define IUH_PPI_HNBAP 20
24#define IUH_PPI_SABP 31
25#define IUH_PPI_RNA 42
26#define IUH_PPI_PUA 55
27
Harald Welteb3dae302015-08-30 12:20:09 +020028#define IUH_MSGB_SIZE 2048
Harald Weltea2e6a7a2015-08-29 21:47:39 +020029
30struct umts_cell_id {
31 uint16_t mcc; /*!< Mobile Country Code */
32 uint16_t mnc; /*!< Mobile Network Code */
33 uint16_t lac; /*!< Locaton Area Code */
34 uint16_t rac; /*!< Routing Area Code */
35 uint16_t sac; /*!< Service Area Code */
36 uint32_t cid; /*!< Cell ID */
37};
38
39struct hnb_gw;
40
Harald Welteba43de42015-08-29 20:33:16 +020041struct hnb_context {
42 /*! Entry in HNB-global list of HNB */
43 struct llist_head list;
Harald Weltea2e6a7a2015-08-29 21:47:39 +020044 /*! HNB-GW we are part of */
45 struct hnb_gw *gw;
Harald Welte3f712562015-09-07 21:53:25 +020046 /*! SCTP socket + write queue for Iuh to this specific HNB */
47 struct osmo_wqueue wqueue;
Harald Weltea2e6a7a2015-08-29 21:47:39 +020048 /*! copied from HNB-Identity-Info IE */
49 char identity_info[256];
50 /*! copied from Cell Identity IE */
51 struct umts_cell_id id;
Harald Welte3f712562015-09-07 21:53:25 +020052
53 /*! SCTP stream ID for HNBAP */
54 uint16_t hnbap_stream;
55 /*! SCTP stream ID for RUA */
56 uint16_t rua_stream;
Harald Welteba43de42015-08-29 20:33:16 +020057};
58
59struct ue_context {
Harald Weltea2e6a7a2015-08-29 21:47:39 +020060 /*! Entry in the HNB-global list of UE */
Harald Welteba43de42015-08-29 20:33:16 +020061 struct llist_head list;
Harald Weltea2e6a7a2015-08-29 21:47:39 +020062 /*! Unique Context ID for this UE */
Harald Welteba43de42015-08-29 20:33:16 +020063 uint32_t context_id;
Harald Welteb534e5c2015-09-11 00:15:16 +020064 char imsi[16+1];
Harald Weltea2e6a7a2015-08-29 21:47:39 +020065 /*! UE is serviced via this HNB */
66 struct hnb_context *hnb;
Harald Welteba43de42015-08-29 20:33:16 +020067};
68
69struct hnb_gw {
70 struct {
71 /*! SCTP port for Iuh listening */
72 uint16_t iuh_listen_port;
Harald Weltea2e6a7a2015-08-29 21:47:39 +020073 /*! The UDP port where we receive multiplexed CS user
74 * plane traffic from HNBs */
75 uint16_t iuh_cs_mux_port;
76 uint16_t rnc_id;
Harald Welteba43de42015-08-29 20:33:16 +020077 } config;
78 /*! SCTP listen socket for incoming connections */
79 struct osmo_fd listen_fd;
80 struct llist_head hnb_list;
Harald Welteb534e5c2015-09-11 00:15:16 +020081 struct llist_head ue_list;
82 uint32_t next_ue_ctx_id;
Harald Welteba43de42015-08-29 20:33:16 +020083};
Harald Weltea2e6a7a2015-08-29 21:47:39 +020084
85extern struct hnb_gw g_hnb_gw;
Harald Welteb534e5c2015-09-11 00:15:16 +020086
87struct ue_context *ue_context_by_id(uint32_t id);
88struct ue_context *ue_context_by_imsi(const char *imsi);
89struct ue_context *ue_context_alloc(struct hnb_context *hnb, const char *imsi);
90void ue_context_free(struct ue_context *ue);