Ivan Kluchnikov | 8ee6051 | 2012-03-05 19:24:57 +0400 | [diff] [blame] | 1 | /* gprs_bssgp_pcu.h |
Ivan Kluchnikov | 5c2f9fb | 2012-02-05 02:27:17 +0400 | [diff] [blame] | 2 | * |
Ivan Kluchnikov | 8ee6051 | 2012-03-05 19:24:57 +0400 | [diff] [blame] | 3 | * Copyright (C) 2012 Ivan Klyuchnikov |
Holger Hans Peter Freyther | c0f1644 | 2013-08-22 08:40:33 +0200 | [diff] [blame] | 4 | * Copyright (C) 2013 by Holger Hans Peter Freyther |
Ivan Kluchnikov | 5c2f9fb | 2012-02-05 02:27:17 +0400 | [diff] [blame] | 5 | * |
| 6 | * This program is free software; you can redistribute it and/or |
| 7 | * modify it under the terms of the GNU General Public License |
| 8 | * as published by the Free Software Foundation; either version 2 |
| 9 | * of the License, or (at your option) any later version. |
| 10 | * |
| 11 | * This program is distributed in the hope that it will be useful, |
| 12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| 13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| 14 | * GNU General Public License for more details. |
| 15 | * |
| 16 | * You should have received a copy of the GNU General Public License |
| 17 | * along with this program; if not, write to the Free Software |
| 18 | * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. |
| 19 | */ |
Ivan Kluchnikov | 8ee6051 | 2012-03-05 19:24:57 +0400 | [diff] [blame] | 20 | |
| 21 | #ifndef GPRS_BSSGP_PCU_H |
| 22 | #define GPRS_BSSGP_PCU_H |
| 23 | |
Pau Espin Pedrol | ac3fd12 | 2021-01-13 18:54:38 +0100 | [diff] [blame] | 24 | #ifdef __cplusplus |
Ivan Kluchnikov | 5c2f9fb | 2012-02-05 02:27:17 +0400 | [diff] [blame] | 25 | extern "C" { |
Pau Espin Pedrol | ac3fd12 | 2021-01-13 18:54:38 +0100 | [diff] [blame] | 26 | #endif |
Ivan Kluchnikov | 5c2f9fb | 2012-02-05 02:27:17 +0400 | [diff] [blame] | 27 | #include <osmocom/core/talloc.h> |
| 28 | #include <osmocom/core/rate_ctr.h> |
Ivan Kluchnikov | a9f1ff2 | 2012-05-24 22:25:06 +0400 | [diff] [blame] | 29 | #include <osmocom/core/logging.h> |
Harald Welte | d679009 | 2012-06-18 12:21:03 +0800 | [diff] [blame] | 30 | #include <osmocom/core/signal.h> |
Ivan Kluchnikov | 5c2f9fb | 2012-02-05 02:27:17 +0400 | [diff] [blame] | 31 | #include <osmocom/core/application.h> |
Alexander Couzens | 290d903 | 2020-09-16 21:52:02 +0200 | [diff] [blame] | 32 | #include <osmocom/gprs/gprs_ns2.h> |
Harald Welte | d679009 | 2012-06-18 12:21:03 +0800 | [diff] [blame] | 33 | #include <osmocom/gprs/gprs_bssgp.h> |
Andreas Eversberg | 4b39dd1 | 2012-09-23 05:03:56 +0200 | [diff] [blame] | 34 | #include <osmocom/gprs/gprs_bssgp_bss.h> |
Harald Welte | d679009 | 2012-06-18 12:21:03 +0800 | [diff] [blame] | 35 | #include <osmocom/gprs/gprs_msgb.h> |
Ivan Kluchnikov | 5c2f9fb | 2012-02-05 02:27:17 +0400 | [diff] [blame] | 36 | |
Ivan Kluchnikov | 5c2f9fb | 2012-02-05 02:27:17 +0400 | [diff] [blame] | 37 | struct bssgp_bvc_ctx *btsctx_alloc(uint16_t bvci, uint16_t nsei); |
Pau Espin Pedrol | ac3fd12 | 2021-01-13 18:54:38 +0100 | [diff] [blame] | 38 | |
Ivan Kluchnikov | a9f1ff2 | 2012-05-24 22:25:06 +0400 | [diff] [blame] | 39 | #include <gprs_debug.h> |
Ivan Kluchnikov | 5c2f9fb | 2012-02-05 02:27:17 +0400 | [diff] [blame] | 40 | |
Pau Espin Pedrol | 1de6873 | 2020-03-11 14:04:52 +0100 | [diff] [blame] | 41 | #include <time.h> |
Pau Espin Pedrol | 8a35e64 | 2021-01-18 17:14:14 +0100 | [diff] [blame] | 42 | #include <unistd.h> |
Pau Espin Pedrol | 1de6873 | 2020-03-11 14:04:52 +0100 | [diff] [blame] | 43 | |
Andreas Eversberg | 4b39dd1 | 2012-09-23 05:03:56 +0200 | [diff] [blame] | 44 | #define QOS_PROFILE 4 |
Ivan Kluchnikov | 3fa42b2 | 2012-06-04 19:07:25 +0400 | [diff] [blame] | 45 | #define BSSGP_HDR_LEN 53 |
Ivan Kluchnikov | 8ee6051 | 2012-03-05 19:24:57 +0400 | [diff] [blame] | 46 | #define NS_HDR_LEN 4 |
Ivan Kluchnikov | b172b1b | 2012-06-07 01:51:49 +0400 | [diff] [blame] | 47 | #define IE_LLC_PDU 14 |
Ivan Kluchnikov | 5c2f9fb | 2012-02-05 02:27:17 +0400 | [diff] [blame] | 48 | |
Holger Hans Peter Freyther | e8d9a5f | 2013-07-28 19:11:20 +0200 | [diff] [blame] | 49 | struct gprs_bssgp_pcu { |
Holger Hans Peter Freyther | e8d9a5f | 2013-07-28 19:11:20 +0200 | [diff] [blame] | 50 | struct bssgp_bvc_ctx *bctx; |
| 51 | |
| 52 | struct gprs_rlcmac_bts *bts; |
| 53 | |
| 54 | struct osmo_timer_list bvc_timer; |
| 55 | |
| 56 | int nsvc_unblocked; |
| 57 | |
| 58 | int bvc_sig_reset; |
| 59 | int bvc_reset; |
| 60 | int bvc_unblocked; |
Holger Hans Peter Freyther | c0f1644 | 2013-08-22 08:40:33 +0200 | [diff] [blame] | 61 | |
Jacob Erlbeck | 6e4ccec | 2015-05-06 14:24:36 +0200 | [diff] [blame] | 62 | /* Flow control */ |
Pau Espin Pedrol | 1de6873 | 2020-03-11 14:04:52 +0100 | [diff] [blame] | 63 | struct timespec queue_delay_sum; |
Jacob Erlbeck | 6e4ccec | 2015-05-06 14:24:36 +0200 | [diff] [blame] | 64 | unsigned queue_delay_count; |
Jacob Erlbeck | 6eeb7c7 | 2015-05-06 15:26:08 +0200 | [diff] [blame] | 65 | uint8_t fc_tag; |
Jacob Erlbeck | 2db0f08 | 2015-09-07 18:49:00 +0200 | [diff] [blame] | 66 | unsigned queue_frames_sent; |
| 67 | unsigned queue_bytes_recv; |
| 68 | unsigned queue_frames_recv; |
Jacob Erlbeck | 6e4ccec | 2015-05-06 14:24:36 +0200 | [diff] [blame] | 69 | |
Holger Hans Peter Freyther | c0f1644 | 2013-08-22 08:40:33 +0200 | [diff] [blame] | 70 | /** callbacks below */ |
| 71 | |
| 72 | /* The BSSGP has been unblocked */ |
| 73 | void (*on_unblock_ack)(struct gprs_bssgp_pcu *pcu); |
Holger Hans Peter Freyther | 416ce69 | 2013-08-22 08:44:04 +0200 | [diff] [blame] | 74 | |
| 75 | /* When BSSGP data arrives. The msgb is not only for reference */ |
| 76 | void (*on_dl_unit_data)(struct gprs_bssgp_pcu *pcu, struct msgb *msg, |
| 77 | struct tlv_parsed *tp); |
Holger Hans Peter Freyther | e8d9a5f | 2013-07-28 19:11:20 +0200 | [diff] [blame] | 78 | }; |
| 79 | |
Pau Espin Pedrol | ac3fd12 | 2021-01-13 18:54:38 +0100 | [diff] [blame] | 80 | int gprs_gp_send_cb(void *ctx, struct msgb *msg); |
| 81 | struct bssgp_bvc_ctx *gprs_bssgp_pcu_current_bctx(void); |
| 82 | int gprs_ns_prim_cb(struct osmo_prim_hdr *oph, void *ctx); |
| 83 | void gprs_bssgp_update_queue_delay(const struct timespec *tv_recv, |
| 84 | const struct timespec *tv_now); |
| 85 | void gprs_bssgp_update_frames_sent(); |
| 86 | void gprs_bssgp_update_bytes_received(unsigned bytes_recv, unsigned frames_recv); |
| 87 | |
Alexander Couzens | 290d903 | 2020-09-16 21:52:02 +0200 | [diff] [blame] | 88 | struct gprs_bssgp_pcu *gprs_bssgp_init( |
| 89 | struct gprs_rlcmac_bts *bts, |
| 90 | uint16_t nsei, uint16_t bvci, |
| 91 | uint16_t mcc, uint16_t mnc, bool mnc_3_digits, |
Holger Hans Peter Freyther | b67a8a3 | 2013-07-28 18:55:14 +0200 | [diff] [blame] | 92 | uint16_t lac, uint16_t rac, uint16_t cell_id); |
Andreas Eversberg | bf5a0f6 | 2012-07-06 08:58:22 +0200 | [diff] [blame] | 93 | |
Alexander Couzens | 5bece2a | 2020-10-12 02:27:22 +0200 | [diff] [blame] | 94 | int gprs_ns_config(struct gprs_rlcmac_bts *bts, uint16_t nsei, |
| 95 | const struct osmo_sockaddr *local, |
| 96 | const struct osmo_sockaddr *remote, |
| 97 | uint16_t *nsvci, uint16_t valid); |
Alexander Couzens | eb64d43 | 2019-05-25 03:10:51 +0200 | [diff] [blame] | 98 | |
Alexander Couzens | 290d903 | 2020-09-16 21:52:02 +0200 | [diff] [blame] | 99 | void gprs_bssgp_destroy(struct gprs_rlcmac_bts *bts); |
Andreas Eversberg | bf5a0f6 | 2012-07-06 08:58:22 +0200 | [diff] [blame] | 100 | |
Pau Espin Pedrol | ac3fd12 | 2021-01-13 18:54:38 +0100 | [diff] [blame] | 101 | #ifdef __cplusplus |
| 102 | } |
| 103 | #endif |
Jacob Erlbeck | 6e4ccec | 2015-05-06 14:24:36 +0200 | [diff] [blame] | 104 | |
Ivan Kluchnikov | 8ee6051 | 2012-03-05 19:24:57 +0400 | [diff] [blame] | 105 | #endif // GPRS_BSSGP_PCU_H |