diff options
author | Neels Hofmeyr <neels@hofmeyr.de> | 2016-08-18 13:13:55 +0200 |
---|---|---|
committer | Harald Welte <laforge@gnumonks.org> | 2016-09-09 06:43:32 +0000 |
commit | df63de2e37af890f3abb11d4de2334c2b49ae13c (patch) | |
tree | fbba6d8566475df9e97b24fa0967de0f74029c97 /include/osmocom/iuh/hnbgw.h | |
parent | 30e08f5b8e9ed4dbc12983d61eb1f1661eb91dd0 (diff) |
build: move headers to include/osmocom/*
This came up while fixing 'make distcheck'; this is certainly not the easiest
way but it makes sense to have the headers in include/, like we do in openbsc.
The easy alternative might be to add -I$(top_srcdir)/src to src/Makefile.am.
Remove -I$(top_srcdir)/src from src/tests/Makefile.am, no longer needed.
Change-Id: I5a82e029dcdc4df0a60a31271a4883393fe59234
Diffstat (limited to 'include/osmocom/iuh/hnbgw.h')
-rw-r--r-- | include/osmocom/iuh/hnbgw.h | 154 |
1 files changed, 154 insertions, 0 deletions
diff --git a/include/osmocom/iuh/hnbgw.h b/include/osmocom/iuh/hnbgw.h new file mode 100644 index 0000000..21a9602 --- /dev/null +++ b/include/osmocom/iuh/hnbgw.h @@ -0,0 +1,154 @@ +#pragma once + +#include <osmocom/core/select.h> +#include <osmocom/core/linuxlist.h> +#include <osmocom/core/write_queue.h> +#include <osmocom/core/timer.h> +#include <osmocom/sigtran/sccp_sap.h> + +#define DEBUG +#include <osmocom/core/logging.h> + + +enum { + DMAIN, + DHNBAP, + DSUA, + DRUA, + DRANAP, +}; + + +/* 25.467 Section 7.1 */ +#define IUH_DEFAULT_SCTP_PORT 29169 +#define RNA_DEFAULT_SCTP_PORT 25471 + +#define IUH_PPI_RUA 19 +#define IUH_PPI_HNBAP 20 +#define IUH_PPI_SABP 31 +#define IUH_PPI_RNA 42 +#define IUH_PPI_PUA 55 + +#define IUH_MSGB_SIZE 2048 + +struct umts_cell_id { + uint16_t mcc; /*!< Mobile Country Code */ + uint16_t mnc; /*!< Mobile Network Code */ + uint16_t lac; /*!< Locaton Area Code */ + uint16_t rac; /*!< Routing Area Code */ + uint16_t sac; /*!< Service Area Code */ + uint32_t cid; /*!< Cell ID */ +}; + +struct hnb_gw; + +enum hnbgw_cnlink_state { + /* we have just been initialized or were disconnected */ + CNLINK_S_NULL, + /* establishment of the SUA/SCCP link is pending */ + CNLINK_S_EST_PEND, + /* establishment of the SUA/SCCP link was confirmed */ + CNLINK_S_EST_CONF, + /* we have esnt the RANAP RESET and wait for the ACK */ + CNLINK_S_EST_RST_TX_WAIT_ACK, + /* we have received the RANAP RESET ACK and are active */ + CNLINK_S_EST_ACTIVE, +}; + +struct hnbgw_cnlink { + struct llist_head list; + enum hnbgw_cnlink_state state; + struct hnb_gw *gw; + /* are we a PS connection (1) or CS (0) */ + int is_ps; + /* timer for re-transmitting the RANAP Reset */ + struct osmo_timer_list T_RafC; + /* reference to the SCCP User SAP by which we communicate */ + struct osmo_sccp_user *sua_user; + struct osmo_sccp_link *sua_link; + struct osmo_sccp_addr local_addr; + struct osmo_sccp_addr remote_addr; + uint32_t next_conn_id; + + /* linked list of hnbgw_context_map */ + struct llist_head map_list; +}; + +struct hnb_context { + /*! Entry in HNB-global list of HNB */ + struct llist_head list; + /*! HNB-GW we are part of */ + struct hnb_gw *gw; + /*! SCTP socket + write queue for Iuh to this specific HNB */ + struct osmo_stream_srv *conn; + /*! copied from HNB-Identity-Info IE */ + char identity_info[256]; + /*! copied from Cell Identity IE */ + struct umts_cell_id id; + + /*! SCTP stream ID for HNBAP */ + uint16_t hnbap_stream; + /*! SCTP stream ID for RUA */ + uint16_t rua_stream; + + /* linked list of hnbgw_context_map */ + struct llist_head map_list; +}; + +struct ue_context { + /*! Entry in the HNB-global list of UE */ + struct llist_head list; + /*! Unique Context ID for this UE */ + uint32_t context_id; + char imsi[16+1]; + /* TODO: track TMSI, for HNBAP UE Register Request with TMSI, + * seen with ip.access nano3G femto cell */ + /*! UE is serviced via this HNB */ + struct hnb_context *hnb; +}; + +#define HNBGW_IUH_BIND_ADDR_DEFAULT "0.0.0.0" + +struct hnb_gw { + struct { + const char *iuh_bind_addr; + /*! SCTP port for Iuh listening */ + uint16_t iuh_listen_port; + /*! The UDP port where we receive multiplexed CS user + * plane traffic from HNBs */ + uint16_t iuh_cs_mux_port; + uint16_t rnc_id; + } config; + /*! SCTP listen socket for incoming connections */ + struct osmo_stream_srv_link *iuh; + /* list of struct hnb_context */ + struct llist_head hnb_list; + /* list of struct ue_context */ + struct llist_head ue_list; + /* list of struct hnbgw_cnlink */ + struct llist_head cn_list; + /* next availble UE Context ID */ + uint32_t next_ue_ctx_id; + + /* currently active CN links for CS and PS */ + struct hnbgw_cnlink *cnlink_cs; + struct hnbgw_cnlink *cnlink_ps; +}; + +extern void *talloc_asn1_ctx; + +struct ue_context *ue_context_by_id(struct hnb_gw *gw, uint32_t id); +struct ue_context *ue_context_by_imsi(struct hnb_gw *gw, const char *imsi); +struct ue_context *ue_context_alloc(struct hnb_context *hnb, const char *imsi); +void ue_context_free(struct ue_context *ue); + +struct hnb_context *hnb_context_alloc(struct hnb_gw *gw, struct osmo_stream_srv_link *link, int new_fd); +void hnb_context_release(struct hnb_context *ctx); + +void hnbgw_vty_init(struct hnb_gw *gw, void *tall_ctx); + +/* + * Return IP address passed to the hnbgw/iuh/bind command, or + * IUH_BIND_ADDR_DEFAULT + */ +const char *hnbgw_get_iuh_bind_addr(struct hnb_gw *gw); |