136 lines
3.9 KiB
C
136 lines
3.9 KiB
C
/* (C) 2015 by Daniel Willmann <dwillmann@sysmocom.de>
|
|
* (C) 2021 by sysmocom - s.f.m.c. GmbH <info@sysmocom.de>
|
|
* Author: Pau Espin Pedrol <pespin@sysmocom.de>
|
|
* All Rights Reserved
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU Affero General Public License as published by
|
|
* the Free Software Foundation; either version 3 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU Affero General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Affero General Public License
|
|
* along with this program. If not, see <http://www.gnu.org/lienses/>.
|
|
*
|
|
*/
|
|
#pragma once
|
|
|
|
#include <stdint.h>
|
|
#include <stdbool.h>
|
|
#include <inttypes.h>
|
|
|
|
#include <asn1c/asn1helpers.h>
|
|
|
|
#include <osmocom/core/select.h>
|
|
#include <osmocom/core/timer.h>
|
|
#include <osmocom/core/socket.h>
|
|
#include <osmocom/core/linuxlist.h>
|
|
#include <osmocom/core/write_queue.h>
|
|
#include <osmocom/core/logging.h>
|
|
#include <osmocom/gsm/gsm23003.h>
|
|
#include <osmocom/gsm/protocol/gsm_23_003.h>
|
|
#include <osmocom/netif/stream.h>
|
|
|
|
#include <osmocom/hnodeb/llsk.h>
|
|
|
|
enum {
|
|
DMAIN,
|
|
DHNBAP,
|
|
DRUA,
|
|
DRANAP,
|
|
DSCTP,
|
|
DLLSK,
|
|
DRTP,
|
|
DGTP,
|
|
};
|
|
extern const struct log_info hnb_log_info;
|
|
|
|
struct hnb;
|
|
|
|
struct hnb_ue {
|
|
struct llist_head list; /* Item in struct hnb->ue_list */
|
|
struct hnb *hnb; /* backpointer */
|
|
uint32_t conn_id;
|
|
char imsi[OSMO_IMSI_BUF_SIZE];
|
|
struct hnb_ue_cs_ctx {
|
|
bool active; /* Is this chan in use? */
|
|
bool conn_est_cnf_pending; /* Did we send CONN_ESTABLISH_CNF to lower layers? */
|
|
struct llist_head conn_list; /* list of struct rtp_conn */
|
|
} conn_cs;
|
|
struct hnb_ue_ps_ctx {
|
|
bool active; /* Is this chan in use? */
|
|
bool conn_est_cnf_pending; /* Did we send CONN_ESTABLISH_CNF to lower layers? */
|
|
struct llist_head conn_list; /* list of struct gtp_conn */
|
|
} conn_ps;
|
|
};
|
|
struct hnb_ue *hnb_ue_alloc(struct hnb *hnb, uint32_t conn_id);
|
|
void hnb_ue_free(struct hnb_ue *ue);
|
|
void hnb_ue_reset_chan(struct hnb_ue *ue, bool is_ps);
|
|
|
|
|
|
struct hnb {
|
|
char *identity; /* HNB-Identity */
|
|
struct osmo_plmn_id plmn;
|
|
uint16_t cell_identity;
|
|
uint16_t lac;
|
|
uint8_t rac;
|
|
uint16_t sac;
|
|
struct {
|
|
char *local_addr;
|
|
uint16_t local_port;
|
|
char *remote_addr;
|
|
uint16_t remote_port;
|
|
struct osmo_stream_cli *client;
|
|
} iuh;
|
|
|
|
/* Lower Layer UD socket */
|
|
struct osmo_prim_srv_link *llsk_link;
|
|
struct osmo_prim_srv *llsk;
|
|
uint8_t llsk_valid_sapi_mask;
|
|
struct osmo_timer_list llsk_defer_configure_ind_timer;
|
|
|
|
struct {
|
|
unsigned int jitter_buf_ms;
|
|
bool jitter_adaptive;
|
|
|
|
uint16_t port_range_start;
|
|
uint16_t port_range_end;
|
|
uint16_t port_range_next;
|
|
int ip_dscp;
|
|
int priority;
|
|
} rtp;
|
|
|
|
struct gtp {
|
|
char *cfg_local_addr;
|
|
struct osmo_sockaddr local_addr;
|
|
struct osmo_wqueue wq1u;
|
|
} gtp;
|
|
|
|
uint16_t rnc_id;
|
|
bool registered; /* Set to true once HnbRegisterAccept was received from Iuh. rnc_id is valid iif registered==true */
|
|
|
|
uint32_t ctx_id;
|
|
|
|
struct osmo_fsm_inst *shutdown_fi; /* FSM instance to manage shutdown procedure during process exit */
|
|
bool shutdown_fi_exit_proc; /* exit process when shutdown_fsm is finished? */
|
|
|
|
struct llist_head ue_list; /* list of struct hnb_ue */
|
|
};
|
|
|
|
struct hnb *hnb_alloc(void *tall_ctx);
|
|
void hnb_free(struct hnb *hnb);
|
|
struct hnb_ue *hnb_find_ue_by_id(const struct hnb *hnb, uint32_t conn_id);
|
|
struct hnb_ue *hnb_find_ue_by_imsi(const struct hnb *hnb, char *imsi);
|
|
|
|
struct rtp_conn *hnb_find_rtp_conn_by_id(const struct hnb *hnb, uint32_t audio_conn_id);
|
|
struct gtp_conn *hnb_find_gtp_conn_by_id(const struct hnb *hnb, uint32_t gtp_conn_id);
|
|
|
|
extern void *tall_hnb_ctx;
|
|
extern struct hnb *g_hnb;
|
|
|
|
#define LOGUE(ue, ss, lvl, fmt, args...) LOGP(ss, lvl, "UE(%" PRIu32 ") " fmt, (ue)->conn_id, ## args)
|