/* * Copyright (C) 2013 by Holger Hans Peter Freyther * Copyright (C) 2021 by sysmocom - s.f.m.c. GmbH * Author: Pau Espin Pedrol * * 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 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 . * */ #pragma once #include #include #include #include "gprs_bssgp_pcu.h" #include "coding_scheme.h" #define LLC_CODEL_DISABLE 0 #define LLC_CODEL_USE_DEFAULT (-1) #define MAX_EDGE_MCS 9 #define MAX_GPRS_CS 4 /* see bts->gsmtap_categ_mask */ enum pcu_gsmtap_category { PCU_GSMTAP_C_DL_UNKNOWN = 0, /* unknown or undecodable downlink blocks */ PCU_GSMTAP_C_DL_DUMMY = 1, /* downlink dummy blocks */ PCU_GSMTAP_C_DL_CTRL = 2, /* downlink control blocks */ PCU_GSMTAP_C_DL_DATA_GPRS = 3, /* downlink GPRS data blocks */ PCU_GSMTAP_C_DL_DATA_EGPRS = 4, /* downlink EGPRS data blocks */ PCU_GSMTAP_C_DL_PTCCH = 5, /* downlink PTCCH blocks */ PCU_GSMTAP_C_DL_AGCH = 6, /* downlink AGCH blocks */ PCU_GSMTAP_C_DL_PCH = 7, /* downlink PCH blocks */ PCU_GSMTAP_C_UL_UNKNOWN = 15, /* unknown or undecodable uplink blocks */ PCU_GSMTAP_C_UL_DUMMY = 16, /* uplink dummy blocks */ PCU_GSMTAP_C_UL_CTRL = 17, /* uplink control blocks */ PCU_GSMTAP_C_UL_DATA_GPRS = 18, /* uplink GPRS data blocks */ PCU_GSMTAP_C_UL_DATA_EGPRS = 19, /* uplink EGPRS data blocks */ PCU_GSMTAP_C_UL_RACH = 20, /* uplink RACH bursts */ PCU_GSMTAP_C_UL_PTCCH = 21, /* uplink PTCCH bursts */ }; struct BTS; struct gprs_rlcmac_bts; struct GprsMs; struct gprs_rlcmac_tbf; typedef int (*alloc_algorithm_func_t)(struct gprs_rlcmac_bts *bts, struct GprsMs *ms, struct gprs_rlcmac_tbf *tbf, bool single, int8_t use_tbf); struct gprs_pcu { /* Path to be used for the pcu-bts socket */ char *pcu_sock_path; struct { /* Config Values set by VTY */ bool force_initial_cs; /* false=use from BTS true=use from VTY */ bool force_initial_mcs; /* false=use from BTS true=use from VTY */ uint8_t max_cs_dl, max_cs_ul; uint8_t max_mcs_dl, max_mcs_ul; uint8_t force_two_phase; uint8_t alpha, gamma; bool dl_tbf_preemptive_retransmission; enum egprs_arq_type dl_arq_type; /* EGPRS_ARQ1 to support resegmentation in DL, EGPRS_ARQ2 for no reseg */ bool cs_adj_enabled; /* whether cs_adj_{upper,lower}_limit are used to adjust DL CS */ uint8_t cs_adj_upper_limit; /* downgrade DL CS if error rate above its value */ uint8_t cs_adj_lower_limit; /* upgrade DL CS if error rate below its value */ /* downgrade DL CS when less than specified octets are left in tx queue. Optimization, see paper: "Theoretical Analysis of GPRS Throughput and Delay" */ uint16_t cs_downgrade_threshold; /* Link quality range for each UL (M)CS. Below or above, next/prev (M)CS is selected. */ struct {int16_t low; int16_t high; } cs_lqual_ranges[MAX_GPRS_CS]; struct {int16_t low; int16_t high; } mcs_lqual_ranges[MAX_EDGE_MCS]; } vty; struct gsmtap_inst *gsmtap; uint32_t gsmtap_categ_mask; struct BTS *bts; struct gprs_ns2_inst *nsi; alloc_algorithm_func_t alloc_algorithm; struct gprs_bssgp_pcu bssgp; struct osmo_tdef *T_defs; /* timers controlled by PCU */ }; extern struct gprs_pcu *the_pcu; struct gprs_pcu *gprs_pcu_alloc(void *ctx); void gprs_pcu_set_max_cs(struct gprs_pcu *pcu, uint8_t cs_dl, uint8_t cs_ul); void gprs_pcu_set_max_mcs(struct gprs_pcu *pcu, uint8_t mcs_dl, uint8_t mcs_ul);