blob: fede5eef737aefe49619c8cd489800aa38a894c6 [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
10enum {
11 DMAIN,
Daniel Willmannbded9842015-12-17 11:51:17 +010012 DHNBAP,
Harald Welte75a4e652015-12-22 23:59:24 +010013 DSUA,
Harald Weltef42317b2015-12-23 15:36:31 +010014 DRUA,
15 DRANAP,
Harald Welteb3dae302015-08-30 12:20:09 +020016};
17
18
Harald Weltea2e6a7a2015-08-29 21:47:39 +020019/* 25.467 Section 7.1 */
20#define IUH_DEFAULT_SCTP_PORT 29169
21#define RNA_DEFAULT_SCTP_PORT 25471
22
23#define IUH_PPI_RUA 19
24#define IUH_PPI_HNBAP 20
25#define IUH_PPI_SABP 31
26#define IUH_PPI_RNA 42
27#define IUH_PPI_PUA 55
28
Harald Welteb3dae302015-08-30 12:20:09 +020029#define IUH_MSGB_SIZE 2048
Harald Weltea2e6a7a2015-08-29 21:47:39 +020030
31struct umts_cell_id {
32 uint16_t mcc; /*!< Mobile Country Code */
33 uint16_t mnc; /*!< Mobile Network Code */
34 uint16_t lac; /*!< Locaton Area Code */
35 uint16_t rac; /*!< Routing Area Code */
36 uint16_t sac; /*!< Service Area Code */
37 uint32_t cid; /*!< Cell ID */
38};
39
40struct hnb_gw;
41
Harald Welteba43de42015-08-29 20:33:16 +020042struct hnb_context {
43 /*! Entry in HNB-global list of HNB */
44 struct llist_head list;
Harald Weltea2e6a7a2015-08-29 21:47:39 +020045 /*! HNB-GW we are part of */
46 struct hnb_gw *gw;
Harald Welte3f712562015-09-07 21:53:25 +020047 /*! SCTP socket + write queue for Iuh to this specific HNB */
48 struct osmo_wqueue wqueue;
Harald Weltea2e6a7a2015-08-29 21:47:39 +020049 /*! copied from HNB-Identity-Info IE */
50 char identity_info[256];
51 /*! copied from Cell Identity IE */
52 struct umts_cell_id id;
Harald Welte3f712562015-09-07 21:53:25 +020053
54 /*! SCTP stream ID for HNBAP */
55 uint16_t hnbap_stream;
56 /*! SCTP stream ID for RUA */
57 uint16_t rua_stream;
Harald Welteba43de42015-08-29 20:33:16 +020058};
59
60struct ue_context {
Harald Weltea2e6a7a2015-08-29 21:47:39 +020061 /*! Entry in the HNB-global list of UE */
Harald Welteba43de42015-08-29 20:33:16 +020062 struct llist_head list;
Harald Weltea2e6a7a2015-08-29 21:47:39 +020063 /*! Unique Context ID for this UE */
Harald Welteba43de42015-08-29 20:33:16 +020064 uint32_t context_id;
Harald Welteb534e5c2015-09-11 00:15:16 +020065 char imsi[16+1];
Harald Weltea2e6a7a2015-08-29 21:47:39 +020066 /*! UE is serviced via this HNB */
67 struct hnb_context *hnb;
Harald Welteba43de42015-08-29 20:33:16 +020068};
69
70struct hnb_gw {
71 struct {
72 /*! SCTP port for Iuh listening */
73 uint16_t iuh_listen_port;
Harald Weltea2e6a7a2015-08-29 21:47:39 +020074 /*! The UDP port where we receive multiplexed CS user
75 * plane traffic from HNBs */
76 uint16_t iuh_cs_mux_port;
77 uint16_t rnc_id;
Harald Welteba43de42015-08-29 20:33:16 +020078 } config;
79 /*! SCTP listen socket for incoming connections */
80 struct osmo_fd listen_fd;
81 struct llist_head hnb_list;
Harald Welteb534e5c2015-09-11 00:15:16 +020082 struct llist_head ue_list;
83 uint32_t next_ue_ctx_id;
Harald Welteba43de42015-08-29 20:33:16 +020084};
Harald Weltea2e6a7a2015-08-29 21:47:39 +020085
86extern struct hnb_gw g_hnb_gw;
Harald Welteb534e5c2015-09-11 00:15:16 +020087
88struct ue_context *ue_context_by_id(uint32_t id);
89struct ue_context *ue_context_by_imsi(const char *imsi);
90struct ue_context *ue_context_alloc(struct hnb_context *hnb, const char *imsi);
91void ue_context_free(struct ue_context *ue);