pespin has uploaded this change for review.
Move include osmocom/gprs -> osmocom/gb, deprecate osmocom/gprs/
libosmogb is an anomaly since it has its headers in osmocom/gprs
directory instead of osmocom/gb. This is really confusing for users.
Furthermore, libosmo-gprs is also using osmocom/gprs, which will create
even more confusion.
This patch moves all existing osmocom/gprs/ header files under
osmocom/gb/ directory (except the backward-compat ones which were
added pointing to the ones in osmocom/gsm/).
Next, new files are added in osmocom/gprs/ replacing the ones that used
to be tehre, with a pragma message announcing deprecating and asking
users to use the new path instead.
This allows keeping old applications working, while announcing
deprecation of the old osmocom/gprs/ patch and have all new development
happen under osmocom/gb/.
Change-Id: I6e826775552766e34e4c06fe2390084596dfc286
---
M Doxyfile.gb.in
M Makefile.am
M configure.ac
M contrib/libosmocore.spec.in
M include/osmocom/Makefile.am
A include/osmocom/gb/Makefile.am
A include/osmocom/gb/bssgp_bvc_fsm.h
A include/osmocom/gb/frame_relay.h
A include/osmocom/gb/gprs_bssgp.h
A include/osmocom/gb/gprs_bssgp2.h
A include/osmocom/gb/gprs_bssgp_bss.h
A include/osmocom/gb/gprs_bssgp_rim.h
A include/osmocom/gb/gprs_msgb.h
A include/osmocom/gb/gprs_ns.h
A include/osmocom/gb/gprs_ns2.h
A include/osmocom/gb/gprs_ns_frgre.h
A include/osmocom/gb/protocol/Makefile.am
A include/osmocom/gb/protocol/gsm_08_16.h
A include/osmocom/gb/protocol/gsm_08_18.h
A include/osmocom/gb/protocol/gsm_24_301.h
M include/osmocom/gprs/bssgp_bvc_fsm.h
M include/osmocom/gprs/frame_relay.h
M include/osmocom/gprs/gprs_bssgp.h
M include/osmocom/gprs/gprs_bssgp2.h
M include/osmocom/gprs/gprs_bssgp_bss.h
M include/osmocom/gprs/gprs_bssgp_rim.h
M include/osmocom/gprs/gprs_msgb.h
M include/osmocom/gprs/gprs_ns.h
M include/osmocom/gprs/gprs_ns2.h
M include/osmocom/gprs/gprs_ns_frgre.h
M include/osmocom/gprs/protocol/gsm_08_16.h
M include/osmocom/gprs/protocol/gsm_08_18.h
M include/osmocom/gprs/protocol/gsm_24_301.h
M src/gb/bssgp_bvc_fsm.c
M src/gb/common_vty.c
M src/gb/frame_relay.c
M src/gb/gb_internal.h
M src/gb/gprs_bssgp.c
M src/gb/gprs_bssgp2.c
M src/gb/gprs_bssgp_bss.c
M src/gb/gprs_bssgp_internal.h
M src/gb/gprs_bssgp_rim.c
M src/gb/gprs_bssgp_util.c
M src/gb/gprs_bssgp_vty.c
M src/gb/gprs_ns.c
M src/gb/gprs_ns2.c
M src/gb/gprs_ns2_fr.c
M src/gb/gprs_ns2_frgre.c
M src/gb/gprs_ns2_internal.h
M src/gb/gprs_ns2_message.c
M src/gb/gprs_ns2_sns.c
M src/gb/gprs_ns2_udp.c
M src/gb/gprs_ns2_vc_fsm.c
M src/gb/gprs_ns2_vty.c
M src/gb/gprs_ns_frgre.c
M src/gb/gprs_ns_sns.c
M src/gb/gprs_ns_vty.c
M tests/fr/fr_test.c
M tests/gb/bssgp_fc_test.c
M tests/gb/gprs_bssgp_rim_test.c
M tests/gb/gprs_bssgp_test.c
M tests/gb/gprs_ns2_test.c
M tests/gb/gprs_ns_test.c
M utils/osmo-ns-dummy-vty.c
M utils/osmo-ns-dummy.c
65 files changed, 2,072 insertions(+), 1,991 deletions(-)
git pull ssh://gerrit.osmocom.org:29418/libosmocore refs/changes/60/31360/1
diff --git a/Doxyfile.gb.in b/Doxyfile.gb.in
index da8e770..1d31e77 100644
--- a/Doxyfile.gb.in
+++ b/Doxyfile.gb.in
@@ -610,7 +610,7 @@
# directories like "/usr/src/myproject". Separate the files or directories
# with spaces.
-INPUT = @srcdir@/include/osmocom/gprs @srcdir@/src/gb
+INPUT = @srcdir@/include/osmocom/gb @srcdir@/src/gb
# This tag can be used to specify the character encoding of the source files
# that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is
diff --git a/Makefile.am b/Makefile.am
index e57b022..bcc269a 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -143,7 +143,7 @@
touch "$@"
$(top_builddir)/doc/libosmogb.tag.prep: $(top_builddir)/Doxyfile.gb \
- $(top_srcdir)/include/osmocom/gprs/*.h \
+ $(top_srcdir)/include/osmocom/gb/*.h \
$(top_srcdir)/src/gb/*.[hc]
rm -rf $(top_builddir)/doc/gb; mkdir -p $(top_builddir)/doc/gb
rm -rf $(top_builddir)/doc/libosmogb.map
diff --git a/configure.ac b/configure.ac
index ee1c6f0..ccb5a32 100644
--- a/configure.ac
+++ b/configure.ac
@@ -594,6 +594,8 @@
include/osmocom/core/Makefile
include/osmocom/crypt/Makefile
include/osmocom/ctrl/Makefile
+ include/osmocom/gb/Makefile
+ include/osmocom/gb/protocol/Makefile
include/osmocom/gprs/Makefile
include/osmocom/gprs/protocol/Makefile
include/osmocom/gsm/Makefile
diff --git a/contrib/libosmocore.spec.in b/contrib/libosmocore.spec.in
index fdd1a65..827a96c 100644
--- a/contrib/libosmocore.spec.in
+++ b/contrib/libosmocore.spec.in
@@ -433,6 +433,7 @@
%defattr(-,root,root)
%dir %_includedir/%name
%dir %_includedir/%name/osmocom
+%_includedir/%name/osmocom/gb/
%_includedir/%name/osmocom/gprs/
%_libdir/libosmogb.so
%_libdir/pkgconfig/libosmogb.pc
diff --git a/include/osmocom/Makefile.am b/include/osmocom/Makefile.am
index 3353809..fa8c057 100644
--- a/include/osmocom/Makefile.am
+++ b/include/osmocom/Makefile.am
@@ -6,6 +6,7 @@
isdn \
crypt \
coding \
+ gb \
gprs \
ctrl \
sim \
diff --git a/include/osmocom/gb/Makefile.am b/include/osmocom/gb/Makefile.am
new file mode 100644
index 0000000..c0ed203
--- /dev/null
+++ b/include/osmocom/gb/Makefile.am
@@ -0,0 +1,16 @@
+SUBDIRS = protocol
+
+osmogb_HEADERS = \
+ frame_relay.h \
+ bssgp_bvc_fsm.h \
+ gprs_bssgp.h \
+ gprs_bssgp2.h \
+ gprs_bssgp_bss.h \
+ gprs_bssgp_rim.h \
+ gprs_msgb.h \
+ gprs_ns.h \
+ gprs_ns_frgre.h \
+ gprs_ns2.h \
+ $(NULL)
+
+osmogbdir = $(includedir)/osmocom/gb
diff --git a/include/osmocom/gb/bssgp_bvc_fsm.h b/include/osmocom/gb/bssgp_bvc_fsm.h
new file mode 100644
index 0000000..c47048d
--- /dev/null
+++ b/include/osmocom/gb/bssgp_bvc_fsm.h
@@ -0,0 +1,71 @@
+#pragma once
+#include <stdint.h>
+
+struct gprs_ns2_inst;
+struct osmo_fsm_inst;
+struct gprs_ra_id;
+struct bssgp2_flow_ctrl;
+
+enum bssp_ptp_bvc_fsm_state {
+ BSSGP_BVCFSM_S_NULL,
+ BSSGP_BVCFSM_S_BLOCKED,
+ BSSGP_BVCFSM_S_WAIT_RESET_ACK,
+ BSSGP_BVCFSM_S_UNBLOCKED,
+};
+
+enum bssgp_ptp_bvc_fsm_event {
+ /* Rx of BSSGP PDUs from the remote side; 'data' is 'struct tlv_parsed', and
+ * the assumption is that the caller has already validated all mandatory IEs
+ * are present and of sufficient length */
+ BSSGP_BVCFSM_E_RX_BLOCK,
+ BSSGP_BVCFSM_E_RX_BLOCK_ACK,
+ BSSGP_BVCFSM_E_RX_UNBLOCK,
+ BSSGP_BVCFSM_E_RX_UNBLOCK_ACK,
+ BSSGP_BVCFSM_E_RX_RESET,
+ BSSGP_BVCFSM_E_RX_RESET_ACK,
+ BSSGP_BVCFSM_E_RX_FC_BVC,
+ BSSGP_BVCFSM_E_RX_FC_BVC_ACK,
+ /* Requests of the local user */
+ BSSGP_BVCFSM_E_REQ_BLOCK, /* data: uint8_t *cause */
+ BSSGP_BVCFSM_E_REQ_UNBLOCK,
+ BSSGP_BVCFSM_E_REQ_RESET, /* data: uint8_t *cause */
+ BSSGP_BVCFSM_E_REQ_FC_BVC, /* data: struct bssgp2_flow_ctrl */
+};
+
+struct bssgp_bvc_fsm_ops {
+ /* call-back notifying the user of a state change */
+ void (*state_chg_notification)(uint16_t nsei, uint16_t bvci, int old_state, int new_state,
+ void *priv);
+ /* call-back notifying the user of a BVC-RESET event */
+ void (*reset_notification)(uint16_t nsei, uint16_t bvci, const struct gprs_ra_id *ra_id,
+ uint16_t cell_id, uint8_t cause, void *priv);
+ void (*rx_fc_bvc)(uint16_t nsei, uint16_t bvci, const struct bssgp2_flow_ctrl *fc, void *priv);
+ void (*reset_ack_notification)(uint16_t nsei, uint16_t bvci, const struct gprs_ra_id *ra_id,
+ uint16_t cell_id, uint8_t cause, void *priv);
+};
+
+struct osmo_fsm_inst *
+bssgp_bvc_fsm_alloc_sig_bss(void *ctx, struct gprs_ns2_inst *nsi, uint16_t nsei, uint32_t features);
+
+struct osmo_fsm_inst *
+bssgp_bvc_fsm_alloc_ptp_bss(void *ctx, struct gprs_ns2_inst *nsi, uint16_t nsei, uint16_t bvci,
+ const struct gprs_ra_id *ra_id, uint16_t cell_id);
+
+struct osmo_fsm_inst *
+bssgp_bvc_fsm_alloc_sig_sgsn(void *ctx, struct gprs_ns2_inst *nsi, uint16_t nsei, uint32_t features);
+
+struct osmo_fsm_inst *
+bssgp_bvc_fsm_alloc_ptp_sgsn(void *ctx, struct gprs_ns2_inst *nsi, uint16_t nsei, uint16_t bvci);
+
+void bssgp_bvc_fsm_set_ops(struct osmo_fsm_inst *fi, const struct bssgp_bvc_fsm_ops *ops, void *ops_priv);
+
+bool bssgp_bvc_fsm_is_unblocked(struct osmo_fsm_inst *fi);
+
+uint8_t bssgp_bvc_fsm_get_block_cause(struct osmo_fsm_inst *fi);
+
+uint32_t bssgp_bvc_fsm_get_features_advertised(struct osmo_fsm_inst *fi);
+uint32_t bssgp_bvc_fsm_get_features_received(struct osmo_fsm_inst *fi);
+uint32_t bssgp_bvc_fsm_get_features_negotiated(struct osmo_fsm_inst *fi);
+
+void bssgp_bvc_fsm_set_max_pdu_len(struct osmo_fsm_inst *fi, uint16_t max_pdu_len);
+uint16_t bssgp_bvc_fsm_get_max_pdu_len(const struct osmo_fsm_inst *fi);
diff --git a/include/osmocom/gb/frame_relay.h b/include/osmocom/gb/frame_relay.h
new file mode 100644
index 0000000..9515e8a
--- /dev/null
+++ b/include/osmocom/gb/frame_relay.h
@@ -0,0 +1,152 @@
+/*! \file frame_relay.h */
+
+/* (C) 2020 Harald Welte <laforge@gnumonks.org>
+ * (C) 2020 sysmocom - s.f.m.c. GmbH
+ * Author: Alexander Couzens <lynxis@fe80.eu>
+ *
+ * All Rights Reserved
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 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 General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#pragma once
+
+#include <osmocom/core/linuxlist.h>
+#include <osmocom/core/timer.h>
+#include <osmocom/core/utils.h>
+
+#include <stdint.h>
+
+struct osmo_tdef;
+struct msgb;
+struct vty;
+
+enum osmo_fr_role {
+ FR_ROLE_USER_EQUIPMENT,
+ FR_ROLE_NETWORK_EQUIPMENT,
+};
+
+/* 48.016 ยง 6.1.4.2 default maximum information field size of 1600 octets */
+#define FRAME_RELAY_MTU 1600
+/* FR DLC header is 2 byte */
+#define FRAME_RELAY_SDU (FRAME_RELAY_MTU - 2)
+
+extern const struct value_string osmo_fr_role_names[];
+
+static inline const char *osmo_fr_role_str(enum osmo_fr_role role)
+{
+ return get_value_string(osmo_fr_role_names, role);
+}
+
+struct osmo_fr_network {
+ struct llist_head links;
+
+ unsigned int n391; /* full status polling counter */
+ unsigned int n392; /* error threshold */
+ unsigned int n393; /* monitored events count */
+
+ struct osmo_tdef *T_defs; /* T391, T392 */
+};
+
+struct osmo_fr_dlc;
+
+/* Frame Relay Link */
+struct osmo_fr_link {
+ /* list in osmo_fr_network.links */
+ struct llist_head list;
+ struct osmo_fr_network *net;
+ enum osmo_fr_role role;
+ /* human-readable name */
+ const char *name;
+
+ /* value of the last received send sequence number field in the
+ * link integrity verification information element */
+ uint8_t last_rx_seq;
+
+ /* value of the send sequence number field of the last link
+ * integrity verification information element sent */
+ uint8_t last_tx_seq;
+
+ struct osmo_timer_list t391;
+ struct osmo_timer_list t392;
+
+ unsigned int polling_count;
+ unsigned int err_count;
+ unsigned int succeed;
+ /* the type of the last status enquiry */
+ uint8_t expected_rep;
+ bool state;
+
+ /* list of data link connections at this link */
+ struct llist_head dlc_list;
+
+ /* optional call-back to be called for each PDU received on an unknown DLC */
+ int (*unknown_dlc_rx_cb)(void *cb_data, struct msgb *msg);
+ void *unknown_dlc_rx_cb_data;
+
+ /* call-back to be called for transmitting on the underlying hardware */
+ int (*tx_cb)(void *data, struct msgb *msg);
+ /* optional call-back to be called each time the status changes active/inactive */
+ void (*status_cb)(struct osmo_fr_link *link, void *cb_data, bool active);
+ void *cb_data;
+};
+
+/* Frame Relay Data Link Connection */
+struct osmo_fr_dlc {
+ /* entry in fr_link.dlc_list */
+ struct llist_head list;
+ struct osmo_fr_link *link;
+
+ uint16_t dlci;
+
+ /* is this DLC marked active for traffic? */
+ bool active;
+ /* was this DLC newly added? */
+ bool add;
+ /* is this DLC about to be destroyed */
+ bool del;
+
+ /* The local state needs to be transferred to the USER;
+ * NET must wait until USER confirms it implicitly by a seq number check */
+ bool state_send;
+
+ /* call-back to be called for each PDU received on this DLC */
+ int (*rx_cb)(void *cb_data, struct msgb *msg);
+ /* optional call-back to be called each time the status changes active/inactive */
+ void (*status_cb)(struct osmo_fr_dlc *dlc, void *cb_data, bool active);
+ void *cb_data;
+};
+
+/* allocate a frame relay network */
+struct osmo_fr_network *osmo_fr_network_alloc(void *ctx);
+void osmo_fr_network_free(struct osmo_fr_network *net);
+void osmo_fr_network_dump_vty(struct vty *vty, const struct osmo_fr_network *net);
+
+/* allocate a frame relay link in a given network */
+struct osmo_fr_link *osmo_fr_link_alloc(struct osmo_fr_network *net, enum osmo_fr_role role, const char *name);
+
+/* free a frame link in a given network */
+void osmo_fr_link_free(struct osmo_fr_link *link);
+
+/* allocate a data link connectoin on a given framerelay link */
+struct osmo_fr_dlc *osmo_fr_dlc_alloc(struct osmo_fr_link *link, uint16_t dlci);
+void osmo_fr_dlc_free(struct osmo_fr_dlc *dlc);
+
+struct osmo_fr_dlc *osmo_fr_dlc_by_dlci(struct osmo_fr_link *link, uint16_t dlci);
+
+int osmo_fr_rx(struct msgb *msg);
+int osmo_fr_tx_dlc(struct msgb *msg);
diff --git a/include/osmocom/gb/gprs_bssgp.h b/include/osmocom/gb/gprs_bssgp.h
new file mode 100644
index 0000000..4bdf33b
--- /dev/null
+++ b/include/osmocom/gb/gprs_bssgp.h
@@ -0,0 +1,246 @@
+/*! \file gprs_bssgp.h */
+
+#pragma once
+
+#include <stdint.h>
+#include <osmocom/core/timer.h>
+#include <osmocom/core/linuxlist.h>
+
+#include <osmocom/gsm/gsm48.h>
+#include <osmocom/gsm/prim.h>
+
+#include <osmocom/gb/protocol/gsm_08_18.h>
+#include <osmocom/gb/protocol/gsm_24_301.h>
+#include <osmocom/gb/gprs_bssgp_rim.h>
+
+/* gprs_bssgp_util.c */
+
+#define BSSGP_PDUF_UL 0x0001 /* PDU may occur in uplink */
+#define BSSGP_PDUF_DL 0x0002 /* PDU may occur in downlink */
+#define BSSGP_PDUF_SIG 0x0004 /* PDU may occur on Signaling BVC */
+#define BSSGP_PDUF_PTP 0x0008 /* PDU may occur on PTP BVC */
+#define BSSGP_PDUF_PTM 0x0010 /* PDU may occur on PTM BVC */
+
+extern const struct osmo_tlv_prot_def osmo_pdef_bssgp;
+
+/*! return the PDU type flags (UL/DL/SIG/PTP/PTM) of specified PDU type */
+static inline uint32_t bssgp_pdu_type_flags(uint8_t pdu_type)
+{
+ return osmo_tlv_prot_msgt_flags(&osmo_pdef_bssgp, pdu_type);
+}
+
+typedef int (*bssgp_bvc_send)(void *ctx, struct msgb *msg);
+extern struct gprs_ns_inst *bssgp_nsi;
+void bssgp_set_bssgp_callback(bssgp_bvc_send ns_send, void *data);
+struct msgb *bssgp_msgb_alloc(void);
+struct msgb *bssgp_msgb_copy(const struct msgb *msg, const char *name);
+const char *bssgp_cause_str(enum gprs_bssgp_cause cause);
+const char *bssgp_pdu_str(enum bssgp_pdu_type pdu);
+int bssgp_tx_bvc_reset_nsei_bvci(uint16_t nsei, uint16_t bvci, enum gprs_bssgp_cause cause, const struct gprs_ra_id *ra_id, uint16_t cell_id);
+/* Transmit a simple response such as BLOCK/UNBLOCK/RESET ACK/NACK */
+int bssgp_tx_simple_bvci(uint8_t pdu_type, uint16_t nsei,
+ uint16_t bvci, uint16_t ns_bvci);
+/* Chapter 10.4.14: Status */
+int bssgp_tx_status(uint8_t cause, uint16_t *bvci, struct msgb *orig_msg);
+
+enum bssgp_prim {
+ PRIM_BSSGP_DL_UD,
+ PRIM_BSSGP_UL_UD,
+ PRIM_BSSGP_PTM_UD,
+
+ PRIM_BSSGP_GMM_SUSPEND,
+ PRIM_BSSGP_GMM_RESUME,
+ PRIM_BSSGP_GMM_PAGING,
+
+ PRIM_NM_FLUSH_LL,
+ PRIM_NM_LLC_DISCARDED,
+ PRIM_NM_BVC_RESET,
+ PRIM_NM_BVC_BLOCK,
+ PRIM_NM_BVC_UNBLOCK,
+ PRIM_NM_STATUS,
+
+ PRIM_BSSGP_RIM_PDU_TRANSFER,
+};
+
+struct osmo_bssgp_prim {
+ struct osmo_prim_hdr oph;
+
+ /* common fields */
+ uint16_t nsei;
+ uint16_t bvci;
+ uint32_t tlli;
+ struct tlv_parsed *tp;
+ struct gprs_ra_id *ra_id;
+
+ /* specific fields */
+ union {
+ struct {
+ uint8_t suspend_ref;
+ } resume;
+ struct bssgp_ran_information_pdu rim_pdu;
+ } u;
+};
+
+/* gprs_bssgp.c */
+
+/*! BSSGP flow control (SGSN side) According to Section 8.2 */
+struct bssgp_flow_control {
+ uint32_t bucket_size_max; /*!< maximum size of the bucket (octets) */
+ uint32_t bucket_leak_rate; /*!< leak rate of the bucket (octets/sec) */
+
+ uint32_t bucket_counter; /*!< number of tokens in the bucket */
+ struct timeval time_last_pdu; /*!< timestamp of last PDU sent */
+
+ /* the built-in queue */
+ uint32_t max_queue_depth; /*!< how many packets to queue (mgs) */
+ uint32_t queue_depth; /*!< current length of queue (msgs) */
+ struct llist_head queue; /*!< linked list of msgb's */
+ struct osmo_timer_list timer; /*!< timer-based dequeueing */
+
+ /*! callback to be called at output of flow control */
+ int (*out_cb)(struct bssgp_flow_control *fc, struct msgb *msg,
+ uint32_t llc_pdu_len, void *priv);
+};
+
+#define BVC_S_BLOCKED 0x0001
+
+/* The per-BTS context that we keep on the SGSN side of the BSSGP link */
+struct bssgp_bvc_ctx {
+ struct llist_head list;
+
+ struct gprs_ra_id ra_id; /*!< parsed RA ID of the remote BTS */
+ uint16_t cell_id; /*!< Cell ID of the remote BTS */
+
+ /* NSEI and BVCI of underlying Gb link. Together they
+ * uniquely identify a link to a BTS (5.4.4) */
+ uint16_t bvci;
+ uint16_t nsei;
+
+ uint32_t state;
+
+ struct rate_ctr_group *ctrg;
+
+ struct bssgp_flow_control *fc;
+ /*! default maximum size of per-MS bucket in octets */
+ uint32_t bmax_default_ms;
+ /*! default bucket leak rate of per-MS bucket in octests/s */
+ uint32_t r_default_ms;
+
+ /*! BSS or SGSN. This defines the local state. */
+ bool is_sgsn;
+ /* we might want to add this as a shortcut later, avoiding the NSVC
+ * lookup for every packet, similar to a routing cache */
+ //struct gprs_nsvc *nsvc;
+};
+extern struct llist_head bssgp_bvc_ctxts;
+/* Create a BTS Context with BVCI+NSEI */
+struct bssgp_bvc_ctx *btsctx_alloc(uint16_t bvci, uint16_t nsei);
+/* Find a BTS Context based on parsed RA ID and Cell ID */
+struct bssgp_bvc_ctx *btsctx_by_raid_cid(const struct gprs_ra_id *raid, uint16_t cid);
+/* Find a BTS context based on BVCI+NSEI tuple */
+struct bssgp_bvc_ctx *btsctx_by_bvci_nsei(uint16_t bvci, uint16_t nsei);
+/* Free a given BTS context */
+void bssgp_bvc_ctx_free(struct bssgp_bvc_ctx *ctx);
+
+#define BVC_F_BLOCKED 0x0001
+
+enum bssgp_ctr {
+ BSSGP_CTR_PKTS_IN,
+ BSSGP_CTR_PKTS_OUT,
+ BSSGP_CTR_BYTES_IN,
+ BSSGP_CTR_BYTES_OUT,
+ BSSGP_CTR_BLOCKED,
+ BSSGP_CTR_DISCARDED,
+ BSSGP_CTR_STATUS,
+};
+
+
+#include <osmocom/gsm/tlv.h>
+#include <osmocom/gb/gprs_msgb.h>
+
+/* BSSGP-UL-UNITDATA.ind */
+int bssgp_rcvmsg(struct msgb *msg);
+
+/* BSSGP-DL-UNITDATA.req */
+struct bssgp_lv {
+ uint16_t len;
+ uint8_t *v;
+};
+/* parameters for BSSGP downlink userdata transmission */
+struct bssgp_dl_ud_par {
+ uint32_t *tlli;
+ char *imsi;
+ struct bssgp_flow_control *fc;
+ uint16_t drx_parms;
+ /* FIXME: priority */
+ struct bssgp_lv ms_ra_cap;
+ uint8_t qos_profile[3];
+};
+int bssgp_tx_dl_ud(struct msgb *msg, uint16_t pdu_lifetime,
+ struct bssgp_dl_ud_par *dup);
+
+uint16_t bssgp_parse_cell_id(struct gprs_ra_id *raid, const uint8_t *buf);
+int bssgp_create_cell_id(uint8_t *buf, const struct gprs_ra_id *raid,
+ uint16_t cid);
+
+/* Wrapper around TLV parser to parse BSSGP IEs */
+static inline int bssgp_tlv_parse(struct tlv_parsed *tp, const uint8_t *buf, int len)
+{
+ return tlv_parse(tp, &tvlv_att_def, buf, len, 0, 0);
+}
+
+/*! BSSGP Paging mode */
+enum bssgp_paging_mode {
+ BSSGP_PAGING_PS,
+ BSSGP_PAGING_CS,
+};
+
+/*! BSSGP Paging scope */
+enum bssgp_paging_scope {
+ BSSGP_PAGING_BSS_AREA, /*!< all cells in BSS */
+ BSSGP_PAGING_LOCATION_AREA, /*!< all cells in LA */
+ BSSGP_PAGING_ROUTEING_AREA, /*!< all cells in RA */
+ BSSGP_PAGING_BVCI, /*!< one cell */
+};
+
+/*! BSSGP paging information */
+struct bssgp_paging_info {
+ enum bssgp_paging_mode mode; /*!< CS or PS paging */
+ enum bssgp_paging_scope scope; /*!< bssgp_paging_scope */
+ struct gprs_ra_id raid; /*!< RA Identifier */
+ uint16_t bvci; /*!< BVCI */
+ char *imsi; /*!< IMSI, if any */
+ uint32_t *ptmsi; /*!< P-TMSI, if any */
+ uint16_t drx_params; /*!< DRX parameters */
+ uint8_t qos[3]; /*!< QoS parameters */
+};
+
+/* Send a single GMM-PAGING.req to a given NSEI/NS-BVCI */
+int bssgp_tx_paging(uint16_t nsei, uint16_t ns_bvci,
+ struct bssgp_paging_info *pinfo);
+
+void bssgp_fc_init(struct bssgp_flow_control *fc,
+ uint32_t bucket_size_max, uint32_t bucket_leak_rate,
+ uint32_t max_queue_depth,
+ int (*out_cb)(struct bssgp_flow_control *fc, struct msgb *msg,
+ uint32_t llc_pdu_len, void *priv));
+
+/* input function of the flow control implementation, called first
+ * for the MM flow control, and then as the MM flow control output
+ * callback in order to perform BVC flow control */
+int bssgp_fc_in(struct bssgp_flow_control *fc, struct msgb *msg,
+ uint32_t llc_pdu_len, void *priv);
+
+/* Initialize the Flow Control parameters for a new MS according to
+ * default values for the BVC specified by BVCI and NSEI */
+int bssgp_fc_ms_init(struct bssgp_flow_control *fc_ms, uint16_t bvci,
+ uint16_t nsei, uint32_t max_queue_depth);
+
+void bssgp_flush_all_queues(void);
+void bssgp_fc_flush_queue(struct bssgp_flow_control *fc);
+
+/* gprs_bssgp_vty.c */
+int bssgp_vty_init(void);
+void bssgp_set_log_ss(int ss) OSMO_DEPRECATED("Use DLBSSGP instead!\n");
+
+int bssgp_prim_cb(struct osmo_prim_hdr *oph, void *ctx);
diff --git a/include/osmocom/gb/gprs_bssgp2.h b/include/osmocom/gb/gprs_bssgp2.h
new file mode 100644
index 0000000..349775a
--- /dev/null
+++ b/include/osmocom/gb/gprs_bssgp2.h
@@ -0,0 +1,72 @@
+#pragma once
+#include <stdint.h>
+
+#include <osmocom/gb/protocol/gsm_08_18.h>
+#include <osmocom/gb/gprs_ns2.h>
+
+struct bssgp2_flow_ctrl;
+struct gprs_ns2_inst;
+struct gprs_ra_id;
+struct msgb;
+
+struct bssgp2_flow_ctrl {
+ uint8_t tag;
+ /* maximum bucket size (Bmax) in bytes */
+ uint64_t bucket_size_max;
+ /*! bucket leak rate in _bytes_ per second */
+ uint64_t bucket_leak_rate;
+ /* percentage how full the given bucket is */
+ uint8_t bucket_full_ratio;
+ bool bucket_full_ratio_present;
+ union {
+ /*! FC-BVC specifi members */
+ struct {
+ /*! default maximum bucket size per MS in bytes */
+ uint64_t bmax_default_ms;
+ /*! default bucket leak rate (R) for MS flow control bucket */
+ uint64_t r_default_ms;
+
+ /*! average milliseconds of queueing delay for a BVC */
+ uint32_t measurement;
+ bool measurement_present;
+ } bvc;
+ /*! FC-MS specifi members */
+ struct {
+ /*! TLLI of the MS */
+ uint32_t tlli;
+ } ms;
+ } u;
+};
+
+
+int bssgp2_nsi_tx_ptp(struct gprs_ns2_inst *nsi, uint16_t nsei, uint16_t bvci,
+ struct msgb *msg, uint32_t lsp);
+
+int bssgp2_nsi_tx_sig(struct gprs_ns2_inst *nsi, uint16_t nsei, struct msgb *msg, uint32_t lsp);
+
+struct msgb *bssgp2_enc_bvc_block(uint16_t bvci, enum gprs_bssgp_cause cause);
+
+struct msgb *bssgp2_enc_bvc_block_ack(uint16_t bvci);
+
+struct msgb *bssgp2_enc_bvc_unblock(uint16_t bvci);
+
+struct msgb *bssgp2_enc_bvc_unblock_ack(uint16_t bvci);
+
+struct msgb *bssgp2_enc_bvc_reset(uint16_t bvci, enum gprs_bssgp_cause cause,
+ const struct gprs_ra_id *ra_id, uint16_t cell_id,
+ const uint8_t *feat_bm, const uint8_t *ext_feat_bm);
+
+struct msgb *bssgp2_enc_bvc_reset_ack(uint16_t bvci, const struct gprs_ra_id *ra_id, uint16_t cell_id,
+ const uint8_t *feat_bm, const uint8_t *ext_feat_bm);
+
+struct msgb *bssgp2_enc_flush_ll(uint32_t tlli, uint16_t old_bvci,
+ const uint16_t *new_bvci, const uint16_t *nsei);
+struct msgb *bssgp2_enc_status(uint8_t cause, const uint16_t *bvci, const struct msgb *orig_msg, uint16_t max_pdu_len);
+
+
+int bssgp2_dec_fc_bvc(struct bssgp2_flow_ctrl *fc, const struct tlv_parsed *tp);
+struct msgb *bssgp2_enc_fc_bvc(const struct bssgp2_flow_ctrl *fc, enum bssgp_fc_granularity *gran);
+struct msgb *bssgp2_enc_fc_bvc_ack(uint8_t tag);
+int bssgp2_dec_fc_ms(struct bssgp2_flow_ctrl *fc, struct tlv_parsed *tp);
+struct msgb *bssgp2_enc_fc_ms(const struct bssgp2_flow_ctrl *fc, enum bssgp_fc_granularity *gran);
+struct msgb *bssgp2_enc_fc_ms_ack(uint32_t tlli, uint8_t tag);
diff --git a/include/osmocom/gb/gprs_bssgp_bss.h b/include/osmocom/gb/gprs_bssgp_bss.h
new file mode 100644
index 0000000..946a033
--- /dev/null
+++ b/include/osmocom/gb/gprs_bssgp_bss.h
@@ -0,0 +1,75 @@
+/*! \file gprs_bssgp_bss.h
+ * GPRS BSSGP protocol implementation as per 3GPP TS 08.18 */
+/*
+ * (C) 2009-2012 by Harald Welte <laforge@gnumonks.org>
+ *
+ * All Rights Reserved
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 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 General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#pragma once
+
+#include <osmocom/core/msgb.h>
+#include <osmocom/gb/gprs_bssgp.h>
+
+uint8_t *bssgp_msgb_tlli_put(struct msgb *msg, uint32_t tlli);
+uint8_t *bssgp_msgb_ra_put(struct msgb *msg, const struct gprs_ra_id *ra_id);
+int bssgp_tx_bvc_ptp_reset(uint16_t nsei, enum gprs_bssgp_cause cause);
+int bssgp_tx_suspend(uint16_t nsei, uint32_t tlli,
+ const struct gprs_ra_id *ra_id);
+
+int bssgp_tx_resume(uint16_t nsei, uint32_t tlli,
+ const struct gprs_ra_id *ra_id, uint8_t suspend_ref);
+
+int bssgp_tx_ra_capa_upd(struct bssgp_bvc_ctx *bctx, uint32_t tlli, uint8_t tag);
+
+int bssgp_tx_radio_status_tlli(struct bssgp_bvc_ctx *bctx, uint8_t cause,
+ uint32_t tlli);
+
+int bssgp_tx_radio_status_tmsi(struct bssgp_bvc_ctx *bctx, uint8_t cause,
+ uint32_t tmsi);
+
+int bssgp_tx_radio_status_imsi(struct bssgp_bvc_ctx *bctx, uint8_t cause,
+ const char *imsi);
+
+int bssgp_tx_flush_ll_ack(struct bssgp_bvc_ctx *bctx, uint32_t tlli,
+ uint8_t action, uint16_t bvci_new,
+ uint32_t num_octets);
+
+int bssgp_tx_llc_discarded(struct bssgp_bvc_ctx *bctx, uint32_t tlli,
+ uint8_t num_frames, uint32_t num_octets);
+
+int bssgp_tx_bvc_block(struct bssgp_bvc_ctx *bctx, uint8_t cause);
+
+int bssgp_tx_bvc_unblock(struct bssgp_bvc_ctx *bctx);
+
+int bssgp_tx_bvc_reset(struct bssgp_bvc_ctx *bctx, uint16_t bvci, uint8_t cause);
+int bssgp_tx_bvc_reset2(struct bssgp_bvc_ctx *bctx, uint16_t bvci, uint8_t cause, bool add_cell_id);
+
+int bssgp_tx_ul_ud(struct bssgp_bvc_ctx *bctx, uint32_t tlli,
+ const uint8_t *qos_profile, struct msgb *llc_pdu);
+
+int bssgp_rx_paging(struct bssgp_paging_info *pinfo,
+ struct msgb *msg);
+
+int bssgp_tx_fc_bvc(struct bssgp_bvc_ctx *bctx, uint8_t tag,
+ uint32_t bucket_size, uint32_t bucket_leak_rate,
+ uint32_t bmax_default_ms, uint32_t r_default_ms,
+ uint8_t *bucket_full_ratio, uint32_t *queue_delay_ms);
+
+int bssgp_tx_fc_ms(struct bssgp_bvc_ctx *bctx, uint32_t tlli, uint8_t tag,
+ uint32_t ms_bucket_size, uint32_t bucket_leak_rate,
+ uint8_t *bucket_full_ratio);
diff --git a/include/osmocom/gb/gprs_bssgp_rim.h b/include/osmocom/gb/gprs_bssgp_rim.h
new file mode 100644
index 0000000..6392f99
--- /dev/null
+++ b/include/osmocom/gb/gprs_bssgp_rim.h
@@ -0,0 +1,272 @@
+/*! \file gprs_bssgp.h
+ * GPRS BSSGP RIM protocol implementation as per 3GPP TS 48.018. */
+/*
+ * (C) 2020-2021 by sysmocom - s.f.m.c. GmbH
+ * Author: Philipp Maier <pmaier@sysmocom.de>
+ *
+ * All Rights Reserved
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 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 General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#pragma once
+
+#include <osmocom/gsm/gsm48.h>
+#include <osmocom/gb/protocol/gsm_08_18.h>
+#include <osmocom/gb/protocol/gsm_24_301.h>
+
+enum bssgp_rim_routing_info_discr {
+ BSSGP_RIM_ROUTING_INFO_GERAN,
+ BSSGP_RIM_ROUTING_INFO_UTRAN,
+ BSSGP_RIM_ROUTING_INFO_EUTRAN,
+};
+
+extern const struct value_string bssgp_rim_routing_info_discr_strs[];
+
+/*! Obtain a human-readable string for NACC Cause code */
+static inline const char *bssgp_rim_routing_info_discr_str(enum bssgp_rim_routing_info_discr val)
+{ return get_value_string(bssgp_rim_routing_info_discr_strs, val); }
+
+/*! BSSGP RIM Routing information, see also 3GPP TS 48.018, section 11.3.70 */
+struct bssgp_rim_routing_info {
+ enum bssgp_rim_routing_info_discr discr;
+ union {
+ struct {
+ struct gprs_ra_id raid;
+ uint16_t cid;
+ } geran;
+ struct {
+ struct gprs_ra_id raid;
+ uint16_t rncid;
+ } utran;
+ struct {
+ struct osmo_eutran_tai tai;
+ /* See also 3GPP TS 36.413 9.2.1.37 and 3GPP TS 36.401 */
+ uint8_t global_enb_id[8];
+ uint8_t global_enb_id_len;
+ } eutran;
+ };
+};
+
+/* The encoded result of the rim routing information is, depending on the
+ * address type (discr) of variable length. */
+#define BSSGP_RIM_ROUTING_INFO_MAXLEN 14
+
+char *bssgp_rim_ri_name_buf(char *buf, size_t buf_len, const struct bssgp_rim_routing_info *ri);
+const char *bssgp_rim_ri_name(const struct bssgp_rim_routing_info *ri);
+int bssgp_parse_rim_ri(struct bssgp_rim_routing_info *ri, const uint8_t *buf, unsigned int len);
+int bssgp_create_rim_ri(uint8_t *buf, const struct bssgp_rim_routing_info *ri);
+
+/* 3GPP TS 48.018, table 11.3.63.1.1: RAN-INFORMATION-REQUEST Application Container coding for NACC */
+struct bssgp_ran_inf_req_app_cont_nacc {
+ struct osmo_cell_global_id_ps reprt_cell;
+};
+
+int bssgp_dec_ran_inf_req_app_cont_nacc(struct bssgp_ran_inf_req_app_cont_nacc *cont, const uint8_t *buf, size_t len);
+int bssgp_enc_ran_inf_req_app_cont_nacc(uint8_t *buf, size_t len, const struct bssgp_ran_inf_req_app_cont_nacc *cont);
+
+/* Length of NACC system information, see also: 3GPP TS 48.018 11.3.63.2.1 */
+#define BSSGP_RIM_SI_LEN 21
+#define BSSGP_RIM_PSI_LEN 22
+
+/* 3GPP TS 48.018, table 11.3.63.2.1.a: RAN-INFORMATION Application Container coding for NACC */
+struct bssgp_ran_inf_app_cont_nacc {
+ struct osmo_cell_global_id_ps reprt_cell;
+ bool type_psi;
+ uint8_t num_si;
+
+ /* Pointer to system information messages */
+ const uint8_t *si[127];
+};
+
+int bssgp_dec_ran_inf_app_cont_nacc(struct bssgp_ran_inf_app_cont_nacc *cont, const uint8_t *buf, size_t len);
+int bssgp_enc_ran_inf_app_cont_nacc(uint8_t *buf, size_t len, const struct bssgp_ran_inf_app_cont_nacc *cont);
+
+/* 3GPP TS 48.018, table 11.3.64.1.b, NACC Cause coding */
+enum bssgp_nacc_cause {
+ BSSGP_NACC_CAUSE_UNSPEC,
+ BSSGP_NACC_CAUSE_SYNTAX_ERR,
+ BSSGP_NACC_CAUSE_RPRT_CELL_MISSMTCH,
+ BSSGP_NACC_CAUSE_SIPSI_TYPE_ERR,
+ BSSGP_NACC_CAUSE_SIPSI_LEN_ERR,
+ BSSGP_NACC_CAUSE_SIPSI_SET_ERR,
+};
+
+extern const struct value_string bssgp_nacc_cause_strs[];
+
+/*! Obtain a human-readable string for NACC Cause code */
+static inline const char *bssgp_nacc_cause_str(enum bssgp_nacc_cause val)
+{ return get_value_string(bssgp_nacc_cause_strs, val); }
+
+/* 3GPP TS 48.018, table 11.3.64.1.a, Application Error Container coding for NACC */
+struct bssgp_app_err_cont_nacc {
+ enum bssgp_nacc_cause nacc_cause;
+
+ /* Pointer to errornous application container */
+ const uint8_t *err_app_cont;
+ size_t err_app_cont_len;
+};
+
+int bssgp_dec_app_err_cont_nacc(struct bssgp_app_err_cont_nacc *cont, const uint8_t *buf, size_t len);
+int bssgp_enc_app_err_cont_nacc(uint8_t *buf, size_t len, const struct bssgp_app_err_cont_nacc *cont);
+
+/* 3GPP TS 48.018, table 11.3.61.b: RIM Application Identity coding */
+enum bssgp_ran_inf_app_id {
+ BSSGP_RAN_INF_APP_ID_NACC = 1,
+ BSSGP_RAN_INF_APP_ID_SI3 = 2,
+ BSSGP_RAN_INF_APP_ID_MBMS = 3,
+ BSSGP_RAN_INF_APP_ID_SON = 4,
+ BSSGP_RAN_INF_APP_ID_UTRA_SI = 5,
+};
+
+extern const struct value_string bssgp_ran_inf_app_id_strs[];
+
+/*! Obtain a human-readable string for RIM Application Identity code */
+static inline const char *bssgp_ran_inf_app_id_str(enum bssgp_ran_inf_app_id val)
+{ return get_value_string(bssgp_ran_inf_app_id_strs, val); }
+
+/* 3GPP TS 48.018, table 11.3.62a.1.b: RAN-INFORMATION-REQUEST RIM Container Contents */
+struct bssgp_ran_inf_req_rim_cont {
+ enum bssgp_ran_inf_app_id app_id;
+ uint32_t seq_num;
+ struct bssgp_rim_pdu_ind pdu_ind;
+ uint8_t prot_ver;
+
+ /* Nested application container */
+ union {
+ struct bssgp_ran_inf_req_app_cont_nacc app_cont_nacc;
+ /* TODO: add containers for Si3, MBMS, SON, UTRA-SI */
+ } u;
+
+ /* Pointer to SON-transfer application identity, only present if app_id is indicating "son-transfer",
+ * see also 3GPP TS 48.018, section 11.3.108 and 3GPP TS 36.413 annex B.1.1 */
+ const uint8_t *son_trans_app_id;
+ size_t son_trans_app_id_len;
+};
+
+int bssgp_dec_ran_inf_req_rim_cont(struct bssgp_ran_inf_req_rim_cont *cont, const uint8_t *buf, size_t len);
+int bssgp_enc_ran_inf_req_rim_cont(uint8_t *buf, size_t len, const struct bssgp_ran_inf_req_rim_cont *cont);
+
+/* 3GPP TS 48.018, table 11.3.62a.2.b: RAN-INFORMATION RIM Container Contents */
+struct bssgp_ran_inf_rim_cont {
+ enum bssgp_ran_inf_app_id app_id;
+ uint32_t seq_num;
+ struct bssgp_rim_pdu_ind pdu_ind;
+ uint8_t prot_ver;
+ bool app_err;
+
+ /* Nested application container */
+ union {
+ struct bssgp_ran_inf_app_cont_nacc app_cont_nacc;
+ struct bssgp_app_err_cont_nacc app_err_cont_nacc;
+ /* TODO: add containers for Si3, MBMS, SON, UTRA-SI */
+ } u;
+
+ /* Pointer to SON-transfer application identity, only present if app_id is indicating "son-transfer",
+ * see also 3GPP TS 48.018, section 11.3.108 and 3GPP TS 36.413 annex B.1.1 */
+ const uint8_t *son_trans_app_id;
+ size_t son_trans_app_id_len;
+};
+
+int bssgp_dec_ran_inf_rim_cont(struct bssgp_ran_inf_rim_cont *cont, const uint8_t *buf, size_t len);
+int bssgp_enc_ran_inf_rim_cont(uint8_t *buf, size_t len, const struct bssgp_ran_inf_rim_cont *cont);
+
+/* 3GPP TS 48.018, table 11.3.62a.3.b: RAN-INFORMATION-ACK RIM Container Contents */
+struct bssgp_ran_inf_ack_rim_cont {
+ enum bssgp_ran_inf_app_id app_id;
+ uint32_t seq_num;
+ uint8_t prot_ver;
+
+ /* Pointer to SON-transfer application identity, only present if app_id is indicating "son-transfer",
+ * see also 3GPP TS 48.018, section 11.3.108 and 3GPP TS 36.413 annex B.1.1 */
+ const uint8_t *son_trans_app_id;
+ size_t son_trans_app_id_len;
+};
+
+int bssgp_dec_ran_inf_ack_rim_cont(struct bssgp_ran_inf_ack_rim_cont *cont, const uint8_t *buf, size_t len);
+int bssgp_enc_ran_inf_ack_rim_cont(uint8_t *buf, size_t len, const struct bssgp_ran_inf_ack_rim_cont *cont);
+
+/* 3GPP TS 48.018, table 11.3.62a.4.b: RAN-INFORMATION-ERROR RIM Container Contents */
+struct bssgp_ran_inf_err_rim_cont {
+ enum bssgp_ran_inf_app_id app_id;
+ uint8_t cause;
+ uint8_t prot_ver;
+
+ /* Pointer to (encoded) errornous PDU,
+ * see also: 3GPP TS 48.018, section 11.3.24 */
+ const uint8_t *err_pdu;
+ size_t err_pdu_len;
+
+ /* Pointer to SON-transfer application identity, only present if app_id is indicating "son-transfer",
+ * see also 3GPP TS 48.018, section 11.3.108 and 3GPP TS 36.413 annex B.1.1 */
+ const uint8_t *son_trans_app_id;
+ size_t son_trans_app_id_len;
+};
+
+int bssgp_dec_ran_inf_err_rim_cont(struct bssgp_ran_inf_err_rim_cont *cont, const uint8_t *buf, size_t len);
+int bssgp_enc_ran_inf_err_rim_cont(uint8_t *buf, size_t len, const struct bssgp_ran_inf_err_rim_cont *cont);
+
+/* 3GPP TS 48.018, table 11.3.62a.5.b: RAN-INFORMATION-APPLICATION-ERROR RIM Container Contents */
+struct bssgp_ran_inf_app_err_rim_cont {
+ enum bssgp_ran_inf_app_id app_id;
+ uint32_t seq_num;
+ struct bssgp_rim_pdu_ind pdu_ind;
+ uint8_t prot_ver;
+
+ /* Nested application container */
+ union {
+ struct bssgp_app_err_cont_nacc app_err_cont_nacc;
+ /* TODO: add containers for Si3, MBMS, SON, UTRA-SI */
+ } u;
+};
+
+int bssgp_dec_ran_inf_app_err_rim_cont(struct bssgp_ran_inf_app_err_rim_cont *cont, const uint8_t *buf, size_t len);
+int bssgp_enc_ran_inf_app_err_rim_cont(uint8_t *buf, size_t len, const struct bssgp_ran_inf_app_err_rim_cont *cont);
+
+/* Chapter 10.6.1: RAN-INFORMATION-REQUEST */
+struct bssgp_ran_information_pdu {
+ struct bssgp_rim_routing_info routing_info_dest;
+ struct bssgp_rim_routing_info routing_info_src;
+
+ /* Encoded variant of the RIM container */
+ uint8_t rim_cont_iei;
+ const uint8_t *rim_cont;
+ unsigned int rim_cont_len;
+
+ /* Decoded variant of the RIM container */
+ bool decoded_present;
+ union {
+ struct bssgp_ran_inf_req_rim_cont req_rim_cont;
+ struct bssgp_ran_inf_rim_cont rim_cont;
+ struct bssgp_ran_inf_ack_rim_cont ack_rim_cont;
+ struct bssgp_ran_inf_err_rim_cont err_rim_cont;
+ struct bssgp_ran_inf_app_err_rim_cont app_err_rim_cont;
+ } decoded;
+
+ /* When receiving a PDU from BSSGP the encoded variant of the RIM
+ * container will always be present. The decoded variant will be
+ * present in addition whenever BSSGP was able to decode the container.
+ *
+ * When sending a PDU to BSSGP, then the decoded variant is used when
+ * it is available. The encoded variant (if present) will be ignored
+ * then. */
+};
+
+int bssgp_parse_rim_pdu(struct bssgp_ran_information_pdu *pdu, const struct msgb *msg);
+struct msgb *bssgp_encode_rim_pdu(const struct bssgp_ran_information_pdu *pdu);
+
+int bssgp_tx_rim(const struct bssgp_ran_information_pdu *pdu, uint16_t nsei);
diff --git a/include/osmocom/gb/gprs_msgb.h b/include/osmocom/gb/gprs_msgb.h
new file mode 100644
index 0000000..3f48b5b
--- /dev/null
+++ b/include/osmocom/gb/gprs_msgb.h
@@ -0,0 +1,33 @@
+/*! \file gprs_msgb.h */
+
+#pragma once
+
+#include <stdint.h>
+/*! the data structure stored in msgb->cb for libgb apps */
+struct libgb_msgb_cb {
+ unsigned char *bssgph;
+ unsigned char *llch;
+
+ /*! Cell Identifier */
+ unsigned char *bssgp_cell_id;
+
+ /*! Identifiers of a BTS, equal to 'struct bssgp_bts_ctx' */
+ uint16_t nsei;
+ uint16_t bvci;
+
+ /*! Identifier of a MS (inside BTS), equal to 'struct sgsn_mm_ctx' */
+ uint32_t tlli;
+} __attribute__((packed, may_alias));
+#define LIBGB_MSGB_CB(__msgb) ((struct libgb_msgb_cb *)&((__msgb)->cb[0]))
+#define msgb_tlli(__x) LIBGB_MSGB_CB(__x)->tlli
+#define msgb_nsei(__x) LIBGB_MSGB_CB(__x)->nsei
+#define msgb_bvci(__x) LIBGB_MSGB_CB(__x)->bvci
+#define msgb_gmmh(__x) (__x)->l3h
+#define msgb_bssgph(__x) LIBGB_MSGB_CB(__x)->bssgph
+#define msgb_bssgp_len(__x) ((__x)->tail - (uint8_t *)msgb_bssgph(__x))
+#define msgb_bcid(__x) LIBGB_MSGB_CB(__x)->bssgp_cell_id
+#define msgb_llch(__x) LIBGB_MSGB_CB(__x)->llch
+
+#include <osmocom/core/logging.h>
+int gprs_log_filter_fn(const struct log_context *ctx,
+ struct log_target *tar);
diff --git a/include/osmocom/gb/gprs_ns.h b/include/osmocom/gb/gprs_ns.h
new file mode 100644
index 0000000..e3f73fc
--- /dev/null
+++ b/include/osmocom/gb/gprs_ns.h
@@ -0,0 +1,258 @@
+/*! \file gprs_ns.h */
+
+#pragma once
+
+#include <stdint.h>
+
+/* Our Implementation */
+#include <netinet/in.h>
+#include <osmocom/core/linuxlist.h>
+#include <osmocom/core/msgb.h>
+#include <osmocom/core/timer.h>
+#include <osmocom/core/select.h>
+#include <osmocom/gb/gprs_msgb.h>
+
+#include <osmocom/gb/protocol/gsm_08_16.h>
+
+#define NS_TIMERS_COUNT 8
+#define NS_TIMERS "(tns-block|tns-block-retries|tns-reset|tns-reset-retries|tns-test|tns-alive|tns-alive-retries|tsns-prov)"
+#define NS_TIMERS_HELP \
+ "(un)blocking Timer (Tns-block) timeout\n" \
+ "(un)blocking Timer (Tns-block) number of retries\n" \
+ "Reset Timer (Tns-reset) timeout\n" \
+ "Reset Timer (Tns-reset) number of retries\n" \
+ "Test Timer (Tns-test) timeout\n" \
+ "Alive Timer (Tns-alive) timeout\n" \
+ "Alive Timer (Tns-alive) number of retries\n" \
+ "SNS Provision Timer (Tsns-prov) timeout\n"
+
+/* Educated guess - LLC user payload is 1500 bytes plus possible headers */
+#define NS_ALLOC_SIZE 3072
+#define NS_ALLOC_HEADROOM 20
+
+enum ns_timeout {
+ NS_TOUT_TNS_BLOCK,
+ NS_TOUT_TNS_BLOCK_RETRIES,
+ NS_TOUT_TNS_RESET,
+ NS_TOUT_TNS_RESET_RETRIES,
+ NS_TOUT_TNS_TEST,
+ NS_TOUT_TNS_ALIVE,
+ NS_TOUT_TNS_ALIVE_RETRIES,
+ NS_TOUT_TSNS_PROV,
+};
+
+#define NSE_S_BLOCKED 0x0001
+#define NSE_S_ALIVE 0x0002
+#define NSE_S_RESET 0x0004
+
+#define NS_DESC_B(st) ((st) & NSE_S_BLOCKED ? "BLOCKED" : "UNBLOCKED")
+#define NS_DESC_A(st) ((st) & NSE_S_ALIVE ? "ALIVE" : "DEAD")
+#define NS_DESC_R(st) ((st) & NSE_S_RESET ? "RESET" : "UNRESET")
+
+/*! Osmocom NS link layer types */
+enum gprs_ns_ll {
+ GPRS_NS_LL_UDP, /*!< NS/UDP/IP */
+ GPRS_NS_LL_E1, /*!< NS/E1 */
+ GPRS_NS_LL_FR_GRE, /*!< NS/FR/GRE/IP */
+};
+
+/*! Osmoco NS events */
+enum gprs_ns_evt {
+ GPRS_NS_EVT_UNIT_DATA,
+};
+
+/*! Osmocom NS VC create status */
+enum gprs_ns_cs {
+ GPRS_NS_CS_CREATED, /*!< A NSVC object has been created */
+ GPRS_NS_CS_FOUND, /*!< A NSVC object has been found */
+ GPRS_NS_CS_REJECTED, /*!< Rejected and answered message */
+ GPRS_NS_CS_SKIPPED, /*!< Skipped message */
+ GPRS_NS_CS_ERROR, /*!< Failed to process message */
+};
+
+struct gprs_nsvc;
+/*! Osmocom GPRS callback function type */
+typedef int gprs_ns_cb_t(enum gprs_ns_evt event, struct gprs_nsvc *nsvc,
+ struct msgb *msg, uint16_t bvci);
+
+/*! An instance of the NS protocol stack */
+struct gprs_ns_inst {
+ /*! callback to the user for incoming UNIT DATA IND */
+ gprs_ns_cb_t *cb;
+
+ /*! linked lists of all NSVC in this instance */
+ struct llist_head gprs_nsvcs;
+
+ /*! a NSVC object that's needed to deal with packets for
+ * unknown NSVC */
+ struct gprs_nsvc *unknown_nsvc;
+
+ uint16_t timeout[NS_TIMERS_COUNT];
+
+ /*! NS-over-IP specific bits */
+ struct {
+ struct osmo_fd fd;
+ uint32_t local_ip;
+ uint16_t local_port;
+ uint32_t remote_ip;
+ uint16_t remote_port;
+ int dscp;
+ /*! IPA compatibility: NS-RESET/BLOCK/UNBLOCK even on IP-SNS */
+ bool use_reset_block_unblock;
+ } nsip;
+ /*! NS-over-FR-over-GRE-over-IP specific bits */
+ struct {
+ struct osmo_fd fd;
+ uint32_t local_ip;
+ unsigned int enabled:1;
+ } frgre;
+
+ struct osmo_fsm_inst *bss_sns_fi;
+};
+
+enum nsvc_timer_mode {
+ /* standard timers */
+ NSVC_TIMER_TNS_TEST,
+ NSVC_TIMER_TNS_ALIVE,
+ NSVC_TIMER_TNS_RESET,
+ _NSVC_TIMER_NR,
+};
+
+/*! Structure representing a single NS-VC */
+struct gprs_nsvc {
+ /*! list of NS-VCs within NS Instance */
+ struct llist_head list;
+ /*! pointer to NS Instance */
+ struct gprs_ns_inst *nsi;
+
+ uint16_t nsei; /*! end-to-end significance */
+ uint16_t nsvci; /*! uniquely identifies NS-VC at SGSN */
+
+ uint32_t state;
+ uint32_t remote_state;
+
+ struct osmo_timer_list timer;
+ enum nsvc_timer_mode timer_mode;
+ struct timeval timer_started;
+ int alive_retries;
+
+ unsigned int remote_end_is_sgsn:1;
+ unsigned int persistent:1;
+ unsigned int nsvci_is_valid:1;
+
+ struct rate_ctr_group *ctrg;
+ struct osmo_stat_item_group *statg;
+
+ /*! which link-layer are we based on? */
+ enum gprs_ns_ll ll;
+
+ /*! make sure to always keep bts_addr as first struct member to not break the assumption
+ that those structs are similar */
+ union {
+ struct {
+ struct sockaddr_in bts_addr;
+ } ip;
+ struct {
+ struct sockaddr_in bts_addr;
+ } frgre;
+ };
+ /*! signalling weight. 0 = don't use for signalling (BVCI == 0)*/
+ uint8_t sig_weight;
+ /*! signaling weight. 0 = don't use for user data (BVCI != 0) */
+ uint8_t data_weight;
+};
+
+/* Create a new NS protocol instance */
+struct gprs_ns_inst *gprs_ns_instantiate(gprs_ns_cb_t *cb, void *ctx);
+
+/* Close a NS protocol instance */
+void gprs_ns_close(struct gprs_ns_inst *nsi);
+
+/* Close and Destroy a NS protocol instance */
+void gprs_ns_destroy(struct gprs_ns_inst *nsi);
+
+/* Listen for incoming GPRS packets via NS/UDP */
+int gprs_ns_nsip_listen(struct gprs_ns_inst *nsi);
+
+/* Establish a connection (from the BSS) to the SGSN */
+struct gprs_nsvc *gprs_ns_nsip_connect(struct gprs_ns_inst *nsi,
+ struct sockaddr_in *dest,
+ uint16_t nsei, uint16_t nsvci);
+
+/* Establish a connection (from the BSS) to the SGSN using IP SNS */
+struct gprs_nsvc *gprs_ns_nsip_connect_sns(struct gprs_ns_inst *nsi, struct sockaddr_in *dest,
+ uint16_t nsei, uint16_t nsvci);
+
+struct sockaddr_in;
+
+/* main function for higher layers (BSSGP) to send NS messages */
+int gprs_ns_sendmsg(struct gprs_ns_inst *nsi, struct msgb *msg);
+
+/* Receive incoming NS message from underlying transport layer */
+int gprs_ns_rcvmsg(struct gprs_ns_inst *nsi, struct msgb *msg,
+ struct sockaddr_in *saddr, enum gprs_ns_ll ll);
+
+
+int gprs_ns_tx_alive(struct gprs_nsvc *nsvc);
+int gprs_ns_tx_alive_ack(struct gprs_nsvc *nsvc);
+int gprs_ns_tx_reset(struct gprs_nsvc *nsvc, uint8_t cause);
+int gprs_ns_tx_block(struct gprs_nsvc *nsvc, uint8_t cause);
+int gprs_ns_tx_unblock(struct gprs_nsvc *nsvc);
+
+/* Listen for incoming GPRS packets via NS/FR/GRE */
+int gprs_ns_frgre_listen(struct gprs_ns_inst *nsi);
+
+struct gprs_nsvc *gprs_nsvc_create2(struct gprs_ns_inst *nsi, uint16_t nsvci,
+ uint8_t sig_weight, uint8_t data_weight);
+void gprs_nsvc_delete(struct gprs_nsvc *nsvc);
+struct gprs_nsvc *gprs_nsvc_by_nsei(struct gprs_ns_inst *nsi, uint16_t nsei);
+struct gprs_nsvc *gprs_nsvc_by_nsvci(struct gprs_ns_inst *nsi, uint16_t nsvci);
+struct gprs_nsvc *gprs_nsvc_by_rem_addr(struct gprs_ns_inst *nsi, const struct sockaddr_in *sin);
+
+/* Initiate a RESET procedure (including timer start, ...)*/
+int gprs_nsvc_reset(struct gprs_nsvc *nsvc, uint8_t cause);
+
+/* Add NS-specific VTY stuff */
+int gprs_ns_vty_init(struct gprs_ns_inst *nsi);
+
+/* Resturn peer info as string (NOTE: the buffer is allocated statically) */
+const char *gprs_ns_ll_str(const struct gprs_nsvc *nsvc);
+/* Return peer info in user-supplied buffer */
+char *gprs_ns_ll_str_buf(char *buf, size_t buf_len, const struct gprs_nsvc *nsvc);
+char *gprs_ns_ll_str_c(const void *ctx, const struct gprs_nsvc *nsvc);
+
+/* Copy the link layer info from other into nsvc */
+void gprs_ns_ll_copy(struct gprs_nsvc *nsvc, struct gprs_nsvc *other);
+
+/* Clear the link layer info (will never match a real link then) */
+void gprs_ns_ll_clear(struct gprs_nsvc *nsvc);
+
+struct msgb *gprs_ns_msgb_alloc(void);
+
+enum signal_ns {
+ S_NS_RESET,
+ S_NS_BLOCK,
+ S_NS_UNBLOCK,
+ S_NS_ALIVE_EXP, /* Tns-alive expired more than N times */
+ S_NS_REPLACED, /* nsvc object is replaced (sets old_nsvc) */
+ S_NS_MISMATCH, /* got an unexpected IE (sets msg, pdu_type, ie_type) */
+ S_SNS_CONFIGURED, /* IP-SNS configuration completed */
+};
+
+extern const struct value_string gprs_ns_signal_ns_names[];
+const char *gprs_ns_cause_str(enum ns_cause cause);
+
+struct ns_signal_data {
+ struct gprs_nsvc *nsvc;
+ struct gprs_nsvc *old_nsvc;
+ uint8_t cause;
+ uint8_t pdu_type;
+ uint8_t ie_type;
+ struct msgb *msg;
+};
+
+void gprs_ns_set_log_ss(int ss);
+
+char *gprs_nsvc_state_append(char *s, struct gprs_nsvc *nsvc);
+
+/*! @} */
diff --git a/include/osmocom/gb/gprs_ns2.h b/include/osmocom/gb/gprs_ns2.h
new file mode 100644
index 0000000..07641d8
--- /dev/null
+++ b/include/osmocom/gb/gprs_ns2.h
@@ -0,0 +1,276 @@
+/*! \file gprs_ns2.h */
+
+
+#pragma once
+
+#include <stdint.h>
+#include <netinet/in.h>
+
+#include <osmocom/core/prim.h>
+#include <osmocom/gb/protocol/gsm_08_16.h>
+#include <osmocom/gb/frame_relay.h>
+
+struct osmo_sockaddr;
+struct osmo_sockaddr_str;
+struct osmo_fr_network;
+
+struct gprs_ns2_inst;
+struct gprs_ns2_nse;
+struct gprs_ns2_vc;
+struct gprs_ns2_vc_bind;
+struct gprs_ns2_vc_driver;
+struct gprs_ns_ie_ip4_elem;
+struct gprs_ns_ie_ip6_elem;
+
+enum gprs_ns2_vc_mode {
+ /*! The VC will use RESET/BLOCK/UNBLOCK to start the connection and do ALIVE/ACK.
+ * This is what is needed for Frame Relay transport, and if you use a R97/R99 Gb
+ * interface over an IP transport (never standardized by 3GPP) */
+ GPRS_NS2_VC_MODE_BLOCKRESET,
+ /*! The VC will only use ALIVE/ACK (no RESET/BLOCK/UNBLOCK), which is for Gb-IP
+ * interface compliant to 3GPP Rel=4 or later. */
+ GPRS_NS2_VC_MODE_ALIVE,
+};
+
+enum gprs_ns2_dialect {
+ GPRS_NS2_DIALECT_UNDEF,
+ GPRS_NS2_DIALECT_STATIC_ALIVE,
+ GPRS_NS2_DIALECT_STATIC_RESETBLOCK,
+ GPRS_NS2_DIALECT_IPACCESS,
+ GPRS_NS2_DIALECT_SNS,
+};
+
+/*! Osmocom NS link layer types */
+enum gprs_ns2_ll {
+ GPRS_NS2_LL_UNDEF, /*!< undefined, used by vty */
+ GPRS_NS2_LL_UDP, /*!< NS/UDP/IP */
+ GPRS_NS2_LL_FR, /*!< NS/FR */
+ GPRS_NS2_LL_FR_GRE, /*!< NS/FR/GRE/IP */
+};
+
+/*! Osmocom NS primitives according to 48.016 5.2 Service primitives */
+enum gprs_ns2_prim {
+ GPRS_NS2_PRIM_UNIT_DATA,
+ GPRS_NS2_PRIM_CONGESTION,
+ GPRS_NS2_PRIM_STATUS,
+};
+
+extern const struct value_string gprs_ns2_prim_strs[];
+extern const struct value_string gprs_ns2_lltype_strs[];
+
+/*! Obtain a human-readable string for NS primitives */
+static inline const char *gprs_ns2_prim_str(enum gprs_ns2_prim val)
+{ return get_value_string(gprs_ns2_prim_strs, val); }
+
+/*! Obtain a human-readable string for NS link-layer type */
+static inline const char *gprs_ns2_lltype_str(enum gprs_ns2_ll val)
+{ return get_value_string(gprs_ns2_lltype_strs, val); }
+
+/*! Osmocom NS primitives according to 48.016 5.2.2.4 Service primitives */
+enum gprs_ns2_congestion_cause {
+ GPRS_NS2_CONG_CAUSE_BACKWARD_BEGIN,
+ GPRS_NS2_CONG_CAUSE_BACKWARD_END,
+ GPRS_NS2_CONG_CAUSE_FORWARD_BEGIN,
+ GPRS_NS2_CONG_CAUSE_FORWARD_END,
+};
+
+/*! Osmocom NS primitives according to 48.016 5.2.2.6 Service primitives */
+enum gprs_ns2_affecting_cause {
+ GPRS_NS2_AFF_CAUSE_VC_FAILURE,
+ GPRS_NS2_AFF_CAUSE_VC_RECOVERY,
+ GPRS_NS2_AFF_CAUSE_FAILURE,
+ GPRS_NS2_AFF_CAUSE_RECOVERY,
+ /* osmocom own causes */
+ GPRS_NS2_AFF_CAUSE_SNS_CONFIGURED,
+ GPRS_NS2_AFF_CAUSE_SNS_FAILURE,
+ GPRS_NS2_AFF_CAUSE_SNS_NO_ENDPOINTS,
+ GPRS_NS2_AFF_CAUSE_MTU_CHANGE,
+};
+
+extern const struct value_string gprs_ns2_aff_cause_prim_strs[];
+
+/*! Obtain a human-readable string for NS affecting cause in primitives */
+static inline const char *gprs_ns2_aff_cause_prim_str(enum gprs_ns2_affecting_cause val)
+{ return get_value_string(gprs_ns2_aff_cause_prim_strs, val); }
+
+/*! Osmocom NS primitives according to 48.016 5.2.2.7 Service primitives */
+enum gprs_ns2_change_ip_endpoint {
+ GRPS_NS2_ENDPOINT_NO_CHANGE,
+ GPRS_NS2_ENDPOINT_REQUEST_CHANGE,
+ GPRS_NS2_ENDPOINT_CONFIRM_CHANGE,
+};
+
+extern const struct value_string gprs_ns2_cause_strs[];
+
+/*! Obtain a human-readable string for NS primitives */
+static inline const char *gprs_ns2_cause_str(enum ns_cause val)
+{ return get_value_string(gprs_ns2_cause_strs, val); }
+
+struct osmo_gprs_ns2_prim {
+ struct osmo_prim_hdr oph;
+
+ uint16_t nsei;
+ uint16_t bvci;
+
+ union {
+ struct {
+ enum gprs_ns2_change_ip_endpoint change;
+ uint32_t link_selector;
+ /* TODO: implement resource distribution
+ * add place holder for the link selector */
+ long long _resource_distribution_placeholder1;
+ long long _resource_distribution_placeholder2;
+ long long _resource_distribution_placeholder3;
+ } unitdata;
+ struct {
+ enum gprs_ns2_congestion_cause cause;
+ } congestion;
+ struct {
+ enum gprs_ns2_affecting_cause cause;
+ char *nsvc;
+ /* 48.016 5.2.2.6 transfer capability */
+ int transfer;
+ /* osmocom specific */
+ /* Persistent NSE/NSVC are configured by vty */
+ bool persistent;
+ /* Only true on the first time it's available.
+ * Allow the BSSGP layer to reset persistent NSE */
+ bool first;
+ /* MTU of a NS SDU. It's the lowest MTU of all (alive & dead) NSVCs */
+ uint16_t mtu;
+ } status;
+ } u;
+};
+
+/* instance */
+struct gprs_ns2_inst *gprs_ns2_instantiate(void *ctx, osmo_prim_cb cb, void *cb_data);
+void gprs_ns2_free(struct gprs_ns2_inst *inst);
+
+/* Entrypoint for primitives from the NS USER */
+int gprs_ns2_recv_prim(struct gprs_ns2_inst *nsi, struct osmo_prim_hdr *oph);
+
+/*! a callback to iterate over all NSVC */
+typedef int (*gprs_ns2_foreach_nsvc_cb)(struct gprs_ns2_vc *nsvc, void *ctx);
+
+int gprs_ns2_nse_foreach_nsvc(struct gprs_ns2_nse *nse,
+ gprs_ns2_foreach_nsvc_cb cb, void *cb_data);
+struct gprs_ns2_nse *gprs_ns2_nse_by_nsei(struct gprs_ns2_inst *nsi, uint16_t nsei);
+struct gprs_ns2_nse *gprs_ns2_create_nse(struct gprs_ns2_inst *nsi, uint16_t nsei,
+ enum gprs_ns2_ll linklayer,
+ enum gprs_ns2_dialect dialect);
+struct gprs_ns2_nse *gprs_ns2_create_nse2(struct gprs_ns2_inst *nsi, uint16_t nsei,
+ enum gprs_ns2_ll linklayer,
+ enum gprs_ns2_dialect dialect, bool local_sgsn_role);
+uint16_t gprs_ns2_nse_nsei(struct gprs_ns2_nse *nse);
+void gprs_ns2_free_nse(struct gprs_ns2_nse *nse);
+void gprs_ns2_free_nses(struct gprs_ns2_inst *nsi);
+
+/* create vc */
+void gprs_ns2_free_nsvc(struct gprs_ns2_vc *nsvc);
+void gprs_ns2_free_nsvcs(struct gprs_ns2_nse *nse);
+struct gprs_ns2_vc *gprs_ns2_nsvc_by_nsvci(struct gprs_ns2_inst *nsi, uint16_t nsvci);
+
+/* generic VL driver */
+struct gprs_ns2_vc_bind *gprs_ns2_bind_by_name(struct gprs_ns2_inst *nsi,
+ const char *name);
+
+/* IP VL driver */
+int gprs_ns2_ip_bind(struct gprs_ns2_inst *nsi,
+ const char *name,
+ const struct osmo_sockaddr *local,
+ int dscp,
+ struct gprs_ns2_vc_bind **result);
+struct gprs_ns2_vc_bind *gprs_ns2_ip_bind_by_sockaddr(struct gprs_ns2_inst *nsi,
+ const struct osmo_sockaddr *sockaddr);
+
+/* FR VL driver */
+struct gprs_ns2_vc_bind *gprs_ns2_fr_bind_by_netif(
+ struct gprs_ns2_inst *nsi,
+ const char *netif);
+const char *gprs_ns2_fr_bind_netif(struct gprs_ns2_vc_bind *bind);
+enum osmo_fr_role gprs_ns2_fr_bind_role(struct gprs_ns2_vc_bind *bind);
+int gprs_ns2_fr_bind(struct gprs_ns2_inst *nsi,
+ const char *name,
+ const char *netif,
+ struct osmo_fr_network *fr_network,
+ enum osmo_fr_role fr_role,
+ struct gprs_ns2_vc_bind **result);
+int gprs_ns2_is_fr_bind(struct gprs_ns2_vc_bind *bind);
+struct gprs_ns2_vc *gprs_ns2_fr_nsvc_by_dlci(struct gprs_ns2_vc_bind *bind, uint16_t dlci);
+struct gprs_ns2_vc *gprs_ns2_fr_connect(struct gprs_ns2_vc_bind *bind,
+ struct gprs_ns2_nse *nse,
+ uint16_t nsvci,
+ uint16_t dlci);
+struct gprs_ns2_vc *gprs_ns2_fr_connect2(struct gprs_ns2_vc_bind *bind,
+ uint16_t nsei,
+ uint16_t nsvci,
+ uint16_t dlci);
+
+/* create a VC connection */
+struct gprs_ns2_vc *gprs_ns2_ip_connect(struct gprs_ns2_vc_bind *bind,
+ const struct osmo_sockaddr *remote,
+ struct gprs_ns2_nse *nse,
+ uint16_t nsvci);
+
+struct gprs_ns2_vc *gprs_ns2_ip_connect2(struct gprs_ns2_vc_bind *bind,
+ const struct osmo_sockaddr *remote,
+ uint16_t nsei,
+ uint16_t nsvci,
+ enum gprs_ns2_dialect dialect);
+struct gprs_ns2_vc *gprs_ns2_ip_connect_inactive(struct gprs_ns2_vc_bind *bind,
+ const struct osmo_sockaddr *remote,
+ struct gprs_ns2_nse *nse,
+ uint16_t nsvci);
+void gprs_ns2_ip_bind_set_sns_weight(struct gprs_ns2_vc_bind *bind,
+ uint8_t signalling, uint8_t data);
+
+void gprs_ns2_free_bind(struct gprs_ns2_vc_bind *bind);
+void gprs_ns2_free_binds(struct gprs_ns2_inst *nsi);
+
+/* create a VC SNS connection */
+int gprs_ns2_sns_count(struct gprs_ns2_nse *nse);
+int gprs_ns2_sns_add_endpoint(struct gprs_ns2_nse *nse,
+ const struct osmo_sockaddr *saddr);
+int gprs_ns2_sns_del_endpoint(struct gprs_ns2_nse *nse,
+ const struct osmo_sockaddr *saddr);
+int gprs_ns2_sns_add_bind(struct gprs_ns2_nse *nse, struct gprs_ns2_vc_bind *bind);
+int gprs_ns2_sns_del_bind(struct gprs_ns2_nse *nse, struct gprs_ns2_vc_bind *bind);
+const struct osmo_sockaddr *gprs_ns2_nse_sns_remote(struct gprs_ns2_nse *nse);
+
+const struct osmo_sockaddr *gprs_ns2_ip_vc_remote(const struct gprs_ns2_vc *nsvc);
+const struct osmo_sockaddr *gprs_ns2_ip_vc_local(const struct gprs_ns2_vc *nsvc);
+bool gprs_ns2_ip_vc_equal(const struct gprs_ns2_vc *nsvc,
+ const struct osmo_sockaddr *local,
+ const struct osmo_sockaddr *remote,
+ uint16_t nsvci);
+const struct osmo_sockaddr *gprs_ns2_ip_bind_sockaddr(struct gprs_ns2_vc_bind *bind);
+int gprs_ns2_is_ip_bind(struct gprs_ns2_vc_bind *bind);
+int gprs_ns2_ip_bind_set_dscp(struct gprs_ns2_vc_bind *bind, int dscp);
+int gprs_ns2_ip_bind_set_priority(struct gprs_ns2_vc_bind *bind, uint8_t priority);
+struct gprs_ns2_vc *gprs_ns2_nsvc_by_sockaddr_bind(
+ struct gprs_ns2_vc_bind *bind,
+ const struct osmo_sockaddr *saddr);
+
+int gprs_ns2_frgre_bind(struct gprs_ns2_inst *nsi,
+ const char *name,
+ const struct osmo_sockaddr *local,
+ int dscp,
+ struct gprs_ns2_vc_bind **result);
+int gprs_ns2_is_frgre_bind(struct gprs_ns2_vc_bind *bind);
+uint16_t gprs_ns2_fr_nsvc_dlci(const struct gprs_ns2_vc *nsvc);
+
+struct gprs_ns2_vc *gprs_ns2_nsvc_by_sockaddr_nse(
+ struct gprs_ns2_nse *nse,
+ const struct osmo_sockaddr *sockaddr);
+void gprs_ns2_start_alive_all_nsvcs(struct gprs_ns2_nse *nse);
+
+/* VC information */
+const char *gprs_ns2_ll_str(struct gprs_ns2_vc *nsvc);
+char *gprs_ns2_ll_str_buf(char *buf, size_t buf_len, struct gprs_ns2_vc *nsvc);
+char *gprs_ns2_ll_str_c(const void *ctx, struct gprs_ns2_vc *nsvc);
+const char *gprs_ns2_nsvc_state_name(struct gprs_ns2_vc *nsvc);
+
+/* vty */
+int gprs_ns2_vty_init(struct gprs_ns2_inst *nsi);
+
+/*! @} */
diff --git a/include/osmocom/gb/gprs_ns_frgre.h b/include/osmocom/gb/gprs_ns_frgre.h
new file mode 100644
index 0000000..8cf54c7
--- /dev/null
+++ b/include/osmocom/gb/gprs_ns_frgre.h
@@ -0,0 +1,8 @@
+/*! \file gprs_ns_frgre.h */
+
+#pragma once
+
+struct gprs_nsvc;
+struct msgb;
+
+int gprs_ns_frgre_sendmsg(struct gprs_nsvc *nsvc, struct msgb *msg);
diff --git a/include/osmocom/gb/protocol/Makefile.am b/include/osmocom/gb/protocol/Makefile.am
new file mode 100644
index 0000000..29b9368
--- /dev/null
+++ b/include/osmocom/gb/protocol/Makefile.am
@@ -0,0 +1,7 @@
+osmogbproto_HEADERS = \
+ gsm_08_16.h \
+ gsm_08_18.h \
+ gsm_24_301.h \
+ $(NULL)
+
+osmogbprotodir = $(includedir)/osmocom/gb/protocol
diff --git a/include/osmocom/gb/protocol/gsm_08_16.h b/include/osmocom/gb/protocol/gsm_08_16.h
new file mode 100644
index 0000000..6660e6e
--- /dev/null
+++ b/include/osmocom/gb/protocol/gsm_08_16.h
@@ -0,0 +1,103 @@
+/*! \file gsm_08_16.h
+ * GPRS Networks Service (NS) messages on the Gb interface.
+ * 3GPP TS 08.16 version 8.0.1 Release 1999 / ETSI TS 101 299 V8.0.1 (2002-05)
+ * 3GPP TS 48.016 version 6.5.0 Release 6 / ETSI TS 148 016 V6.5.0 (2005-11) */
+
+#pragma once
+
+#include <stdint.h>
+#include <arpa/inet.h>
+#include <osmocom/core/utils.h>
+
+/*! \addtogroup libgb
+ * @{
+ * \file gprs_ns.h */
+
+/*! Common header of GPRS NS */
+struct gprs_ns_hdr {
+ uint8_t pdu_type; /*!< NS PDU type */
+ uint8_t data[0]; /*!< variable-length payload */
+} __attribute__((packed));
+
+
+/*! Section 10.3.2c List of IP4 Elements */
+struct gprs_ns_ie_ip4_elem {
+ uint32_t ip_addr;
+ uint16_t udp_port;
+ uint8_t sig_weight;
+ uint8_t data_weight;
+} __attribute__ ((packed));
+
+/*! Section 10.3.2d List of IP6 Elements */
+struct gprs_ns_ie_ip6_elem {
+ struct in6_addr ip_addr;
+ uint16_t udp_port;
+ uint8_t sig_weight;
+ uint8_t data_weight;
+} __attribute__ ((packed));
+
+extern const struct value_string gprs_ns_pdu_strings[];
+
+/*! NS PDU Type (TS 08.16, Section 10.3.7, Table 14) */
+enum ns_pdu_type {
+ NS_PDUT_UNITDATA = 0x00,
+ NS_PDUT_RESET = 0x02,
+ NS_PDUT_RESET_ACK = 0x03,
+ NS_PDUT_BLOCK = 0x04,
+ NS_PDUT_BLOCK_ACK = 0x05,
+ NS_PDUT_UNBLOCK = 0x06,
+ NS_PDUT_UNBLOCK_ACK = 0x07,
+ NS_PDUT_STATUS = 0x08,
+ NS_PDUT_ALIVE = 0x0a,
+ NS_PDUT_ALIVE_ACK = 0x0b,
+ /* TS 48.016 Section 10.3.7, Table 10.3.7.1 */
+ SNS_PDUT_ACK = 0x0c,
+ SNS_PDUT_ADD = 0x0d,
+ SNS_PDUT_CHANGE_WEIGHT = 0x0e,
+ SNS_PDUT_CONFIG = 0x0f,
+ SNS_PDUT_CONFIG_ACK = 0x10,
+ SNS_PDUT_DELETE = 0x11,
+ SNS_PDUT_SIZE = 0x12,
+ SNS_PDUT_SIZE_ACK = 0x13,
+};
+
+/*! NS Control IE (TS 08.16, Section 10.3, Table 12) */
+enum ns_ctrl_ie {
+ NS_IE_CAUSE = 0x00,
+ NS_IE_VCI = 0x01,
+ NS_IE_PDU = 0x02,
+ NS_IE_BVCI = 0x03,
+ NS_IE_NSEI = 0x04,
+ /* TS 48.016 Section 10.3, Table 10.3.1 */
+ NS_IE_IPv4_LIST = 0x05,
+ NS_IE_IPv6_LIST = 0x06,
+ NS_IE_MAX_NR_NSVC = 0x07,
+ NS_IE_IPv4_EP_NR = 0x08,
+ NS_IE_IPv6_EP_NR = 0x09,
+ NS_IE_RESET_FLAG = 0x0a,
+ NS_IE_IP_ADDR = 0x0b,
+ NS_IE_TRANS_ID = 0xff, /* osmocom. Spec has this IE but without IEI! */
+};
+
+/*! NS Cause (TS 08.16, Section 10.3.2, Table 13) */
+enum ns_cause {
+ NS_CAUSE_TRANSIT_FAIL = 0x00,
+ NS_CAUSE_OM_INTERVENTION = 0x01,
+ NS_CAUSE_EQUIP_FAIL = 0x02,
+ NS_CAUSE_NSVC_BLOCKED = 0x03,
+ NS_CAUSE_NSVC_UNKNOWN = 0x04,
+ NS_CAUSE_BVCI_UNKNOWN = 0x05,
+ NS_CAUSE_SEM_INCORR_PDU = 0x08,
+ NS_CAUSE_PDU_INCOMP_PSTATE = 0x0a,
+ NS_CAUSE_PROTO_ERR_UNSPEC = 0x0b,
+ NS_CAUSE_INVAL_ESSENT_IE = 0x0c,
+ NS_CAUSE_MISSING_ESSENT_IE = 0x0d,
+ /* TS 48.016 Section 10.3.2, Table 10.3.2.1 */
+ NS_CAUSE_INVAL_NR_IPv4_EP = 0x0e,
+ NS_CAUSE_INVAL_NR_IPv6_EP = 0x0f,
+ NS_CAUSE_INVAL_NR_NS_VC = 0x10,
+ NS_CAUSE_INVAL_WEIGH = 0x11,
+ NS_CAUSE_UNKN_IP_EP = 0x12,
+ NS_CAUSE_UNKN_IP_ADDR = 0x13,
+ NS_CAUSE_UNKN_IP_TEST_FAILED = 0x14,
+};
diff --git a/include/osmocom/gb/protocol/gsm_08_18.h b/include/osmocom/gb/protocol/gsm_08_18.h
new file mode 100644
index 0000000..aecb05a
--- /dev/null
+++ b/include/osmocom/gb/protocol/gsm_08_18.h
@@ -0,0 +1,373 @@
+/*! \file gsm_08_18.h */
+/* Updated to reflect TS 48.018 version 15.0.0 Release 15 */
+
+#pragma once
+
+#include <stdint.h>
+#include <osmocom/core/endian.h>
+
+/*! Fixed BVCI definitions (Section 5.4.1) */
+#define BVCI_SIGNALLING 0x0000
+#define BVCI_PTM 0x0001
+
+/* typo backwards compatibility */
+#define BSSGP_PDUT_RA_CAPA_UDPATE BSSGP_PDUT_RA_CAPA_UPDATE
+
+/*! BSSGP PDU types (Section 11.3.26 / Table 11.27) */
+enum bssgp_pdu_type {
+ /* PDUs between RL and BSSGP SAPs */
+ BSSGP_PDUT_DL_UNITDATA = 0x00,
+ BSSGP_PDUT_UL_UNITDATA = 0x01,
+ BSSGP_PDUT_RA_CAPABILITY = 0x02,
+ /* PDUs between MBMS SAPs */
+ BSSGP_PDUT_PTM_UNITDATA = 0x03, /* reserved in later specs */
+ BSSGP_PDUT_DL_MMBS_UNITDATA = 0x04,
+ BSSGP_PDUT_UL_MMBS_UNITDATA = 0x05,
+ /* PDUs between GMM SAPs */
+ BSSGP_PDUT_PAGING_PS = 0x06,
+ BSSGP_PDUT_PAGING_CS = 0x07,
+ BSSGP_PDUT_RA_CAPA_UPDATE = 0x08,
+ BSSGP_PDUT_RA_CAPA_UPDATE_ACK = 0x09,
+ BSSGP_PDUT_RADIO_STATUS = 0x0a,
+ BSSGP_PDUT_SUSPEND = 0x0b,
+ BSSGP_PDUT_SUSPEND_ACK = 0x0c,
+ BSSGP_PDUT_SUSPEND_NACK = 0x0d,
+ BSSGP_PDUT_RESUME = 0x0e,
+ BSSGP_PDUT_RESUME_ACK = 0x0f,
+ BSSGP_PDUT_RESUME_NACK = 0x10,
+ BSSGP_PDUT_PAGING_PS_REJECT = 0x11,
+ BSSGP_PDUT_DUMMY_PAGING_PS = 0x12,
+ BSSGP_PDUT_DUMMY_PAGING_PS_RESP = 0x13,
+ BSSGP_PDUT_MS_REGISTR_ENQ = 0x14,
+ BSSGP_PDUT_MS_REGISTR_ENQ_RESP = 0x15,
+ /* PDus between NM SAPs */
+ BSSGP_PDUT_BVC_BLOCK = 0x20,
+ BSSGP_PDUT_BVC_BLOCK_ACK = 0x21,
+ BSSGP_PDUT_BVC_RESET = 0x22,
+ BSSGP_PDUT_BVC_RESET_ACK = 0x23,
+ BSSGP_PDUT_BVC_UNBLOCK = 0x24,
+ BSSGP_PDUT_BVC_UNBLOCK_ACK = 0x25,
+ BSSGP_PDUT_FLOW_CONTROL_BVC = 0x26,
+ BSSGP_PDUT_FLOW_CONTROL_BVC_ACK = 0x27,
+ BSSGP_PDUT_FLOW_CONTROL_MS = 0x28,
+ BSSGP_PDUT_FLOW_CONTROL_MS_ACK = 0x29,
+ BSSGP_PDUT_FLUSH_LL = 0x2a,
+ BSSGP_PDUT_FLUSH_LL_ACK = 0x2b,
+ BSSGP_PDUT_LLC_DISCARD = 0x2c,
+ BSSGP_PDUT_FLOW_CONTROL_PFC = 0x2d,
+ BSSGP_PDUT_FLOW_CONTROL_PFC_ACK = 0x2e,
+ BSSGP_PDUT_SGSN_INVOKE_TRACE = 0x40,
+ BSSGP_PDUT_STATUS = 0x41,
+ BSSGP_PDUT_OVERLOAD = 0x42,
+ /* PDUs between PFM SAP's */
+ BSSGP_PDUT_DOWNLOAD_BSS_PFC = 0x50,
+ BSSGP_PDUT_CREATE_BSS_PFC = 0x51,
+ BSSGP_PDUT_CREATE_BSS_PFC_ACK = 0x52,
+ BSSGP_PDUT_CREATE_BSS_PFC_NACK = 0x53,
+ BSSGP_PDUT_MODIFY_BSS_PFC = 0x54,
+ BSSGP_PDUT_MODIFY_BSS_PFC_ACK = 0x55,
+ BSSGP_PDUT_DELETE_BSS_PFC = 0x56,
+ BSSGP_PDUT_DELETE_BSS_PFC_ACK = 0x57,
+ BSSGP_PDUT_DELETE_BSS_PFC_REQ = 0x58,
+ BSSGP_PDUT_PS_HO_REQUIRED = 0x59,
+ BSSGP_PDUT_PS_HO_REQUIRED_ACK = 0x5a,
+ BSSGP_PDUT_PS_HO_REQUIRED_NACK = 0x5b,
+ BSSGP_PDUT_PS_HO_REQUEST = 0x5c,
+ BSSGP_PDUT_PS_HO_REQUEST_ACK = 0x5d,
+ BSSGP_PDUT_PS_HO_REQUEST_NACK = 0x5e,
+ BSSGP_PDUT_PS_HO_COMPLETE = 0x91,
+ BSSGP_PDUT_PS_HO_CANCEL = 0x92,
+ BSSGP_PDUT_PS_HO_COMPLETE_ACK = 0x93,
+ /* PDUs between LCS SAPs */
+ BSSGP_PDUT_PERFORM_LOC_REQ = 0x60,
+ BSSGP_PDUT_PERFORM_LOC_RESP = 0x61,
+ BSSGP_PDUT_PERFORM_LOC_ABORT = 0x62,
+ BSSGP_PDUT_POSITION_COMMAND = 0x63,
+ BSSGP_PDUT_POSITION_RESPONSE = 0x64,
+ /* PDUs between RIM SAPs */
+ BSSGP_PDUT_RAN_INFO = 0x70,
+ BSSGP_PDUT_RAN_INFO_REQ = 0x71,
+ BSSGP_PDUT_RAN_INFO_ACK = 0x72,
+ BSSGP_PDUT_RAN_INFO_ERROR = 0x73,
+ BSSGP_PDUT_RAN_INFO_APP_ERROR = 0x74,
+ /* PDUs between MBMS SAPs */
+ BSSGP_PDUT_MBMS_START_REQ = 0x80,
+ BSSGP_PDUT_MBMS_START_RESP = 0x81,
+ BSSGP_PDUT_MBMS_STOP_REQ = 0x82,
+ BSSGP_PDUT_MBMS_STOP_RESP = 0x83,
+ BSSGP_PDUT_MBMS_UPDATE_REQ = 0x84,
+ BSSGP_PDUT_MBMS_UPDATE_RESP = 0x85,
+};
+
+/*! BSSGP User-Data header (Section 10.2.1 and 10.2.2) */
+struct bssgp_ud_hdr {
+ uint8_t pdu_type; /*!< BSSGP PDU type */
+ uint32_t tlli; /*!< Temporary Link-Local Identifier */
+ uint8_t qos_profile[3]; /*!< QoS profile */
+ uint8_t data[0]; /* optional/conditional IEs as TLVs */
+} __attribute__((packed));
+
+/*! BSSGP normal header */
+struct bssgp_normal_hdr {
+ uint8_t pdu_type; /*!< BSSGP PDU type */
+ uint8_t data[0]; /*!< optional/conditional IEs as TLVs */
+};
+
+/*! BSSGP Information Element Identifiers (Section 11.3 / Table 11.3) */
+enum bssgp_iei_type {
+ BSSGP_IE_ALIGNMENT = 0x00,
+ BSSGP_IE_BMAX_DEFAULT_MS = 0x01,
+ BSSGP_IE_BSS_AREA_ID = 0x02,
+ BSSGP_IE_BUCKET_LEAK_RATE = 0x03,
+ BSSGP_IE_BVCI = 0x04,
+ BSSGP_IE_BVC_BUCKET_SIZE = 0x05,
+ BSSGP_IE_BVC_MEASUREMENT = 0x06,
+ BSSGP_IE_CAUSE = 0x07,
+ BSSGP_IE_CELL_ID = 0x08,
+ BSSGP_IE_CHAN_NEEDED = 0x09,
+ BSSGP_IE_DRX_PARAMS = 0x0a,
+ BSSGP_IE_EMLPP_PRIO = 0x0b,
+ BSSGP_IE_FLUSH_ACTION = 0x0c,
+ BSSGP_IE_IMSI = 0x0d,
+ BSSGP_IE_LLC_PDU = 0x0e,
+ BSSGP_IE_LLC_FRAMES_DISCARDED = 0x0f,
+ BSSGP_IE_LOCATION_AREA = 0x10,
+ BSSGP_IE_MOBILE_ID = 0x11,
+ BSSGP_IE_MS_BUCKET_SIZE = 0x12,
+ BSSGP_IE_MS_RADIO_ACCESS_CAP = 0x13,
+ BSSGP_IE_OMC_ID = 0x14,
+ BSSGP_IE_PDU_IN_ERROR = 0x15,
+ BSSGP_IE_PDU_LIFETIME = 0x16,
+ BSSGP_IE_PRIORITY = 0x17,
+ BSSGP_IE_QOS_PROFILE = 0x18,
+ BSSGP_IE_RADIO_CAUSE = 0x19,
+ BSSGP_IE_RA_CAP_UPD_CAUSE = 0x1a,
+ BSSGP_IE_ROUTEING_AREA = 0x1b,
+ BSSGP_IE_R_DEFAULT_MS = 0x1c,
+ BSSGP_IE_SUSPEND_REF_NR = 0x1d,
+ BSSGP_IE_TAG = 0x1e,
+ BSSGP_IE_TLLI = 0x1f,
+ BSSGP_IE_TMSI = 0x20,
+ BSSGP_IE_TRACE_REFERENC = 0x21,
+ BSSGP_IE_TRACE_TYPE = 0x22,
+ BSSGP_IE_TRANSACTION_ID = 0x23,
+ BSSGP_IE_TRIGGER_ID = 0x24,
+ BSSGP_IE_NUM_OCT_AFF = 0x25,
+ BSSGP_IE_LSA_ID_LIST = 0x26,
+ BSSGP_IE_LSA_INFORMATION = 0x27,
+ BSSGP_IE_PACKET_FLOW_ID = 0x28,
+ BSSGP_IE_PACKET_FLOW_TIMER = 0x29,
+ BSSGP_IE_AGG_BSS_QOS_PROFILE = 0x3a,
+ BSSGP_IE_FEATURE_BITMAP = 0x3b,
+ BSSGP_IE_BUCKET_FULL_RATIO = 0x3c,
+ BSSGP_IE_SERVICE_UTRAN_CCO = 0x3d,
+ BSSGP_IE_NSEI = 0x3e,
+ BSSGP_IE_RRLP_APDU = 0x3f,
+ BSSGP_IE_LCS_QOS = 0x40,
+ BSSGP_IE_LCS_CLIENT_TYPE = 0x41,
+ BSSGP_IE_REQUESTED_GPS_AST_DATA = 0x42,
+ BSSGP_IE_LOCATION_TYPE = 0x43,
+ BSSGP_IE_LOCATION_ESTIMATE = 0x44,
+ BSSGP_IE_POSITIONING_DATA = 0x45,
+ BSSGP_IE_DECIPHERING_KEYS = 0x46,
+ BSSGP_IE_LCS_PRIORITY = 0x47,
+ BSSGP_IE_LCS_CAUSE = 0x48,
+ BSSGP_IE_LCS_CAPABILITY = 0x49,
+ BSSGP_IE_RRLP_FLAGS = 0x4a,
+ BSSGP_IE_RIM_APP_IDENTITY = 0x4b,
+ BSSGP_IE_RIM_SEQ_NR = 0x4c,
+ BSSGP_IE_RIM_REQ_APP_CONTAINER = 0x4d,
+ BSSGP_IE_RAN_INFO_APP_CONTAINER = 0x4e,
+ BSSGP_IE_RIM_PDU_INDICATIONS = 0x4f,
+ BSSGP_IE_PFC_FLOW_CTRL_PARAMS = 0x52,
+ BSSGP_IE_GLOBAL_CN_ID = 0x53,
+ BSSGP_IE_RIM_ROUTING_INFO = 0x54,
+ BSSGP_IE_RIM_PROTOCOL_VERSION = 0x55,
+ BSSGP_IE_APP_ERROR_CONTAINER = 0x56,
+ BSSGP_IE_RI_REQ_RIM_CONTAINER = 0x57,
+ BSSGP_IE_RI_RIM_CONTAINER = 0x58,
+ BSSGP_IE_RI_APP_ERROR_RIM_CONT = 0x59,
+ BSSGP_IE_RI_ACK_RIM_CONTAINER = 0x5a,
+ BSSGP_IE_RI_ERROR_RIM_COINTAINER = 0x5b,
+ BSSGP_IE_TMGI = 0x5c,
+ BSSGP_IE_MBMS_SESSION_ID = 0x5d,
+ BSSGP_IE_MBMS_SESSION_DURATION = 0x5e,
+ BSSGP_IE_MBMS_SA_ID_LIST = 0x5f,
+ BSSGP_IE_MBMS_RESPONSE = 0x60,
+ BSSGP_IE_MBMS_RA_LIST = 0x61,
+ BSSGP_IE_MBMS_SESSION_INFO = 0x62,
+ BSSGP_IE_MBMS_STOP_CAUSE = 0x63,
+ BSSGP_IE_SBSS_TO_TBSS_TR_CONT = 0x64,
+ BSSGP_IE_TBSS_TO_SBSS_TR_CONT = 0x65,
+ BSSGP_IE_NAS_CONT_FOR_PS_HO = 0x66,
+ BSSGP_IE_PFC_TO_BE_SETUP_LIST = 0x67,
+ BSSGP_IE_LIST_OF_SETUP_PFC = 0x68,
+ BSSGP_IE_EXT_FEATURE_BITMAP = 0x69,
+ BSSGP_IE_SRC_TO_TGT_TR_CONT = 0x6a,
+ BSSGP_IE_TGT_TO_SRC_TR_CONT = 0x6b,
+ BSSGP_IE_NC_ID = 0x6c,
+ BSSGP_IE_PAGE_MODE = 0x6d,
+ BSSGP_IE_CONTAINER_ID = 0x6e,
+ BSSGP_IE_GLOBAL_TFI = 0x6f,
+ BSSGP_IE_IMEI = 0x70,
+ BSSGP_IE_TIME_TO_MBMS_DATA_XFR = 0x71,
+ BSSGP_IE_MBMS_SESSION_REP_NR = 0x72,
+ BSSGP_IE_INTER_RAT_HO_INFO = 0x73,
+ BSSGP_IE_PS_HO_COMMAND = 0x74,
+ BSSGP_IE_PS_HO_INDICATIONS = 0x75,
+ BSSGP_IE_SI_PSI_CONTAINER = 0x76,
+ BSSGP_IE_ACTIVE_PFC_LIST = 0x77,
+ BSSGP_IE_VELOCITY_DATA = 0x78,
+ BSSGP_IE_DTM_HO_COMMAND = 0x79,
+ BSSGP_IE_CS_INDICATION = 0x7a,
+ BSSGP_IE_RQD_GANNS_AST_DATA = 0x7b,
+ BSSGP_IE_GANSS_LOCATION_TYPE = 0x7c,
+ BSSGP_IE_GANSS_POSITIONING_DATA = 0x7d,
+ BSSGP_IE_FLOW_CTRL_GRANULARITY = 0x7e,
+ BSSGP_IE_ENB_ID = 0x7f,
+ BSSGP_IE_EUTRAN_IRAT_HO_INFO = 0x80,
+ BSSGP_IE_SUB_PID4RAT_FREQ_PRIO = 0x81,
+ BSSGP_IE_REQ4IRAT_HO_INFO = 0x82,
+ BSSGP_IE_RELIABLE_IRAT_HO_INFO = 0x83,
+ BSSGP_IE_SON_TRANSFER_APP_ID = 0x84,
+ BSSGP_IE_CSG_ID = 0x85,
+ BSSGP_IE_TAC = 0x86,
+ BSSGP_IE_REDIRECT_ATTEMPT_FLAG = 0x87,
+ BSSGP_IE_REDIRECTION_INDICATION = 0x88,
+ BSSGP_IE_REDIRECTION_COMPLETED = 0x89,
+ BSSGP_IE_UNCONF_SEND_STATE_VAR = 0x8a,
+ BSSGP_IE_IRAT_MEASUREMENT_CONF = 0x8b,
+ BSSGP_IE_SCI = 0x8c,
+ BSSGP_IE_GGSN_PGW_LOCATION = 0x8d,
+ BSSGP_IE_SELECTED_PLMN_ID = 0x8e,
+ BSSGP_IE_PRIO_CLASS_IND = 0x8f,
+ BSSGP_IE_SOURCE_CELL_ID = 0x90,
+ BSSGP_IE_IRAT_MEAS_CFG_E_EARFCN = 0x91,
+ BSSGP_IE_EDRX_PARAMETERS = 0x92,
+ BSSGP_IE_T_UNTIL_NEXT_PAGING = 0x93,
+ BSSGP_IE_COVERAGE_CLASS = 0x98,
+ BSSGP_IE_PAGING_ATTEMPT_INFO = 0x99,
+ BSSGP_IE_EXCEPTION_REPORT_FLAG = 0x9a,
+ BSSGP_IE_OLD_RA_ID = 0x9b,
+ BSSGP_IE_ATTACH_IND = 0x9c,
+ BSSGP_IE_PLMN_ID = 0x9d,
+ BSSGP_IE_MME_QUERY = 0x9e,
+ BSSGP_IE_SGSN_GROUP_ID = 0x9f,
+ BSSGP_IE_ADDITIONAL_PTMSI = 0xa0,
+ BSSGP_IE_UE_USAGE_TYPE = 0xa1,
+ BSSGP_IE_MLAT_TIMER = 0xa2,
+ BSSGP_IE_MLAT_TA = 0xa3,
+ BSSGP_IE_MS_SYNC_ACCURACY = 0xa4,
+ BSSGP_IE_BTS_RX_ACCURACY_LVL = 0xa5,
+ BSSGP_IE_TA_REQ = 0xa6,
+};
+
+/*! Cause coding (Section 11.3.8 / Table 11.10) */
+enum gprs_bssgp_cause {
+ BSSGP_CAUSE_PROC_OVERLOAD = 0x00,
+ BSSGP_CAUSE_EQUIP_FAIL = 0x01,
+ BSSGP_CAUSE_TRASIT_NET_FAIL = 0x02,
+ BSSGP_CAUSE_CAPA_GREATER_0KPBS = 0x03,
+ BSSGP_CAUSE_UNKNOWN_MS = 0x04,
+ BSSGP_CAUSE_UNKNOWN_BVCI = 0x05,
+ BSSGP_CAUSE_CELL_TRAF_CONG = 0x06,
+ BSSGP_CAUSE_SGSN_CONG = 0x07,
+ BSSGP_CAUSE_OML_INTERV = 0x08,
+ BSSGP_CAUSE_BVCI_BLOCKED = 0x09,
+ BSSGP_CAUSE_PFC_CREATE_FAIL = 0x0a,
+ BSSGP_CAUSE_PFC_PREEMPTED = 0x0b,
+ BSSGP_CAUSE_ABQP_NOT_SUPP = 0x0c,
+ BSSGP_CAUSE_SEM_INCORR_PDU = 0x20,
+ BSSGP_CAUSE_INV_MAND_INF = 0x21,
+ BSSGP_CAUSE_MISSING_MAND_IE = 0x22,
+ BSSGP_CAUSE_MISSING_COND_IE = 0x23,
+ BSSGP_CAUSE_UNEXP_COND_IE = 0x24,
+ BSSGP_CAUSE_COND_IE_ERR = 0x25,
+ BSSGP_CAUSE_PDU_INCOMP_STATE = 0x26,
+ BSSGP_CAUSE_PROTO_ERR_UNSPEC = 0x27,
+ BSSGP_CAUSE_PDU_INCOMP_FEAT = 0x28,
+ BSSGP_CAUSE_REQ_INFO_NOT_AVAIL = 0x29,
+ BSSGP_CAUSE_UNKN_DST = 0x2a,
+ BSSGP_CAUSE_UNKN_RIM_AI = 0x2b,
+ BSSGP_CAUSE_INVAL_CONT_UI = 0x2c,
+ BSSGP_CAUSE_PFC_QUEUE = 0x2d,
+ BSSGP_CAUSE_PFC_CREATED = 0x2e,
+ BSSGP_CAUSE_T12_EXPIRY = 0x2f,
+ BSSGP_CAUSE_MS_UNDER_PS_HO = 0x30,
+ BSSGP_CAUSE_UL_QUALITY = 0x31,
+ BSSGP_CAUSE_UL_STRENGTH = 0x32,
+ BSSGP_CAUSE_DL_QUALITY = 0x33,
+ BSSGP_CAUSE_DL_STRENGTH = 0x34,
+ BSSGP_CAUSE_DISTANCE = 0x35,
+ BSSGP_CAUSE_BETTER_CELL = 0x36,
+ BSSGP_CAUSE_TRAFFIC = 0x37,
+ BSSGP_CAUSE_MS_RADIO_LOSS = 0x38,
+ BSSGP_CAUSE_MS_BACK_OLD_CHAN = 0x39,
+ BSSGP_CAUSE_T13_EXPIRY = 0x3a,
+ BSSGP_CAUSE_T14_EXPIRY = 0x3b,
+ BSSGP_CAUSE_NOT_ALL_PFC = 0x3c,
+ BSSGP_CAUSE_CS = 0x3d,
+ BSSGP_CAUSE_REQ_ALG_NOT_SUPP = 0x3e,
+ BSSGP_CAUSE_RELOC_FAIL = 0x3f,
+ BSSGP_CAUSE_DIR_RETRY = 0x40,
+ BSSGP_CAUSE_TIME_CRIT_RELOC = 0x41,
+ BSSGP_CAUSE_PS_HO_TARG_NA = 0x42,
+ BSSGP_CAUSE_PS_HO_TARG_NOT_SUPP = 0x43,
+ BSSGP_CAUSE_PUESBINE = 0x44,
+ BSSGP_CAUSE_DTM_HO_NO_CS_RES = 0x45,
+ BSSGP_CAUSE_DTM_HO_PS_ALLOC_FAIL = 0x46,
+ BSSGP_CAUSE_DTM_HO_T24_EXPIRY = 0x47,
+ BSSGP_CAUSE_DTM_HO_INVAL_CS_IND = 0x48,
+ BSSGP_CAUSE_DTM_HO_T23_EXPIRY = 0x49,
+ BSSGP_CAUSE_DTM_HO_MSC_ERR = 0x4a,
+ BSSGP_CAUSE_INVAL_CSG_CELL = 0x4b,
+};
+
+/* Feature Bitmap (Section 11.3.45) */
+#define BSSGP_FEAT_PFC 0x01 /* Packet Flow Context */
+#define BSSGP_FEAT_CBL 0x02 /* Current Bucket Level */
+#define BSSGP_FEAT_INR 0x04 /* Inter-NSE re-routing */
+#define BSSGP_FEAT_LCS 0x08 /* Location Services */
+#define BSSGP_FEAT_RIM 0x10 /* RAN Inoformation Management */
+#define BSSGP_FEAT_PFC_FC 0x20 /* PFC Flow Control */
+#define BSSGP_FEAT_ERS 0x40 /* Enhanced Radio Status */
+#define BSSGP_FEAT_MBMS 0x80 /* Multimedia Broadcast */
+
+/* Extended Feature Bitmap (Section 11.3.84) */
+#define BSSGP_XFEAT_PSHO 0x01 /* PS Handover */
+#define BSSGP_XFEAT_GBIT 0x02 /* Gigabit Interface */
+#define BSSGP_XFEAT_MOCN 0x04 /* Multi-Operator CN */
+#define BSSGP_XFEAT_CSPS 0x08 /* CS/PS coordination enhancements */
+#define BSSGP_XFEAT_ECIoT 0x10 /* EC-GSM-IoT */
+#define BSSGP_XFEAT_DCN 0x20 /* Dedicated CN */
+#define BSSGP_XFEAT_eDRX 0x40 /* eDRX */
+#define BSSGP_XFEAT_MSAD 0x80 /* MS-assisted Dedicated CN selection */
+
+/* Flow Control Granularity (Section 11.3.102) */
+enum bssgp_fc_granularity {
+ BSSGP_FC_GRAN_100 = 0,
+ BSSGP_FC_GRAN_1000 = 1,
+ BSSGP_FC_GRAN_10000 = 2,
+ BSSGP_FC_GRAN_100000 = 3,
+};
+
+/* RAN-INFORMATION-REQUEST PDU Type Extension
+ * 3GPP TS 48.018, table 11.3.65.1 */
+enum bssgp_rim_pdu_type {
+ RIM_PDU_TYPE_STOP = 0,
+ RIM_PDU_TYPE_SING_REP = 1,
+ RIM_PDU_TYPE_MULT_REP = 2,
+};
+
+/* RIM PDU Indications
+ * 3GPP TS 48.018, section 11.3.65.0 */
+struct bssgp_rim_pdu_ind {
+#if OSMO_IS_LITTLE_ENDIAN
+ uint8_t ack_requested:1,
+ pdu_type_ext:3,
+ reserved:4;
+#elif OSMO_IS_BIG_ENDIAN
+/* auto-generated from the little endian part above (libosmocore/contrib/struct_endianness.py) */
+ uint8_t reserved:4, pdu_type_ext:3, ack_requested:1;
+#endif
+} __attribute__ ((packed));
diff --git a/include/osmocom/gb/protocol/gsm_24_301.h b/include/osmocom/gb/protocol/gsm_24_301.h
new file mode 100644
index 0000000..d4bcd87
--- /dev/null
+++ b/include/osmocom/gb/protocol/gsm_24_301.h
@@ -0,0 +1,11 @@
+/*! \file gsm_24_301.h */
+
+#pragma once
+
+/*! Tracking area TS 24.301, section 9.9.3.32 */
+struct osmo_eutran_tai {
+ uint16_t mcc;
+ uint16_t mnc;
+ bool mnc_3_digits;
+ uint16_t tac;
+};
diff --git a/include/osmocom/gprs/bssgp_bvc_fsm.h b/include/osmocom/gprs/bssgp_bvc_fsm.h
index 9d3a620..ccd0d7f 100644
--- a/include/osmocom/gprs/bssgp_bvc_fsm.h
+++ b/include/osmocom/gprs/bssgp_bvc_fsm.h
@@ -1,71 +1,4 @@
#pragma once
-#include <stdint.h>
-struct gprs_ns2_inst;
-struct osmo_fsm_inst;
-struct gprs_ra_id;
-struct bssgp2_flow_ctrl;
-
-enum bssp_ptp_bvc_fsm_state {
- BSSGP_BVCFSM_S_NULL,
- BSSGP_BVCFSM_S_BLOCKED,
- BSSGP_BVCFSM_S_WAIT_RESET_ACK,
- BSSGP_BVCFSM_S_UNBLOCKED,
-};
-
-enum bssgp_ptp_bvc_fsm_event {
- /* Rx of BSSGP PDUs from the remote side; 'data' is 'struct tlv_parsed', and
- * the assumption is that the caller has already validated all mandatory IEs
- * are present and of sufficient length */
- BSSGP_BVCFSM_E_RX_BLOCK,
- BSSGP_BVCFSM_E_RX_BLOCK_ACK,
- BSSGP_BVCFSM_E_RX_UNBLOCK,
- BSSGP_BVCFSM_E_RX_UNBLOCK_ACK,
- BSSGP_BVCFSM_E_RX_RESET,
- BSSGP_BVCFSM_E_RX_RESET_ACK,
- BSSGP_BVCFSM_E_RX_FC_BVC,
- BSSGP_BVCFSM_E_RX_FC_BVC_ACK,
- /* Requests of the local user */
- BSSGP_BVCFSM_E_REQ_BLOCK, /* data: uint8_t *cause */
- BSSGP_BVCFSM_E_REQ_UNBLOCK,
- BSSGP_BVCFSM_E_REQ_RESET, /* data: uint8_t *cause */
- BSSGP_BVCFSM_E_REQ_FC_BVC, /* data: struct bssgp2_flow_ctrl */
-};
-
-struct bssgp_bvc_fsm_ops {
- /* call-back notifying the user of a state change */
- void (*state_chg_notification)(uint16_t nsei, uint16_t bvci, int old_state, int new_state,
- void *priv);
- /* call-back notifying the user of a BVC-RESET event */
- void (*reset_notification)(uint16_t nsei, uint16_t bvci, const struct gprs_ra_id *ra_id,
- uint16_t cell_id, uint8_t cause, void *priv);
- void (*rx_fc_bvc)(uint16_t nsei, uint16_t bvci, const struct bssgp2_flow_ctrl *fc, void *priv);
- void (*reset_ack_notification)(uint16_t nsei, uint16_t bvci, const struct gprs_ra_id *ra_id,
- uint16_t cell_id, uint8_t cause, void *priv);
-};
-
-struct osmo_fsm_inst *
-bssgp_bvc_fsm_alloc_sig_bss(void *ctx, struct gprs_ns2_inst *nsi, uint16_t nsei, uint32_t features);
-
-struct osmo_fsm_inst *
-bssgp_bvc_fsm_alloc_ptp_bss(void *ctx, struct gprs_ns2_inst *nsi, uint16_t nsei, uint16_t bvci,
- const struct gprs_ra_id *ra_id, uint16_t cell_id);
-
-struct osmo_fsm_inst *
-bssgp_bvc_fsm_alloc_sig_sgsn(void *ctx, struct gprs_ns2_inst *nsi, uint16_t nsei, uint32_t features);
-
-struct osmo_fsm_inst *
-bssgp_bvc_fsm_alloc_ptp_sgsn(void *ctx, struct gprs_ns2_inst *nsi, uint16_t nsei, uint16_t bvci);
-
-void bssgp_bvc_fsm_set_ops(struct osmo_fsm_inst *fi, const struct bssgp_bvc_fsm_ops *ops, void *ops_priv);
-
-bool bssgp_bvc_fsm_is_unblocked(struct osmo_fsm_inst *fi);
-
-uint8_t bssgp_bvc_fsm_get_block_cause(struct osmo_fsm_inst *fi);
-
-uint32_t bssgp_bvc_fsm_get_features_advertised(struct osmo_fsm_inst *fi);
-uint32_t bssgp_bvc_fsm_get_features_received(struct osmo_fsm_inst *fi);
-uint32_t bssgp_bvc_fsm_get_features_negotiated(struct osmo_fsm_inst *fi);
-
-void bssgp_bvc_fsm_set_max_pdu_len(struct osmo_fsm_inst *fi, uint16_t max_pdu_len);
-uint16_t bssgp_bvc_fsm_get_max_pdu_len(const struct osmo_fsm_inst *fi);
\ No newline at end of file
+#pragma message "Header osmocom/gprs/bssgp_bvc_fsm.h is deprecated, include osmocom/gb/bssgp_bvc_fsm.h instead"
+#include <osmocom/gb/bssgp_bvc_fsm.h>
diff --git a/include/osmocom/gprs/frame_relay.h b/include/osmocom/gprs/frame_relay.h
index 81b42a6..7b2cf3c 100644
--- a/include/osmocom/gprs/frame_relay.h
+++ b/include/osmocom/gprs/frame_relay.h
@@ -1,151 +1,4 @@
-/*! \file frame_relay.h */
-
-/* (C) 2020 Harald Welte <laforge@gnumonks.org>
- * (C) 2020 sysmocom - s.f.m.c. GmbH
- * Author: Alexander Couzens <lynxis@fe80.eu>
- *
- * All Rights Reserved
- *
- * SPDX-License-Identifier: GPL-2.0+
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 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 General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- *
- */
-
#pragma once
-#include <osmocom/core/linuxlist.h>
-#include <osmocom/core/timer.h>
-#include <osmocom/core/utils.h>
-
-#include <stdint.h>
-
-struct osmo_tdef;
-struct msgb;
-struct vty;
-
-enum osmo_fr_role {
- FR_ROLE_USER_EQUIPMENT,
- FR_ROLE_NETWORK_EQUIPMENT,
-};
-
-/* 48.016 ยง 6.1.4.2 default maximum information field size of 1600 octets */
-#define FRAME_RELAY_MTU 1600
-/* FR DLC header is 2 byte */
-#define FRAME_RELAY_SDU (FRAME_RELAY_MTU - 2)
-
-extern const struct value_string osmo_fr_role_names[];
-
-static inline const char *osmo_fr_role_str(enum osmo_fr_role role) {
- return get_value_string(osmo_fr_role_names, role);
-}
-
-struct osmo_fr_network {
- struct llist_head links;
-
- unsigned int n391; /* full status polling counter */
- unsigned int n392; /* error threshold */
- unsigned int n393; /* monitored events count */
-
- struct osmo_tdef *T_defs; /* T391, T392 */
-};
-
-struct osmo_fr_dlc;
-
-/* Frame Relay Link */
-struct osmo_fr_link {
- /* list in osmo_fr_network.links */
- struct llist_head list;
- struct osmo_fr_network *net;
- enum osmo_fr_role role;
- /* human-readable name */
- const char *name;
-
- /* value of the last received send sequence number field in the
- * link integrity verification information element */
- uint8_t last_rx_seq;
-
- /* value of the send sequence number field of the last link
- * integrity verification information element sent */
- uint8_t last_tx_seq;
-
- struct osmo_timer_list t391;
- struct osmo_timer_list t392;
-
- unsigned int polling_count;
- unsigned int err_count;
- unsigned int succeed;
- /* the type of the last status enquiry */
- uint8_t expected_rep;
- bool state;
-
- /* list of data link connections at this link */
- struct llist_head dlc_list;
-
- /* optional call-back to be called for each PDU received on an unknown DLC */
- int (*unknown_dlc_rx_cb)(void *cb_data, struct msgb *msg);
- void *unknown_dlc_rx_cb_data;
-
- /* call-back to be called for transmitting on the underlying hardware */
- int (*tx_cb)(void *data, struct msgb *msg);
- /* optional call-back to be called each time the status changes active/inactive */
- void (*status_cb)(struct osmo_fr_link *link, void *cb_data, bool active);
- void *cb_data;
-};
-
-/* Frame Relay Data Link Connection */
-struct osmo_fr_dlc {
- /* entry in fr_link.dlc_list */
- struct llist_head list;
- struct osmo_fr_link *link;
-
- uint16_t dlci;
-
- /* is this DLC marked active for traffic? */
- bool active;
- /* was this DLC newly added? */
- bool add;
- /* is this DLC about to be destroyed */
- bool del;
-
- /* The local state needs to be transferred to the USER;
- * NET must wait until USER confirms it implicitly by a seq number check */
- bool state_send;
-
- /* call-back to be called for each PDU received on this DLC */
- int (*rx_cb)(void *cb_data, struct msgb *msg);
- /* optional call-back to be called each time the status changes active/inactive */
- void (*status_cb)(struct osmo_fr_dlc *dlc, void *cb_data, bool active);
- void *cb_data;
-};
-
-/* allocate a frame relay network */
-struct osmo_fr_network *osmo_fr_network_alloc(void *ctx);
-void osmo_fr_network_free(struct osmo_fr_network *net);
-void osmo_fr_network_dump_vty(struct vty *vty, const struct osmo_fr_network *net);
-
-/* allocate a frame relay link in a given network */
-struct osmo_fr_link *osmo_fr_link_alloc(struct osmo_fr_network *net, enum osmo_fr_role role, const char *name);
-
-/* free a frame link in a given network */
-void osmo_fr_link_free(struct osmo_fr_link *link);
-
-/* allocate a data link connectoin on a given framerelay link */
-struct osmo_fr_dlc *osmo_fr_dlc_alloc(struct osmo_fr_link *link, uint16_t dlci);
-void osmo_fr_dlc_free(struct osmo_fr_dlc *dlc);
-
-struct osmo_fr_dlc *osmo_fr_dlc_by_dlci(struct osmo_fr_link *link, uint16_t dlci);
-
-int osmo_fr_rx(struct msgb *msg);
-int osmo_fr_tx_dlc(struct msgb *msg);
+#pragma message "Header osmocom/gprs/frame_relay.h is deprecated, include osmocom/gb/frame_relay.h instead"
+#include <osmocom/gb/frame_relay.h>
diff --git a/include/osmocom/gprs/gprs_bssgp.h b/include/osmocom/gprs/gprs_bssgp.h
index 6c04332..4dd9cee 100644
--- a/include/osmocom/gprs/gprs_bssgp.h
+++ b/include/osmocom/gprs/gprs_bssgp.h
@@ -1,245 +1,4 @@
-/*! \file gprs_bssgp.h */
-
#pragma once
-#include <stdint.h>
-#include <osmocom/core/timer.h>
-#include <osmocom/core/linuxlist.h>
-
-#include <osmocom/gsm/gsm48.h>
-#include <osmocom/gsm/prim.h>
-
-#include <osmocom/gprs/protocol/gsm_08_18.h>
-#include <osmocom/gprs/protocol/gsm_24_301.h>
-#include <osmocom/gprs/gprs_bssgp_rim.h>
-
-/* gprs_bssgp_util.c */
-
-#define BSSGP_PDUF_UL 0x0001 /* PDU may occur in uplink */
-#define BSSGP_PDUF_DL 0x0002 /* PDU may occur in downlink */
-#define BSSGP_PDUF_SIG 0x0004 /* PDU may occur on Signaling BVC */
-#define BSSGP_PDUF_PTP 0x0008 /* PDU may occur on PTP BVC */
-#define BSSGP_PDUF_PTM 0x0010 /* PDU may occur on PTM BVC */
-
-extern const struct osmo_tlv_prot_def osmo_pdef_bssgp;
-
-/*! return the PDU type flags (UL/DL/SIG/PTP/PTM) of specified PDU type */
-static inline uint32_t bssgp_pdu_type_flags(uint8_t pdu_type) {
- return osmo_tlv_prot_msgt_flags(&osmo_pdef_bssgp, pdu_type);
-}
-
-typedef int (*bssgp_bvc_send)(void *ctx, struct msgb *msg);
-extern struct gprs_ns_inst *bssgp_nsi;
-void bssgp_set_bssgp_callback(bssgp_bvc_send ns_send, void *data);
-struct msgb *bssgp_msgb_alloc(void);
-struct msgb *bssgp_msgb_copy(const struct msgb *msg, const char *name);
-const char *bssgp_cause_str(enum gprs_bssgp_cause cause);
-const char *bssgp_pdu_str(enum bssgp_pdu_type pdu);
-int bssgp_tx_bvc_reset_nsei_bvci(uint16_t nsei, uint16_t bvci, enum gprs_bssgp_cause cause, const struct gprs_ra_id *ra_id, uint16_t cell_id);
-/* Transmit a simple response such as BLOCK/UNBLOCK/RESET ACK/NACK */
-int bssgp_tx_simple_bvci(uint8_t pdu_type, uint16_t nsei,
- uint16_t bvci, uint16_t ns_bvci);
-/* Chapter 10.4.14: Status */
-int bssgp_tx_status(uint8_t cause, uint16_t *bvci, struct msgb *orig_msg);
-
-enum bssgp_prim {
- PRIM_BSSGP_DL_UD,
- PRIM_BSSGP_UL_UD,
- PRIM_BSSGP_PTM_UD,
-
- PRIM_BSSGP_GMM_SUSPEND,
- PRIM_BSSGP_GMM_RESUME,
- PRIM_BSSGP_GMM_PAGING,
-
- PRIM_NM_FLUSH_LL,
- PRIM_NM_LLC_DISCARDED,
- PRIM_NM_BVC_RESET,
- PRIM_NM_BVC_BLOCK,
- PRIM_NM_BVC_UNBLOCK,
- PRIM_NM_STATUS,
-
- PRIM_BSSGP_RIM_PDU_TRANSFER,
-};
-
-struct osmo_bssgp_prim {
- struct osmo_prim_hdr oph;
-
- /* common fields */
- uint16_t nsei;
- uint16_t bvci;
- uint32_t tlli;
- struct tlv_parsed *tp;
- struct gprs_ra_id *ra_id;
-
- /* specific fields */
- union {
- struct {
- uint8_t suspend_ref;
- } resume;
- struct bssgp_ran_information_pdu rim_pdu;
- } u;
-};
-
-/* gprs_bssgp.c */
-
-/*! BSSGP flow control (SGSN side) According to Section 8.2 */
-struct bssgp_flow_control {
- uint32_t bucket_size_max; /*!< maximum size of the bucket (octets) */
- uint32_t bucket_leak_rate; /*!< leak rate of the bucket (octets/sec) */
-
- uint32_t bucket_counter; /*!< number of tokens in the bucket */
- struct timeval time_last_pdu; /*!< timestamp of last PDU sent */
-
- /* the built-in queue */
- uint32_t max_queue_depth; /*!< how many packets to queue (mgs) */
- uint32_t queue_depth; /*!< current length of queue (msgs) */
- struct llist_head queue; /*!< linked list of msgb's */
- struct osmo_timer_list timer; /*!< timer-based dequeueing */
-
- /*! callback to be called at output of flow control */
- int (*out_cb)(struct bssgp_flow_control *fc, struct msgb *msg,
- uint32_t llc_pdu_len, void *priv);
-};
-
-#define BVC_S_BLOCKED 0x0001
-
-/* The per-BTS context that we keep on the SGSN side of the BSSGP link */
-struct bssgp_bvc_ctx {
- struct llist_head list;
-
- struct gprs_ra_id ra_id; /*!< parsed RA ID of the remote BTS */
- uint16_t cell_id; /*!< Cell ID of the remote BTS */
-
- /* NSEI and BVCI of underlying Gb link. Together they
- * uniquely identify a link to a BTS (5.4.4) */
- uint16_t bvci;
- uint16_t nsei;
-
- uint32_t state;
-
- struct rate_ctr_group *ctrg;
-
- struct bssgp_flow_control *fc;
- /*! default maximum size of per-MS bucket in octets */
- uint32_t bmax_default_ms;
- /*! default bucket leak rate of per-MS bucket in octests/s */
- uint32_t r_default_ms;
-
- /*! BSS or SGSN. This defines the local state. */
- bool is_sgsn;
- /* we might want to add this as a shortcut later, avoiding the NSVC
- * lookup for every packet, similar to a routing cache */
- //struct gprs_nsvc *nsvc;
-};
-extern struct llist_head bssgp_bvc_ctxts;
-/* Create a BTS Context with BVCI+NSEI */
-struct bssgp_bvc_ctx *btsctx_alloc(uint16_t bvci, uint16_t nsei);
-/* Find a BTS Context based on parsed RA ID and Cell ID */
-struct bssgp_bvc_ctx *btsctx_by_raid_cid(const struct gprs_ra_id *raid, uint16_t cid);
-/* Find a BTS context based on BVCI+NSEI tuple */
-struct bssgp_bvc_ctx *btsctx_by_bvci_nsei(uint16_t bvci, uint16_t nsei);
-/* Free a given BTS context */
-void bssgp_bvc_ctx_free(struct bssgp_bvc_ctx *ctx);
-
-#define BVC_F_BLOCKED 0x0001
-
-enum bssgp_ctr {
- BSSGP_CTR_PKTS_IN,
- BSSGP_CTR_PKTS_OUT,
- BSSGP_CTR_BYTES_IN,
- BSSGP_CTR_BYTES_OUT,
- BSSGP_CTR_BLOCKED,
- BSSGP_CTR_DISCARDED,
- BSSGP_CTR_STATUS,
-};
-
-
-#include <osmocom/gsm/tlv.h>
-#include <osmocom/gprs/gprs_msgb.h>
-
-/* BSSGP-UL-UNITDATA.ind */
-int bssgp_rcvmsg(struct msgb *msg);
-
-/* BSSGP-DL-UNITDATA.req */
-struct bssgp_lv {
- uint16_t len;
- uint8_t *v;
-};
-/* parameters for BSSGP downlink userdata transmission */
-struct bssgp_dl_ud_par {
- uint32_t *tlli;
- char *imsi;
- struct bssgp_flow_control *fc;
- uint16_t drx_parms;
- /* FIXME: priority */
- struct bssgp_lv ms_ra_cap;
- uint8_t qos_profile[3];
-};
-int bssgp_tx_dl_ud(struct msgb *msg, uint16_t pdu_lifetime,
- struct bssgp_dl_ud_par *dup);
-
-uint16_t bssgp_parse_cell_id(struct gprs_ra_id *raid, const uint8_t *buf);
-int bssgp_create_cell_id(uint8_t *buf, const struct gprs_ra_id *raid,
- uint16_t cid);
-
-/* Wrapper around TLV parser to parse BSSGP IEs */
-static inline int bssgp_tlv_parse(struct tlv_parsed *tp, const uint8_t *buf, int len)
-{
- return tlv_parse(tp, &tvlv_att_def, buf, len, 0, 0);
-}
-
-/*! BSSGP Paging mode */
-enum bssgp_paging_mode {
- BSSGP_PAGING_PS,
- BSSGP_PAGING_CS,
-};
-
-/*! BSSGP Paging scope */
-enum bssgp_paging_scope {
- BSSGP_PAGING_BSS_AREA, /*!< all cells in BSS */
- BSSGP_PAGING_LOCATION_AREA, /*!< all cells in LA */
- BSSGP_PAGING_ROUTEING_AREA, /*!< all cells in RA */
- BSSGP_PAGING_BVCI, /*!< one cell */
-};
-
-/*! BSSGP paging information */
-struct bssgp_paging_info {
- enum bssgp_paging_mode mode; /*!< CS or PS paging */
- enum bssgp_paging_scope scope; /*!< bssgp_paging_scope */
- struct gprs_ra_id raid; /*!< RA Identifier */
- uint16_t bvci; /*!< BVCI */
- char *imsi; /*!< IMSI, if any */
- uint32_t *ptmsi; /*!< P-TMSI, if any */
- uint16_t drx_params; /*!< DRX parameters */
- uint8_t qos[3]; /*!< QoS parameters */
-};
-
-/* Send a single GMM-PAGING.req to a given NSEI/NS-BVCI */
-int bssgp_tx_paging(uint16_t nsei, uint16_t ns_bvci,
- struct bssgp_paging_info *pinfo);
-
-void bssgp_fc_init(struct bssgp_flow_control *fc,
- uint32_t bucket_size_max, uint32_t bucket_leak_rate,
- uint32_t max_queue_depth,
- int (*out_cb)(struct bssgp_flow_control *fc, struct msgb *msg,
- uint32_t llc_pdu_len, void *priv));
-
-/* input function of the flow control implementation, called first
- * for the MM flow control, and then as the MM flow control output
- * callback in order to perform BVC flow control */
-int bssgp_fc_in(struct bssgp_flow_control *fc, struct msgb *msg,
- uint32_t llc_pdu_len, void *priv);
-
-/* Initialize the Flow Control parameters for a new MS according to
- * default values for the BVC specified by BVCI and NSEI */
-int bssgp_fc_ms_init(struct bssgp_flow_control *fc_ms, uint16_t bvci,
- uint16_t nsei, uint32_t max_queue_depth);
-
-void bssgp_flush_all_queues(void);
-void bssgp_fc_flush_queue(struct bssgp_flow_control *fc);
-
-/* gprs_bssgp_vty.c */
-int bssgp_vty_init(void);
-void bssgp_set_log_ss(int ss) OSMO_DEPRECATED("Use DLBSSGP instead!\n");
-
-int bssgp_prim_cb(struct osmo_prim_hdr *oph, void *ctx);
+#pragma message "Header osmocom/gprs/gprs_bssgp.h is deprecated, include osmocom/gb/gprs_bssgp.h instead"
+#include <osmocom/gb/gprs_bssgp.h>
diff --git a/include/osmocom/gprs/gprs_bssgp2.h b/include/osmocom/gprs/gprs_bssgp2.h
index 53e76e3..cc827d9 100644
--- a/include/osmocom/gprs/gprs_bssgp2.h
+++ b/include/osmocom/gprs/gprs_bssgp2.h
@@ -1,72 +1,4 @@
#pragma once
-#include <stdint.h>
-#include <osmocom/gprs/protocol/gsm_08_18.h>
-#include <osmocom/gprs/gprs_ns2.h>
-
-struct bssgp2_flow_ctrl;
-struct gprs_ns2_inst;
-struct gprs_ra_id;
-struct msgb;
-
-struct bssgp2_flow_ctrl {
- uint8_t tag;
- /* maximum bucket size (Bmax) in bytes */
- uint64_t bucket_size_max;
- /*! bucket leak rate in _bytes_ per second */
- uint64_t bucket_leak_rate;
- /* percentage how full the given bucket is */
- uint8_t bucket_full_ratio;
- bool bucket_full_ratio_present;
- union {
- /*! FC-BVC specifi members */
- struct {
- /*! default maximum bucket size per MS in bytes */
- uint64_t bmax_default_ms;
- /*! default bucket leak rate (R) for MS flow control bucket */
- uint64_t r_default_ms;
-
- /*! average milliseconds of queueing delay for a BVC */
- uint32_t measurement;
- bool measurement_present;
- } bvc;
- /*! FC-MS specifi members */
- struct {
- /*! TLLI of the MS */
- uint32_t tlli;
- } ms;
- } u;
-};
-
-
-int bssgp2_nsi_tx_ptp(struct gprs_ns2_inst *nsi, uint16_t nsei, uint16_t bvci,
- struct msgb *msg, uint32_t lsp);
-
-int bssgp2_nsi_tx_sig(struct gprs_ns2_inst *nsi, uint16_t nsei, struct msgb *msg, uint32_t lsp);
-
-struct msgb *bssgp2_enc_bvc_block(uint16_t bvci, enum gprs_bssgp_cause cause);
-
-struct msgb *bssgp2_enc_bvc_block_ack(uint16_t bvci);
-
-struct msgb *bssgp2_enc_bvc_unblock(uint16_t bvci);
-
-struct msgb *bssgp2_enc_bvc_unblock_ack(uint16_t bvci);
-
-struct msgb *bssgp2_enc_bvc_reset(uint16_t bvci, enum gprs_bssgp_cause cause,
- const struct gprs_ra_id *ra_id, uint16_t cell_id,
- const uint8_t *feat_bm, const uint8_t *ext_feat_bm);
-
-struct msgb *bssgp2_enc_bvc_reset_ack(uint16_t bvci, const struct gprs_ra_id *ra_id, uint16_t cell_id,
- const uint8_t *feat_bm, const uint8_t *ext_feat_bm);
-
-struct msgb *bssgp2_enc_flush_ll(uint32_t tlli, uint16_t old_bvci,
- const uint16_t *new_bvci, const uint16_t *nsei);
-struct msgb *bssgp2_enc_status(uint8_t cause, const uint16_t *bvci, const struct msgb *orig_msg, uint16_t max_pdu_len);
-
-
-int bssgp2_dec_fc_bvc(struct bssgp2_flow_ctrl *fc, const struct tlv_parsed *tp);
-struct msgb *bssgp2_enc_fc_bvc(const struct bssgp2_flow_ctrl *fc, enum bssgp_fc_granularity *gran);
-struct msgb *bssgp2_enc_fc_bvc_ack(uint8_t tag);
-int bssgp2_dec_fc_ms(struct bssgp2_flow_ctrl *fc, struct tlv_parsed *tp);
-struct msgb *bssgp2_enc_fc_ms(const struct bssgp2_flow_ctrl *fc, enum bssgp_fc_granularity *gran);
-struct msgb *bssgp2_enc_fc_ms_ack(uint32_t tlli, uint8_t tag);
+#pragma message "Header osmocom/gprs/gprs_bssgp2.h is deprecated, include osmocom/gb/gprs_bssgp2.h instead"
+#include <osmocom/gb/gprs_bssgp2.h>
diff --git a/include/osmocom/gprs/gprs_bssgp_bss.h b/include/osmocom/gprs/gprs_bssgp_bss.h
index ab62b66..f0d86ef 100644
--- a/include/osmocom/gprs/gprs_bssgp_bss.h
+++ b/include/osmocom/gprs/gprs_bssgp_bss.h
@@ -1,75 +1,4 @@
-/*! \file gprs_bssgp_bss.h
- * GPRS BSSGP protocol implementation as per 3GPP TS 08.18 */
-/*
- * (C) 2009-2012 by Harald Welte <laforge@gnumonks.org>
- *
- * All Rights Reserved
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 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 General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- *
- */
-
#pragma once
-#include <osmocom/core/msgb.h>
-#include <osmocom/gprs/gprs_bssgp.h>
-
-uint8_t *bssgp_msgb_tlli_put(struct msgb *msg, uint32_t tlli);
-uint8_t *bssgp_msgb_ra_put(struct msgb *msg, const struct gprs_ra_id *ra_id);
-int bssgp_tx_bvc_ptp_reset(uint16_t nsei, enum gprs_bssgp_cause cause);
-int bssgp_tx_suspend(uint16_t nsei, uint32_t tlli,
- const struct gprs_ra_id *ra_id);
-
-int bssgp_tx_resume(uint16_t nsei, uint32_t tlli,
- const struct gprs_ra_id *ra_id, uint8_t suspend_ref);
-
-int bssgp_tx_ra_capa_upd(struct bssgp_bvc_ctx *bctx, uint32_t tlli, uint8_t tag);
-
-int bssgp_tx_radio_status_tlli(struct bssgp_bvc_ctx *bctx, uint8_t cause,
- uint32_t tlli);
-
-int bssgp_tx_radio_status_tmsi(struct bssgp_bvc_ctx *bctx, uint8_t cause,
- uint32_t tmsi);
-
-int bssgp_tx_radio_status_imsi(struct bssgp_bvc_ctx *bctx, uint8_t cause,
- const char *imsi);
-
-int bssgp_tx_flush_ll_ack(struct bssgp_bvc_ctx *bctx, uint32_t tlli,
- uint8_t action, uint16_t bvci_new,
- uint32_t num_octets);
-
-int bssgp_tx_llc_discarded(struct bssgp_bvc_ctx *bctx, uint32_t tlli,
- uint8_t num_frames, uint32_t num_octets);
-
-int bssgp_tx_bvc_block(struct bssgp_bvc_ctx *bctx, uint8_t cause);
-
-int bssgp_tx_bvc_unblock(struct bssgp_bvc_ctx *bctx);
-
-int bssgp_tx_bvc_reset(struct bssgp_bvc_ctx *bctx, uint16_t bvci, uint8_t cause);
-int bssgp_tx_bvc_reset2(struct bssgp_bvc_ctx *bctx, uint16_t bvci, uint8_t cause, bool add_cell_id);
-
-int bssgp_tx_ul_ud(struct bssgp_bvc_ctx *bctx, uint32_t tlli,
- const uint8_t *qos_profile, struct msgb *llc_pdu);
-
-int bssgp_rx_paging(struct bssgp_paging_info *pinfo,
- struct msgb *msg);
-
-int bssgp_tx_fc_bvc(struct bssgp_bvc_ctx *bctx, uint8_t tag,
- uint32_t bucket_size, uint32_t bucket_leak_rate,
- uint32_t bmax_default_ms, uint32_t r_default_ms,
- uint8_t *bucket_full_ratio, uint32_t *queue_delay_ms);
-
-int bssgp_tx_fc_ms(struct bssgp_bvc_ctx *bctx, uint32_t tlli, uint8_t tag,
- uint32_t ms_bucket_size, uint32_t bucket_leak_rate,
- uint8_t *bucket_full_ratio);
+#pragma message "Header osmocom/gprs/gprs_bssgp_bss.h is deprecated, include osmocom/gb/gprs_bssgp_bss.h instead"
+#include <osmocom/gb/gprs_bssgp_bss.h>
diff --git a/include/osmocom/gprs/gprs_bssgp_rim.h b/include/osmocom/gprs/gprs_bssgp_rim.h
index 5f397c9..831e5dc 100644
--- a/include/osmocom/gprs/gprs_bssgp_rim.h
+++ b/include/osmocom/gprs/gprs_bssgp_rim.h
@@ -1,272 +1,4 @@
-/*! \file gprs_bssgp.h
- * GPRS BSSGP RIM protocol implementation as per 3GPP TS 48.018. */
-/*
- * (C) 2020-2021 by sysmocom - s.f.m.c. GmbH
- * Author: Philipp Maier <pmaier@sysmocom.de>
- *
- * All Rights Reserved
- *
- * SPDX-License-Identifier: GPL-2.0+
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 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 General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- *
- */
-
#pragma once
-#include <osmocom/gsm/gsm48.h>
-#include <osmocom/gprs/protocol/gsm_08_18.h>
-#include <osmocom/gprs/protocol/gsm_24_301.h>
-
-enum bssgp_rim_routing_info_discr {
- BSSGP_RIM_ROUTING_INFO_GERAN,
- BSSGP_RIM_ROUTING_INFO_UTRAN,
- BSSGP_RIM_ROUTING_INFO_EUTRAN,
-};
-
-extern const struct value_string bssgp_rim_routing_info_discr_strs[];
-
-/*! Obtain a human-readable string for NACC Cause code */
-static inline const char *bssgp_rim_routing_info_discr_str(enum bssgp_rim_routing_info_discr val)
-{ return get_value_string(bssgp_rim_routing_info_discr_strs, val); }
-
-/*! BSSGP RIM Routing information, see also 3GPP TS 48.018, section 11.3.70 */
-struct bssgp_rim_routing_info {
- enum bssgp_rim_routing_info_discr discr;
- union {
- struct {
- struct gprs_ra_id raid;
- uint16_t cid;
- } geran;
- struct {
- struct gprs_ra_id raid;
- uint16_t rncid;
- } utran;
- struct {
- struct osmo_eutran_tai tai;
- /* See also 3GPP TS 36.413 9.2.1.37 and 3GPP TS 36.401 */
- uint8_t global_enb_id[8];
- uint8_t global_enb_id_len;
- } eutran;
- };
-};
-
-/* The encoded result of the rim routing information is, depending on the
- * address type (discr) of variable length. */
-#define BSSGP_RIM_ROUTING_INFO_MAXLEN 14
-
-char *bssgp_rim_ri_name_buf(char *buf, size_t buf_len, const struct bssgp_rim_routing_info *ri);
-const char *bssgp_rim_ri_name(const struct bssgp_rim_routing_info *ri);
-int bssgp_parse_rim_ri(struct bssgp_rim_routing_info *ri, const uint8_t *buf, unsigned int len);
-int bssgp_create_rim_ri(uint8_t *buf, const struct bssgp_rim_routing_info *ri);
-
-/* 3GPP TS 48.018, table 11.3.63.1.1: RAN-INFORMATION-REQUEST Application Container coding for NACC */
-struct bssgp_ran_inf_req_app_cont_nacc {
- struct osmo_cell_global_id_ps reprt_cell;
-};
-
-int bssgp_dec_ran_inf_req_app_cont_nacc(struct bssgp_ran_inf_req_app_cont_nacc *cont, const uint8_t *buf, size_t len);
-int bssgp_enc_ran_inf_req_app_cont_nacc(uint8_t *buf, size_t len, const struct bssgp_ran_inf_req_app_cont_nacc *cont);
-
-/* Length of NACC system information, see also: 3GPP TS 48.018 11.3.63.2.1 */
-#define BSSGP_RIM_SI_LEN 21
-#define BSSGP_RIM_PSI_LEN 22
-
-/* 3GPP TS 48.018, table 11.3.63.2.1.a: RAN-INFORMATION Application Container coding for NACC */
-struct bssgp_ran_inf_app_cont_nacc {
- struct osmo_cell_global_id_ps reprt_cell;
- bool type_psi;
- uint8_t num_si;
-
- /* Pointer to system information messages */
- const uint8_t *si[127];
-};
-
-int bssgp_dec_ran_inf_app_cont_nacc(struct bssgp_ran_inf_app_cont_nacc *cont, const uint8_t *buf, size_t len);
-int bssgp_enc_ran_inf_app_cont_nacc(uint8_t *buf, size_t len, const struct bssgp_ran_inf_app_cont_nacc *cont);
-
-/* 3GPP TS 48.018, table 11.3.64.1.b, NACC Cause coding */
-enum bssgp_nacc_cause {
- BSSGP_NACC_CAUSE_UNSPEC,
- BSSGP_NACC_CAUSE_SYNTAX_ERR,
- BSSGP_NACC_CAUSE_RPRT_CELL_MISSMTCH,
- BSSGP_NACC_CAUSE_SIPSI_TYPE_ERR,
- BSSGP_NACC_CAUSE_SIPSI_LEN_ERR,
- BSSGP_NACC_CAUSE_SIPSI_SET_ERR,
-};
-
-extern const struct value_string bssgp_nacc_cause_strs[];
-
-/*! Obtain a human-readable string for NACC Cause code */
-static inline const char *bssgp_nacc_cause_str(enum bssgp_nacc_cause val)
-{ return get_value_string(bssgp_nacc_cause_strs, val); }
-
-/* 3GPP TS 48.018, table 11.3.64.1.a, Application Error Container coding for NACC */
-struct bssgp_app_err_cont_nacc {
- enum bssgp_nacc_cause nacc_cause;
-
- /* Pointer to errornous application container */
- const uint8_t *err_app_cont;
- size_t err_app_cont_len;
-};
-
-int bssgp_dec_app_err_cont_nacc(struct bssgp_app_err_cont_nacc *cont, const uint8_t *buf, size_t len);
-int bssgp_enc_app_err_cont_nacc(uint8_t *buf, size_t len, const struct bssgp_app_err_cont_nacc *cont);
-
-/* 3GPP TS 48.018, table 11.3.61.b: RIM Application Identity coding */
-enum bssgp_ran_inf_app_id {
- BSSGP_RAN_INF_APP_ID_NACC = 1,
- BSSGP_RAN_INF_APP_ID_SI3 = 2,
- BSSGP_RAN_INF_APP_ID_MBMS = 3,
- BSSGP_RAN_INF_APP_ID_SON = 4,
- BSSGP_RAN_INF_APP_ID_UTRA_SI = 5,
-};
-
-extern const struct value_string bssgp_ran_inf_app_id_strs[];
-
-/*! Obtain a human-readable string for RIM Application Identity code */
-static inline const char *bssgp_ran_inf_app_id_str(enum bssgp_ran_inf_app_id val)
-{ return get_value_string(bssgp_ran_inf_app_id_strs, val); }
-
-/* 3GPP TS 48.018, table 11.3.62a.1.b: RAN-INFORMATION-REQUEST RIM Container Contents */
-struct bssgp_ran_inf_req_rim_cont {
- enum bssgp_ran_inf_app_id app_id;
- uint32_t seq_num;
- struct bssgp_rim_pdu_ind pdu_ind;
- uint8_t prot_ver;
-
- /* Nested application container */
- union {
- struct bssgp_ran_inf_req_app_cont_nacc app_cont_nacc;
- /* TODO: add containers for Si3, MBMS, SON, UTRA-SI */
- } u;
-
- /* Pointer to SON-transfer application identity, only present if app_id is indicating "son-transfer",
- * see also 3GPP TS 48.018, section 11.3.108 and 3GPP TS 36.413 annex B.1.1 */
- const uint8_t *son_trans_app_id;
- size_t son_trans_app_id_len;
-};
-
-int bssgp_dec_ran_inf_req_rim_cont(struct bssgp_ran_inf_req_rim_cont *cont, const uint8_t *buf, size_t len);
-int bssgp_enc_ran_inf_req_rim_cont(uint8_t *buf, size_t len, const struct bssgp_ran_inf_req_rim_cont *cont);
-
-/* 3GPP TS 48.018, table 11.3.62a.2.b: RAN-INFORMATION RIM Container Contents */
-struct bssgp_ran_inf_rim_cont {
- enum bssgp_ran_inf_app_id app_id;
- uint32_t seq_num;
- struct bssgp_rim_pdu_ind pdu_ind;
- uint8_t prot_ver;
- bool app_err;
-
- /* Nested application container */
- union {
- struct bssgp_ran_inf_app_cont_nacc app_cont_nacc;
- struct bssgp_app_err_cont_nacc app_err_cont_nacc;
- /* TODO: add containers for Si3, MBMS, SON, UTRA-SI */
- } u;
-
- /* Pointer to SON-transfer application identity, only present if app_id is indicating "son-transfer",
- * see also 3GPP TS 48.018, section 11.3.108 and 3GPP TS 36.413 annex B.1.1 */
- const uint8_t *son_trans_app_id;
- size_t son_trans_app_id_len;
-};
-
-int bssgp_dec_ran_inf_rim_cont(struct bssgp_ran_inf_rim_cont *cont, const uint8_t *buf, size_t len);
-int bssgp_enc_ran_inf_rim_cont(uint8_t *buf, size_t len, const struct bssgp_ran_inf_rim_cont *cont);
-
-/* 3GPP TS 48.018, table 11.3.62a.3.b: RAN-INFORMATION-ACK RIM Container Contents */
-struct bssgp_ran_inf_ack_rim_cont {
- enum bssgp_ran_inf_app_id app_id;
- uint32_t seq_num;
- uint8_t prot_ver;
-
- /* Pointer to SON-transfer application identity, only present if app_id is indicating "son-transfer",
- * see also 3GPP TS 48.018, section 11.3.108 and 3GPP TS 36.413 annex B.1.1 */
- const uint8_t *son_trans_app_id;
- size_t son_trans_app_id_len;
-};
-
-int bssgp_dec_ran_inf_ack_rim_cont(struct bssgp_ran_inf_ack_rim_cont *cont, const uint8_t *buf, size_t len);
-int bssgp_enc_ran_inf_ack_rim_cont(uint8_t *buf, size_t len, const struct bssgp_ran_inf_ack_rim_cont *cont);
-
-/* 3GPP TS 48.018, table 11.3.62a.4.b: RAN-INFORMATION-ERROR RIM Container Contents */
-struct bssgp_ran_inf_err_rim_cont {
- enum bssgp_ran_inf_app_id app_id;
- uint8_t cause;
- uint8_t prot_ver;
-
- /* Pointer to (encoded) errornous PDU,
- * see also: 3GPP TS 48.018, section 11.3.24 */
- const uint8_t *err_pdu;
- size_t err_pdu_len;
-
- /* Pointer to SON-transfer application identity, only present if app_id is indicating "son-transfer",
- * see also 3GPP TS 48.018, section 11.3.108 and 3GPP TS 36.413 annex B.1.1 */
- const uint8_t *son_trans_app_id;
- size_t son_trans_app_id_len;
-};
-
-int bssgp_dec_ran_inf_err_rim_cont(struct bssgp_ran_inf_err_rim_cont *cont, const uint8_t *buf, size_t len);
-int bssgp_enc_ran_inf_err_rim_cont(uint8_t *buf, size_t len, const struct bssgp_ran_inf_err_rim_cont *cont);
-
-/* 3GPP TS 48.018, table 11.3.62a.5.b: RAN-INFORMATION-APPLICATION-ERROR RIM Container Contents */
-struct bssgp_ran_inf_app_err_rim_cont {
- enum bssgp_ran_inf_app_id app_id;
- uint32_t seq_num;
- struct bssgp_rim_pdu_ind pdu_ind;
- uint8_t prot_ver;
-
- /* Nested application container */
- union {
- struct bssgp_app_err_cont_nacc app_err_cont_nacc;
- /* TODO: add containers for Si3, MBMS, SON, UTRA-SI */
- } u;
-};
-
-int bssgp_dec_ran_inf_app_err_rim_cont(struct bssgp_ran_inf_app_err_rim_cont *cont, const uint8_t *buf, size_t len);
-int bssgp_enc_ran_inf_app_err_rim_cont(uint8_t *buf, size_t len, const struct bssgp_ran_inf_app_err_rim_cont *cont);
-
-/* Chapter 10.6.1: RAN-INFORMATION-REQUEST */
-struct bssgp_ran_information_pdu {
- struct bssgp_rim_routing_info routing_info_dest;
- struct bssgp_rim_routing_info routing_info_src;
-
- /* Encoded variant of the RIM container */
- uint8_t rim_cont_iei;
- const uint8_t *rim_cont;
- unsigned int rim_cont_len;
-
- /* Decoded variant of the RIM container */
- bool decoded_present;
- union {
- struct bssgp_ran_inf_req_rim_cont req_rim_cont;
- struct bssgp_ran_inf_rim_cont rim_cont;
- struct bssgp_ran_inf_ack_rim_cont ack_rim_cont;
- struct bssgp_ran_inf_err_rim_cont err_rim_cont;
- struct bssgp_ran_inf_app_err_rim_cont app_err_rim_cont;
- } decoded;
-
- /* When receiving a PDU from BSSGP the encoded variant of the RIM
- * container will always be present. The decoded variant will be
- * present in addition whenever BSSGP was able to decode the container.
- *
- * When sending a PDU to BSSGP, then the decoded variant is used when
- * it is available. The encoded variant (if present) will be ignored
- * then. */
-};
-
-int bssgp_parse_rim_pdu(struct bssgp_ran_information_pdu *pdu, const struct msgb *msg);
-struct msgb *bssgp_encode_rim_pdu(const struct bssgp_ran_information_pdu *pdu);
-
-int bssgp_tx_rim(const struct bssgp_ran_information_pdu *pdu, uint16_t nsei);
+#pragma message "Header osmocom/gprs/gprs_bssgp_rim.h is deprecated, include osmocom/gb/gprs_bssgp_rim.h instead"
+#include <osmocom/gb/gprs_bssgp_rim.h>
diff --git a/include/osmocom/gprs/gprs_msgb.h b/include/osmocom/gprs/gprs_msgb.h
index 3f48b5b..960812c 100644
--- a/include/osmocom/gprs/gprs_msgb.h
+++ b/include/osmocom/gprs/gprs_msgb.h
@@ -1,33 +1,4 @@
-/*! \file gprs_msgb.h */
-
#pragma once
-#include <stdint.h>
-/*! the data structure stored in msgb->cb for libgb apps */
-struct libgb_msgb_cb {
- unsigned char *bssgph;
- unsigned char *llch;
-
- /*! Cell Identifier */
- unsigned char *bssgp_cell_id;
-
- /*! Identifiers of a BTS, equal to 'struct bssgp_bts_ctx' */
- uint16_t nsei;
- uint16_t bvci;
-
- /*! Identifier of a MS (inside BTS), equal to 'struct sgsn_mm_ctx' */
- uint32_t tlli;
-} __attribute__((packed, may_alias));
-#define LIBGB_MSGB_CB(__msgb) ((struct libgb_msgb_cb *)&((__msgb)->cb[0]))
-#define msgb_tlli(__x) LIBGB_MSGB_CB(__x)->tlli
-#define msgb_nsei(__x) LIBGB_MSGB_CB(__x)->nsei
-#define msgb_bvci(__x) LIBGB_MSGB_CB(__x)->bvci
-#define msgb_gmmh(__x) (__x)->l3h
-#define msgb_bssgph(__x) LIBGB_MSGB_CB(__x)->bssgph
-#define msgb_bssgp_len(__x) ((__x)->tail - (uint8_t *)msgb_bssgph(__x))
-#define msgb_bcid(__x) LIBGB_MSGB_CB(__x)->bssgp_cell_id
-#define msgb_llch(__x) LIBGB_MSGB_CB(__x)->llch
-
-#include <osmocom/core/logging.h>
-int gprs_log_filter_fn(const struct log_context *ctx,
- struct log_target *tar);
+#pragma message "Header osmocom/gprs/gprs_msgb.h is deprecated, include osmocom/gb/gprs_msgb.h instead"
+#include <osmocom/gb/gprs_msgb.h>
diff --git a/include/osmocom/gprs/gprs_ns.h b/include/osmocom/gprs/gprs_ns.h
index af25825..87cf49a 100644
--- a/include/osmocom/gprs/gprs_ns.h
+++ b/include/osmocom/gprs/gprs_ns.h
@@ -1,258 +1,4 @@
-/*! \file gprs_ns.h */
-
#pragma once
-#include <stdint.h>
-
-/* Our Implementation */
-#include <netinet/in.h>
-#include <osmocom/core/linuxlist.h>
-#include <osmocom/core/msgb.h>
-#include <osmocom/core/timer.h>
-#include <osmocom/core/select.h>
-#include <osmocom/gprs/gprs_msgb.h>
-
-#include <osmocom/gprs/protocol/gsm_08_16.h>
-
-#define NS_TIMERS_COUNT 8
-#define NS_TIMERS "(tns-block|tns-block-retries|tns-reset|tns-reset-retries|tns-test|tns-alive|tns-alive-retries|tsns-prov)"
-#define NS_TIMERS_HELP \
- "(un)blocking Timer (Tns-block) timeout\n" \
- "(un)blocking Timer (Tns-block) number of retries\n" \
- "Reset Timer (Tns-reset) timeout\n" \
- "Reset Timer (Tns-reset) number of retries\n" \
- "Test Timer (Tns-test) timeout\n" \
- "Alive Timer (Tns-alive) timeout\n" \
- "Alive Timer (Tns-alive) number of retries\n" \
- "SNS Provision Timer (Tsns-prov) timeout\n"
-
-/* Educated guess - LLC user payload is 1500 bytes plus possible headers */
-#define NS_ALLOC_SIZE 3072
-#define NS_ALLOC_HEADROOM 20
-
-enum ns_timeout {
- NS_TOUT_TNS_BLOCK,
- NS_TOUT_TNS_BLOCK_RETRIES,
- NS_TOUT_TNS_RESET,
- NS_TOUT_TNS_RESET_RETRIES,
- NS_TOUT_TNS_TEST,
- NS_TOUT_TNS_ALIVE,
- NS_TOUT_TNS_ALIVE_RETRIES,
- NS_TOUT_TSNS_PROV,
-};
-
-#define NSE_S_BLOCKED 0x0001
-#define NSE_S_ALIVE 0x0002
-#define NSE_S_RESET 0x0004
-
-#define NS_DESC_B(st) ((st) & NSE_S_BLOCKED ? "BLOCKED" : "UNBLOCKED")
-#define NS_DESC_A(st) ((st) & NSE_S_ALIVE ? "ALIVE" : "DEAD")
-#define NS_DESC_R(st) ((st) & NSE_S_RESET ? "RESET" : "UNRESET")
-
-/*! Osmocom NS link layer types */
-enum gprs_ns_ll {
- GPRS_NS_LL_UDP, /*!< NS/UDP/IP */
- GPRS_NS_LL_E1, /*!< NS/E1 */
- GPRS_NS_LL_FR_GRE, /*!< NS/FR/GRE/IP */
-};
-
-/*! Osmoco NS events */
-enum gprs_ns_evt {
- GPRS_NS_EVT_UNIT_DATA,
-};
-
-/*! Osmocom NS VC create status */
-enum gprs_ns_cs {
- GPRS_NS_CS_CREATED, /*!< A NSVC object has been created */
- GPRS_NS_CS_FOUND, /*!< A NSVC object has been found */
- GPRS_NS_CS_REJECTED, /*!< Rejected and answered message */
- GPRS_NS_CS_SKIPPED, /*!< Skipped message */
- GPRS_NS_CS_ERROR, /*!< Failed to process message */
-};
-
-struct gprs_nsvc;
-/*! Osmocom GPRS callback function type */
-typedef int gprs_ns_cb_t(enum gprs_ns_evt event, struct gprs_nsvc *nsvc,
- struct msgb *msg, uint16_t bvci);
-
-/*! An instance of the NS protocol stack */
-struct gprs_ns_inst {
- /*! callback to the user for incoming UNIT DATA IND */
- gprs_ns_cb_t *cb;
-
- /*! linked lists of all NSVC in this instance */
- struct llist_head gprs_nsvcs;
-
- /*! a NSVC object that's needed to deal with packets for
- * unknown NSVC */
- struct gprs_nsvc *unknown_nsvc;
-
- uint16_t timeout[NS_TIMERS_COUNT];
-
- /*! NS-over-IP specific bits */
- struct {
- struct osmo_fd fd;
- uint32_t local_ip;
- uint16_t local_port;
- uint32_t remote_ip;
- uint16_t remote_port;
- int dscp;
- /*! IPA compatibility: NS-RESET/BLOCK/UNBLOCK even on IP-SNS */
- bool use_reset_block_unblock;
- } nsip;
- /*! NS-over-FR-over-GRE-over-IP specific bits */
- struct {
- struct osmo_fd fd;
- uint32_t local_ip;
- unsigned int enabled:1;
- } frgre;
-
- struct osmo_fsm_inst *bss_sns_fi;
-};
-
-enum nsvc_timer_mode {
- /* standard timers */
- NSVC_TIMER_TNS_TEST,
- NSVC_TIMER_TNS_ALIVE,
- NSVC_TIMER_TNS_RESET,
- _NSVC_TIMER_NR,
-};
-
-/*! Structure representing a single NS-VC */
-struct gprs_nsvc {
- /*! list of NS-VCs within NS Instance */
- struct llist_head list;
- /*! pointer to NS Instance */
- struct gprs_ns_inst *nsi;
-
- uint16_t nsei; /*! end-to-end significance */
- uint16_t nsvci; /*! uniquely identifies NS-VC at SGSN */
-
- uint32_t state;
- uint32_t remote_state;
-
- struct osmo_timer_list timer;
- enum nsvc_timer_mode timer_mode;
- struct timeval timer_started;
- int alive_retries;
-
- unsigned int remote_end_is_sgsn:1;
- unsigned int persistent:1;
- unsigned int nsvci_is_valid:1;
-
- struct rate_ctr_group *ctrg;
- struct osmo_stat_item_group *statg;
-
- /*! which link-layer are we based on? */
- enum gprs_ns_ll ll;
-
- /*! make sure to always keep bts_addr as first struct member to not break the assumption
- that those structs are similar */
- union {
- struct {
- struct sockaddr_in bts_addr;
- } ip;
- struct {
- struct sockaddr_in bts_addr;
- } frgre;
- };
- /*! signalling weight. 0 = don't use for signalling (BVCI == 0)*/
- uint8_t sig_weight;
- /*! signaling weight. 0 = don't use for user data (BVCI != 0) */
- uint8_t data_weight;
-};
-
-/* Create a new NS protocol instance */
-struct gprs_ns_inst *gprs_ns_instantiate(gprs_ns_cb_t *cb, void *ctx);
-
-/* Close a NS protocol instance */
-void gprs_ns_close(struct gprs_ns_inst *nsi);
-
-/* Close and Destroy a NS protocol instance */
-void gprs_ns_destroy(struct gprs_ns_inst *nsi);
-
-/* Listen for incoming GPRS packets via NS/UDP */
-int gprs_ns_nsip_listen(struct gprs_ns_inst *nsi);
-
-/* Establish a connection (from the BSS) to the SGSN */
-struct gprs_nsvc *gprs_ns_nsip_connect(struct gprs_ns_inst *nsi,
- struct sockaddr_in *dest,
- uint16_t nsei, uint16_t nsvci);
-
-/* Establish a connection (from the BSS) to the SGSN using IP SNS */
-struct gprs_nsvc *gprs_ns_nsip_connect_sns(struct gprs_ns_inst *nsi, struct sockaddr_in *dest,
- uint16_t nsei, uint16_t nsvci);
-
-struct sockaddr_in;
-
-/* main function for higher layers (BSSGP) to send NS messages */
-int gprs_ns_sendmsg(struct gprs_ns_inst *nsi, struct msgb *msg);
-
-/* Receive incoming NS message from underlying transport layer */
-int gprs_ns_rcvmsg(struct gprs_ns_inst *nsi, struct msgb *msg,
- struct sockaddr_in *saddr, enum gprs_ns_ll ll);
-
-
-int gprs_ns_tx_alive(struct gprs_nsvc *nsvc);
-int gprs_ns_tx_alive_ack(struct gprs_nsvc *nsvc);
-int gprs_ns_tx_reset(struct gprs_nsvc *nsvc, uint8_t cause);
-int gprs_ns_tx_block(struct gprs_nsvc *nsvc, uint8_t cause);
-int gprs_ns_tx_unblock(struct gprs_nsvc *nsvc);
-
-/* Listen for incoming GPRS packets via NS/FR/GRE */
-int gprs_ns_frgre_listen(struct gprs_ns_inst *nsi);
-
-struct gprs_nsvc *gprs_nsvc_create2(struct gprs_ns_inst *nsi, uint16_t nsvci,
- uint8_t sig_weight, uint8_t data_weight);
-void gprs_nsvc_delete(struct gprs_nsvc *nsvc);
-struct gprs_nsvc *gprs_nsvc_by_nsei(struct gprs_ns_inst *nsi, uint16_t nsei);
-struct gprs_nsvc *gprs_nsvc_by_nsvci(struct gprs_ns_inst *nsi, uint16_t nsvci);
-struct gprs_nsvc *gprs_nsvc_by_rem_addr(struct gprs_ns_inst *nsi, const struct sockaddr_in *sin);
-
-/* Initiate a RESET procedure (including timer start, ...)*/
-int gprs_nsvc_reset(struct gprs_nsvc *nsvc, uint8_t cause);
-
-/* Add NS-specific VTY stuff */
-int gprs_ns_vty_init(struct gprs_ns_inst *nsi);
-
-/* Resturn peer info as string (NOTE: the buffer is allocated statically) */
-const char *gprs_ns_ll_str(const struct gprs_nsvc *nsvc);
-/* Return peer info in user-supplied buffer */
-char *gprs_ns_ll_str_buf(char *buf, size_t buf_len, const struct gprs_nsvc *nsvc);
-char *gprs_ns_ll_str_c(const void *ctx, const struct gprs_nsvc *nsvc);
-
-/* Copy the link layer info from other into nsvc */
-void gprs_ns_ll_copy(struct gprs_nsvc *nsvc, struct gprs_nsvc *other);
-
-/* Clear the link layer info (will never match a real link then) */
-void gprs_ns_ll_clear(struct gprs_nsvc *nsvc);
-
-struct msgb *gprs_ns_msgb_alloc(void);
-
-enum signal_ns {
- S_NS_RESET,
- S_NS_BLOCK,
- S_NS_UNBLOCK,
- S_NS_ALIVE_EXP, /* Tns-alive expired more than N times */
- S_NS_REPLACED, /* nsvc object is replaced (sets old_nsvc) */
- S_NS_MISMATCH, /* got an unexpected IE (sets msg, pdu_type, ie_type) */
- S_SNS_CONFIGURED, /* IP-SNS configuration completed */
-};
-
-extern const struct value_string gprs_ns_signal_ns_names[];
-const char *gprs_ns_cause_str(enum ns_cause cause);
-
-struct ns_signal_data {
- struct gprs_nsvc *nsvc;
- struct gprs_nsvc *old_nsvc;
- uint8_t cause;
- uint8_t pdu_type;
- uint8_t ie_type;
- struct msgb *msg;
-};
-
-void gprs_ns_set_log_ss(int ss);
-
-char *gprs_nsvc_state_append(char *s, struct gprs_nsvc *nsvc);
-
-/*! @} */
+#pragma message "Header osmocom/gprs/gprs_ns.h is deprecated, include osmocom/gb/gprs_ns.h instead"
+#include <osmocom/gb/gprs_ns.h>
diff --git a/include/osmocom/gprs/gprs_ns2.h b/include/osmocom/gprs/gprs_ns2.h
index a9c144c..f836981 100644
--- a/include/osmocom/gprs/gprs_ns2.h
+++ b/include/osmocom/gprs/gprs_ns2.h
@@ -1,276 +1,4 @@
-/*! \file gprs_ns2.h */
-
-
#pragma once
-#include <stdint.h>
-#include <netinet/in.h>
-
-#include <osmocom/core/prim.h>
-#include <osmocom/gprs/protocol/gsm_08_16.h>
-#include <osmocom/gprs/frame_relay.h>
-
-struct osmo_sockaddr;
-struct osmo_sockaddr_str;
-struct osmo_fr_network;
-
-struct gprs_ns2_inst;
-struct gprs_ns2_nse;
-struct gprs_ns2_vc;
-struct gprs_ns2_vc_bind;
-struct gprs_ns2_vc_driver;
-struct gprs_ns_ie_ip4_elem;
-struct gprs_ns_ie_ip6_elem;
-
-enum gprs_ns2_vc_mode {
- /*! The VC will use RESET/BLOCK/UNBLOCK to start the connection and do ALIVE/ACK.
- * This is what is needed for Frame Relay transport, and if you use a R97/R99 Gb
- * interface over an IP transport (never standardized by 3GPP) */
- GPRS_NS2_VC_MODE_BLOCKRESET,
- /*! The VC will only use ALIVE/ACK (no RESET/BLOCK/UNBLOCK), which is for Gb-IP
- * interface compliant to 3GPP Rel=4 or later. */
- GPRS_NS2_VC_MODE_ALIVE,
-};
-
-enum gprs_ns2_dialect {
- GPRS_NS2_DIALECT_UNDEF,
- GPRS_NS2_DIALECT_STATIC_ALIVE,
- GPRS_NS2_DIALECT_STATIC_RESETBLOCK,
- GPRS_NS2_DIALECT_IPACCESS,
- GPRS_NS2_DIALECT_SNS,
-};
-
-/*! Osmocom NS link layer types */
-enum gprs_ns2_ll {
- GPRS_NS2_LL_UNDEF, /*!< undefined, used by vty */
- GPRS_NS2_LL_UDP, /*!< NS/UDP/IP */
- GPRS_NS2_LL_FR, /*!< NS/FR */
- GPRS_NS2_LL_FR_GRE, /*!< NS/FR/GRE/IP */
-};
-
-/*! Osmocom NS primitives according to 48.016 5.2 Service primitives */
-enum gprs_ns2_prim {
- GPRS_NS2_PRIM_UNIT_DATA,
- GPRS_NS2_PRIM_CONGESTION,
- GPRS_NS2_PRIM_STATUS,
-};
-
-extern const struct value_string gprs_ns2_prim_strs[];
-extern const struct value_string gprs_ns2_lltype_strs[];
-
-/*! Obtain a human-readable string for NS primitives */
-static inline const char *gprs_ns2_prim_str(enum gprs_ns2_prim val)
-{ return get_value_string(gprs_ns2_prim_strs, val); }
-
-/*! Obtain a human-readable string for NS link-layer type */
-static inline const char *gprs_ns2_lltype_str(enum gprs_ns2_ll val)
-{ return get_value_string(gprs_ns2_lltype_strs, val); }
-
-/*! Osmocom NS primitives according to 48.016 5.2.2.4 Service primitives */
-enum gprs_ns2_congestion_cause {
- GPRS_NS2_CONG_CAUSE_BACKWARD_BEGIN,
- GPRS_NS2_CONG_CAUSE_BACKWARD_END,
- GPRS_NS2_CONG_CAUSE_FORWARD_BEGIN,
- GPRS_NS2_CONG_CAUSE_FORWARD_END,
-};
-
-/*! Osmocom NS primitives according to 48.016 5.2.2.6 Service primitives */
-enum gprs_ns2_affecting_cause {
- GPRS_NS2_AFF_CAUSE_VC_FAILURE,
- GPRS_NS2_AFF_CAUSE_VC_RECOVERY,
- GPRS_NS2_AFF_CAUSE_FAILURE,
- GPRS_NS2_AFF_CAUSE_RECOVERY,
- /* osmocom own causes */
- GPRS_NS2_AFF_CAUSE_SNS_CONFIGURED,
- GPRS_NS2_AFF_CAUSE_SNS_FAILURE,
- GPRS_NS2_AFF_CAUSE_SNS_NO_ENDPOINTS,
- GPRS_NS2_AFF_CAUSE_MTU_CHANGE,
-};
-
-extern const struct value_string gprs_ns2_aff_cause_prim_strs[];
-
-/*! Obtain a human-readable string for NS affecting cause in primitives */
-static inline const char *gprs_ns2_aff_cause_prim_str(enum gprs_ns2_affecting_cause val)
-{ return get_value_string(gprs_ns2_aff_cause_prim_strs, val); }
-
-/*! Osmocom NS primitives according to 48.016 5.2.2.7 Service primitives */
-enum gprs_ns2_change_ip_endpoint {
- GRPS_NS2_ENDPOINT_NO_CHANGE,
- GPRS_NS2_ENDPOINT_REQUEST_CHANGE,
- GPRS_NS2_ENDPOINT_CONFIRM_CHANGE,
-};
-
-extern const struct value_string gprs_ns2_cause_strs[];
-
-/*! Obtain a human-readable string for NS primitives */
-static inline const char *gprs_ns2_cause_str(enum ns_cause val)
-{ return get_value_string(gprs_ns2_cause_strs, val); }
-
-struct osmo_gprs_ns2_prim {
- struct osmo_prim_hdr oph;
-
- uint16_t nsei;
- uint16_t bvci;
-
- union {
- struct {
- enum gprs_ns2_change_ip_endpoint change;
- uint32_t link_selector;
- /* TODO: implement resource distribution
- * add place holder for the link selector */
- long long _resource_distribution_placeholder1;
- long long _resource_distribution_placeholder2;
- long long _resource_distribution_placeholder3;
- } unitdata;
- struct {
- enum gprs_ns2_congestion_cause cause;
- } congestion;
- struct {
- enum gprs_ns2_affecting_cause cause;
- char *nsvc;
- /* 48.016 5.2.2.6 transfer capability */
- int transfer;
- /* osmocom specific */
- /* Persistent NSE/NSVC are configured by vty */
- bool persistent;
- /* Only true on the first time it's available.
- * Allow the BSSGP layer to reset persistent NSE */
- bool first;
- /* MTU of a NS SDU. It's the lowest MTU of all (alive & dead) NSVCs */
- uint16_t mtu;
- } status;
- } u;
-};
-
-/* instance */
-struct gprs_ns2_inst *gprs_ns2_instantiate(void *ctx, osmo_prim_cb cb, void *cb_data);
-void gprs_ns2_free(struct gprs_ns2_inst *inst);
-
-/* Entrypoint for primitives from the NS USER */
-int gprs_ns2_recv_prim(struct gprs_ns2_inst *nsi, struct osmo_prim_hdr *oph);
-
-/*! a callback to iterate over all NSVC */
-typedef int (*gprs_ns2_foreach_nsvc_cb)(struct gprs_ns2_vc *nsvc, void *ctx);
-
-int gprs_ns2_nse_foreach_nsvc(struct gprs_ns2_nse *nse,
- gprs_ns2_foreach_nsvc_cb cb, void *cb_data);
-struct gprs_ns2_nse *gprs_ns2_nse_by_nsei(struct gprs_ns2_inst *nsi, uint16_t nsei);
-struct gprs_ns2_nse *gprs_ns2_create_nse(struct gprs_ns2_inst *nsi, uint16_t nsei,
- enum gprs_ns2_ll linklayer,
- enum gprs_ns2_dialect dialect);
-struct gprs_ns2_nse *gprs_ns2_create_nse2(struct gprs_ns2_inst *nsi, uint16_t nsei,
- enum gprs_ns2_ll linklayer,
- enum gprs_ns2_dialect dialect, bool local_sgsn_role);
-uint16_t gprs_ns2_nse_nsei(struct gprs_ns2_nse *nse);
-void gprs_ns2_free_nse(struct gprs_ns2_nse *nse);
-void gprs_ns2_free_nses(struct gprs_ns2_inst *nsi);
-
-/* create vc */
-void gprs_ns2_free_nsvc(struct gprs_ns2_vc *nsvc);
-void gprs_ns2_free_nsvcs(struct gprs_ns2_nse *nse);
-struct gprs_ns2_vc *gprs_ns2_nsvc_by_nsvci(struct gprs_ns2_inst *nsi, uint16_t nsvci);
-
-/* generic VL driver */
-struct gprs_ns2_vc_bind *gprs_ns2_bind_by_name(struct gprs_ns2_inst *nsi,
- const char *name);
-
-/* IP VL driver */
-int gprs_ns2_ip_bind(struct gprs_ns2_inst *nsi,
- const char *name,
- const struct osmo_sockaddr *local,
- int dscp,
- struct gprs_ns2_vc_bind **result);
-struct gprs_ns2_vc_bind *gprs_ns2_ip_bind_by_sockaddr(struct gprs_ns2_inst *nsi,
- const struct osmo_sockaddr *sockaddr);
-
-/* FR VL driver */
-struct gprs_ns2_vc_bind *gprs_ns2_fr_bind_by_netif(
- struct gprs_ns2_inst *nsi,
- const char *netif);
-const char *gprs_ns2_fr_bind_netif(struct gprs_ns2_vc_bind *bind);
-enum osmo_fr_role gprs_ns2_fr_bind_role(struct gprs_ns2_vc_bind *bind);
-int gprs_ns2_fr_bind(struct gprs_ns2_inst *nsi,
- const char *name,
- const char *netif,
- struct osmo_fr_network *fr_network,
- enum osmo_fr_role fr_role,
- struct gprs_ns2_vc_bind **result);
-int gprs_ns2_is_fr_bind(struct gprs_ns2_vc_bind *bind);
-struct gprs_ns2_vc *gprs_ns2_fr_nsvc_by_dlci(struct gprs_ns2_vc_bind *bind, uint16_t dlci);
-struct gprs_ns2_vc *gprs_ns2_fr_connect(struct gprs_ns2_vc_bind *bind,
- struct gprs_ns2_nse *nse,
- uint16_t nsvci,
- uint16_t dlci);
-struct gprs_ns2_vc *gprs_ns2_fr_connect2(struct gprs_ns2_vc_bind *bind,
- uint16_t nsei,
- uint16_t nsvci,
- uint16_t dlci);
-
-/* create a VC connection */
-struct gprs_ns2_vc *gprs_ns2_ip_connect(struct gprs_ns2_vc_bind *bind,
- const struct osmo_sockaddr *remote,
- struct gprs_ns2_nse *nse,
- uint16_t nsvci);
-
-struct gprs_ns2_vc *gprs_ns2_ip_connect2(struct gprs_ns2_vc_bind *bind,
- const struct osmo_sockaddr *remote,
- uint16_t nsei,
- uint16_t nsvci,
- enum gprs_ns2_dialect dialect);
-struct gprs_ns2_vc *gprs_ns2_ip_connect_inactive(struct gprs_ns2_vc_bind *bind,
- const struct osmo_sockaddr *remote,
- struct gprs_ns2_nse *nse,
- uint16_t nsvci);
-void gprs_ns2_ip_bind_set_sns_weight(struct gprs_ns2_vc_bind *bind,
- uint8_t signalling, uint8_t data);
-
-void gprs_ns2_free_bind(struct gprs_ns2_vc_bind *bind);
-void gprs_ns2_free_binds(struct gprs_ns2_inst *nsi);
-
-/* create a VC SNS connection */
-int gprs_ns2_sns_count(struct gprs_ns2_nse *nse);
-int gprs_ns2_sns_add_endpoint(struct gprs_ns2_nse *nse,
- const struct osmo_sockaddr *saddr);
-int gprs_ns2_sns_del_endpoint(struct gprs_ns2_nse *nse,
- const struct osmo_sockaddr *saddr);
-int gprs_ns2_sns_add_bind(struct gprs_ns2_nse *nse, struct gprs_ns2_vc_bind *bind);
-int gprs_ns2_sns_del_bind(struct gprs_ns2_nse *nse, struct gprs_ns2_vc_bind *bind);
-const struct osmo_sockaddr *gprs_ns2_nse_sns_remote(struct gprs_ns2_nse *nse);
-
-const struct osmo_sockaddr *gprs_ns2_ip_vc_remote(const struct gprs_ns2_vc *nsvc);
-const struct osmo_sockaddr *gprs_ns2_ip_vc_local(const struct gprs_ns2_vc *nsvc);
-bool gprs_ns2_ip_vc_equal(const struct gprs_ns2_vc *nsvc,
- const struct osmo_sockaddr *local,
- const struct osmo_sockaddr *remote,
- uint16_t nsvci);
-const struct osmo_sockaddr *gprs_ns2_ip_bind_sockaddr(struct gprs_ns2_vc_bind *bind);
-int gprs_ns2_is_ip_bind(struct gprs_ns2_vc_bind *bind);
-int gprs_ns2_ip_bind_set_dscp(struct gprs_ns2_vc_bind *bind, int dscp);
-int gprs_ns2_ip_bind_set_priority(struct gprs_ns2_vc_bind *bind, uint8_t priority);
-struct gprs_ns2_vc *gprs_ns2_nsvc_by_sockaddr_bind(
- struct gprs_ns2_vc_bind *bind,
- const struct osmo_sockaddr *saddr);
-
-int gprs_ns2_frgre_bind(struct gprs_ns2_inst *nsi,
- const char *name,
- const struct osmo_sockaddr *local,
- int dscp,
- struct gprs_ns2_vc_bind **result);
-int gprs_ns2_is_frgre_bind(struct gprs_ns2_vc_bind *bind);
-uint16_t gprs_ns2_fr_nsvc_dlci(const struct gprs_ns2_vc *nsvc);
-
-struct gprs_ns2_vc *gprs_ns2_nsvc_by_sockaddr_nse(
- struct gprs_ns2_nse *nse,
- const struct osmo_sockaddr *sockaddr);
-void gprs_ns2_start_alive_all_nsvcs(struct gprs_ns2_nse *nse);
-
-/* VC information */
-const char *gprs_ns2_ll_str(struct gprs_ns2_vc *nsvc);
-char *gprs_ns2_ll_str_buf(char *buf, size_t buf_len, struct gprs_ns2_vc *nsvc);
-char *gprs_ns2_ll_str_c(const void *ctx, struct gprs_ns2_vc *nsvc);
-const char *gprs_ns2_nsvc_state_name(struct gprs_ns2_vc *nsvc);
-
-/* vty */
-int gprs_ns2_vty_init(struct gprs_ns2_inst *nsi);
-
-/*! @} */
+#pragma message "Header osmocom/gprs/gprs_ns2.h is deprecated, include osmocom/gb/gprs_ns2.h instead"
+#include <osmocom/gb/gprs_ns2.h>
diff --git a/include/osmocom/gprs/gprs_ns_frgre.h b/include/osmocom/gprs/gprs_ns_frgre.h
index 8cf54c7..d9d440e 100644
--- a/include/osmocom/gprs/gprs_ns_frgre.h
+++ b/include/osmocom/gprs/gprs_ns_frgre.h
@@ -1,8 +1,4 @@
-/*! \file gprs_ns_frgre.h */
-
#pragma once
-struct gprs_nsvc;
-struct msgb;
-
-int gprs_ns_frgre_sendmsg(struct gprs_nsvc *nsvc, struct msgb *msg);
+#pragma message "Header osmocom/gprs/gprs_ns_frgre.h is deprecated, include osmocom/gb/gprs_ns_frgre.h instead"
+#include <osmocom/gb/gprs_ns_frgre.h>
diff --git a/include/osmocom/gprs/protocol/gsm_08_16.h b/include/osmocom/gprs/protocol/gsm_08_16.h
index f98f68d..c53df39 100644
--- a/include/osmocom/gprs/protocol/gsm_08_16.h
+++ b/include/osmocom/gprs/protocol/gsm_08_16.h
@@ -1,103 +1,4 @@
-/*! \file gsm_08_16.h
- * GPRS Networks Service (NS) messages on the Gb interface.
- * 3GPP TS 08.16 version 8.0.1 Release 1999 / ETSI TS 101 299 V8.0.1 (2002-05)
- * 3GPP TS 48.016 version 6.5.0 Release 6 / ETSI TS 148 016 V6.5.0 (2005-11) */
-
#pragma once
-#include <stdint.h>
-#include <arpa/inet.h>
-#include <osmocom/core/utils.h>
-
-/*! \addtogroup libgb
- * @{
- * \file gprs_ns.h */
-
-/*! Common header of GPRS NS */
-struct gprs_ns_hdr {
- uint8_t pdu_type; /*!< NS PDU type */
- uint8_t data[0]; /*!< variable-length payload */
-} __attribute__((packed));
-
-
-/*! Section 10.3.2c List of IP4 Elements */
-struct gprs_ns_ie_ip4_elem {
- uint32_t ip_addr;
- uint16_t udp_port;
- uint8_t sig_weight;
- uint8_t data_weight;
-} __attribute__ ((packed));
-
-/*! Section 10.3.2d List of IP6 Elements */
-struct gprs_ns_ie_ip6_elem {
- struct in6_addr ip_addr;
- uint16_t udp_port;
- uint8_t sig_weight;
- uint8_t data_weight;
-} __attribute__ ((packed));
-
-extern const struct value_string gprs_ns_pdu_strings[];
-
-/*! NS PDU Type (TS 08.16, Section 10.3.7, Table 14) */
-enum ns_pdu_type {
- NS_PDUT_UNITDATA = 0x00,
- NS_PDUT_RESET = 0x02,
- NS_PDUT_RESET_ACK = 0x03,
- NS_PDUT_BLOCK = 0x04,
- NS_PDUT_BLOCK_ACK = 0x05,
- NS_PDUT_UNBLOCK = 0x06,
- NS_PDUT_UNBLOCK_ACK = 0x07,
- NS_PDUT_STATUS = 0x08,
- NS_PDUT_ALIVE = 0x0a,
- NS_PDUT_ALIVE_ACK = 0x0b,
- /* TS 48.016 Section 10.3.7, Table 10.3.7.1 */
- SNS_PDUT_ACK = 0x0c,
- SNS_PDUT_ADD = 0x0d,
- SNS_PDUT_CHANGE_WEIGHT = 0x0e,
- SNS_PDUT_CONFIG = 0x0f,
- SNS_PDUT_CONFIG_ACK = 0x10,
- SNS_PDUT_DELETE = 0x11,
- SNS_PDUT_SIZE = 0x12,
- SNS_PDUT_SIZE_ACK = 0x13,
-};
-
-/*! NS Control IE (TS 08.16, Section 10.3, Table 12) */
-enum ns_ctrl_ie {
- NS_IE_CAUSE = 0x00,
- NS_IE_VCI = 0x01,
- NS_IE_PDU = 0x02,
- NS_IE_BVCI = 0x03,
- NS_IE_NSEI = 0x04,
- /* TS 48.016 Section 10.3, Table 10.3.1 */
- NS_IE_IPv4_LIST = 0x05,
- NS_IE_IPv6_LIST = 0x06,
- NS_IE_MAX_NR_NSVC = 0x07,
- NS_IE_IPv4_EP_NR = 0x08,
- NS_IE_IPv6_EP_NR = 0x09,
- NS_IE_RESET_FLAG = 0x0a,
- NS_IE_IP_ADDR = 0x0b,
- NS_IE_TRANS_ID = 0xff, /* osmocom. Spec has this IE but without IEI! */
-};
-
-/*! NS Cause (TS 08.16, Section 10.3.2, Table 13) */
-enum ns_cause {
- NS_CAUSE_TRANSIT_FAIL = 0x00,
- NS_CAUSE_OM_INTERVENTION = 0x01,
- NS_CAUSE_EQUIP_FAIL = 0x02,
- NS_CAUSE_NSVC_BLOCKED = 0x03,
- NS_CAUSE_NSVC_UNKNOWN = 0x04,
- NS_CAUSE_BVCI_UNKNOWN = 0x05,
- NS_CAUSE_SEM_INCORR_PDU = 0x08,
- NS_CAUSE_PDU_INCOMP_PSTATE = 0x0a,
- NS_CAUSE_PROTO_ERR_UNSPEC = 0x0b,
- NS_CAUSE_INVAL_ESSENT_IE = 0x0c,
- NS_CAUSE_MISSING_ESSENT_IE = 0x0d,
- /* TS 48.016 Section 10.3.2, Table 10.3.2.1 */
- NS_CAUSE_INVAL_NR_IPv4_EP = 0x0e,
- NS_CAUSE_INVAL_NR_IPv6_EP = 0x0f,
- NS_CAUSE_INVAL_NR_NS_VC = 0x10,
- NS_CAUSE_INVAL_WEIGH = 0x11,
- NS_CAUSE_UNKN_IP_EP = 0x12,
- NS_CAUSE_UNKN_IP_ADDR = 0x13,
- NS_CAUSE_UNKN_IP_TEST_FAILED = 0x14,
-};
+#pragma message "Header osmocom/gprs/protocol/gsm_08_16.h is deprecated, include osmocom/gb/protocol/gsm_08_16.h instead"
+#include <osmocom/gb/protocol/gsm_08_16.h>
diff --git a/include/osmocom/gprs/protocol/gsm_08_18.h b/include/osmocom/gprs/protocol/gsm_08_18.h
index 1152eb6..9e77463 100644
--- a/include/osmocom/gprs/protocol/gsm_08_18.h
+++ b/include/osmocom/gprs/protocol/gsm_08_18.h
@@ -1,373 +1,4 @@
-/*! \file gsm_08_18.h */
-/* Updated to reflect TS 48.018 version 15.0.0 Release 15 */
-
#pragma once
-#include <stdint.h>
-#include <osmocom/core/endian.h>
-
-/*! Fixed BVCI definitions (Section 5.4.1) */
-#define BVCI_SIGNALLING 0x0000
-#define BVCI_PTM 0x0001
-
-/* typo backwards compatiblity */
-#define BSSGP_PDUT_RA_CAPA_UDPATE BSSGP_PDUT_RA_CAPA_UPDATE
-
-/*! BSSGP PDU types (Section 11.3.26 / Table 11.27) */
-enum bssgp_pdu_type {
- /* PDUs between RL and BSSGP SAPs */
- BSSGP_PDUT_DL_UNITDATA = 0x00,
- BSSGP_PDUT_UL_UNITDATA = 0x01,
- BSSGP_PDUT_RA_CAPABILITY = 0x02,
- /* PDUs between MBMS SAPs */
- BSSGP_PDUT_PTM_UNITDATA = 0x03, /* reserved in later specs */
- BSSGP_PDUT_DL_MMBS_UNITDATA = 0x04,
- BSSGP_PDUT_UL_MMBS_UNITDATA = 0x05,
- /* PDUs between GMM SAPs */
- BSSGP_PDUT_PAGING_PS = 0x06,
- BSSGP_PDUT_PAGING_CS = 0x07,
- BSSGP_PDUT_RA_CAPA_UPDATE = 0x08,
- BSSGP_PDUT_RA_CAPA_UPDATE_ACK = 0x09,
- BSSGP_PDUT_RADIO_STATUS = 0x0a,
- BSSGP_PDUT_SUSPEND = 0x0b,
- BSSGP_PDUT_SUSPEND_ACK = 0x0c,
- BSSGP_PDUT_SUSPEND_NACK = 0x0d,
- BSSGP_PDUT_RESUME = 0x0e,
- BSSGP_PDUT_RESUME_ACK = 0x0f,
- BSSGP_PDUT_RESUME_NACK = 0x10,
- BSSGP_PDUT_PAGING_PS_REJECT = 0x11,
- BSSGP_PDUT_DUMMY_PAGING_PS = 0x12,
- BSSGP_PDUT_DUMMY_PAGING_PS_RESP = 0x13,
- BSSGP_PDUT_MS_REGISTR_ENQ = 0x14,
- BSSGP_PDUT_MS_REGISTR_ENQ_RESP = 0x15,
- /* PDus between NM SAPs */
- BSSGP_PDUT_BVC_BLOCK = 0x20,
- BSSGP_PDUT_BVC_BLOCK_ACK = 0x21,
- BSSGP_PDUT_BVC_RESET = 0x22,
- BSSGP_PDUT_BVC_RESET_ACK = 0x23,
- BSSGP_PDUT_BVC_UNBLOCK = 0x24,
- BSSGP_PDUT_BVC_UNBLOCK_ACK = 0x25,
- BSSGP_PDUT_FLOW_CONTROL_BVC = 0x26,
- BSSGP_PDUT_FLOW_CONTROL_BVC_ACK = 0x27,
- BSSGP_PDUT_FLOW_CONTROL_MS = 0x28,
- BSSGP_PDUT_FLOW_CONTROL_MS_ACK = 0x29,
- BSSGP_PDUT_FLUSH_LL = 0x2a,
- BSSGP_PDUT_FLUSH_LL_ACK = 0x2b,
- BSSGP_PDUT_LLC_DISCARD = 0x2c,
- BSSGP_PDUT_FLOW_CONTROL_PFC = 0x2d,
- BSSGP_PDUT_FLOW_CONTROL_PFC_ACK = 0x2e,
- BSSGP_PDUT_SGSN_INVOKE_TRACE = 0x40,
- BSSGP_PDUT_STATUS = 0x41,
- BSSGP_PDUT_OVERLOAD = 0x42,
- /* PDUs between PFM SAP's */
- BSSGP_PDUT_DOWNLOAD_BSS_PFC = 0x50,
- BSSGP_PDUT_CREATE_BSS_PFC = 0x51,
- BSSGP_PDUT_CREATE_BSS_PFC_ACK = 0x52,
- BSSGP_PDUT_CREATE_BSS_PFC_NACK = 0x53,
- BSSGP_PDUT_MODIFY_BSS_PFC = 0x54,
- BSSGP_PDUT_MODIFY_BSS_PFC_ACK = 0x55,
- BSSGP_PDUT_DELETE_BSS_PFC = 0x56,
- BSSGP_PDUT_DELETE_BSS_PFC_ACK = 0x57,
- BSSGP_PDUT_DELETE_BSS_PFC_REQ = 0x58,
- BSSGP_PDUT_PS_HO_REQUIRED = 0x59,
- BSSGP_PDUT_PS_HO_REQUIRED_ACK = 0x5a,
- BSSGP_PDUT_PS_HO_REQUIRED_NACK = 0x5b,
- BSSGP_PDUT_PS_HO_REQUEST = 0x5c,
- BSSGP_PDUT_PS_HO_REQUEST_ACK = 0x5d,
- BSSGP_PDUT_PS_HO_REQUEST_NACK = 0x5e,
- BSSGP_PDUT_PS_HO_COMPLETE = 0x91,
- BSSGP_PDUT_PS_HO_CANCEL = 0x92,
- BSSGP_PDUT_PS_HO_COMPLETE_ACK = 0x93,
- /* PDUs between LCS SAPs */
- BSSGP_PDUT_PERFORM_LOC_REQ = 0x60,
- BSSGP_PDUT_PERFORM_LOC_RESP = 0x61,
- BSSGP_PDUT_PERFORM_LOC_ABORT = 0x62,
- BSSGP_PDUT_POSITION_COMMAND = 0x63,
- BSSGP_PDUT_POSITION_RESPONSE = 0x64,
- /* PDUs between RIM SAPs */
- BSSGP_PDUT_RAN_INFO = 0x70,
- BSSGP_PDUT_RAN_INFO_REQ = 0x71,
- BSSGP_PDUT_RAN_INFO_ACK = 0x72,
- BSSGP_PDUT_RAN_INFO_ERROR = 0x73,
- BSSGP_PDUT_RAN_INFO_APP_ERROR = 0x74,
- /* PDUs between MBMS SAPs */
- BSSGP_PDUT_MBMS_START_REQ = 0x80,
- BSSGP_PDUT_MBMS_START_RESP = 0x81,
- BSSGP_PDUT_MBMS_STOP_REQ = 0x82,
- BSSGP_PDUT_MBMS_STOP_RESP = 0x83,
- BSSGP_PDUT_MBMS_UPDATE_REQ = 0x84,
- BSSGP_PDUT_MBMS_UPDATE_RESP = 0x85,
-};
-
-/*! BSSGP User-Data header (Section 10.2.1 and 10.2.2) */
-struct bssgp_ud_hdr {
- uint8_t pdu_type; /*!< BSSGP PDU type */
- uint32_t tlli; /*!< Temporary Link-Local Identifier */
- uint8_t qos_profile[3]; /*!< QoS profile */
- uint8_t data[0]; /* optional/conditional IEs as TLVs */
-} __attribute__((packed));
-
-/*! BSSGP normal header */
-struct bssgp_normal_hdr {
- uint8_t pdu_type; /*!< BSSGP PDU type */
- uint8_t data[0]; /*!< optional/conditional IEs as TLVs */
-};
-
-/*! BSSGP Information Element Identifiers (Section 11.3 / Table 11.3) */
-enum bssgp_iei_type {
- BSSGP_IE_ALIGNMENT = 0x00,
- BSSGP_IE_BMAX_DEFAULT_MS = 0x01,
- BSSGP_IE_BSS_AREA_ID = 0x02,
- BSSGP_IE_BUCKET_LEAK_RATE = 0x03,
- BSSGP_IE_BVCI = 0x04,
- BSSGP_IE_BVC_BUCKET_SIZE = 0x05,
- BSSGP_IE_BVC_MEASUREMENT = 0x06,
- BSSGP_IE_CAUSE = 0x07,
- BSSGP_IE_CELL_ID = 0x08,
- BSSGP_IE_CHAN_NEEDED = 0x09,
- BSSGP_IE_DRX_PARAMS = 0x0a,
- BSSGP_IE_EMLPP_PRIO = 0x0b,
- BSSGP_IE_FLUSH_ACTION = 0x0c,
- BSSGP_IE_IMSI = 0x0d,
- BSSGP_IE_LLC_PDU = 0x0e,
- BSSGP_IE_LLC_FRAMES_DISCARDED = 0x0f,
- BSSGP_IE_LOCATION_AREA = 0x10,
- BSSGP_IE_MOBILE_ID = 0x11,
- BSSGP_IE_MS_BUCKET_SIZE = 0x12,
- BSSGP_IE_MS_RADIO_ACCESS_CAP = 0x13,
- BSSGP_IE_OMC_ID = 0x14,
- BSSGP_IE_PDU_IN_ERROR = 0x15,
- BSSGP_IE_PDU_LIFETIME = 0x16,
- BSSGP_IE_PRIORITY = 0x17,
- BSSGP_IE_QOS_PROFILE = 0x18,
- BSSGP_IE_RADIO_CAUSE = 0x19,
- BSSGP_IE_RA_CAP_UPD_CAUSE = 0x1a,
- BSSGP_IE_ROUTEING_AREA = 0x1b,
- BSSGP_IE_R_DEFAULT_MS = 0x1c,
- BSSGP_IE_SUSPEND_REF_NR = 0x1d,
- BSSGP_IE_TAG = 0x1e,
- BSSGP_IE_TLLI = 0x1f,
- BSSGP_IE_TMSI = 0x20,
- BSSGP_IE_TRACE_REFERENC = 0x21,
- BSSGP_IE_TRACE_TYPE = 0x22,
- BSSGP_IE_TRANSACTION_ID = 0x23,
- BSSGP_IE_TRIGGER_ID = 0x24,
- BSSGP_IE_NUM_OCT_AFF = 0x25,
- BSSGP_IE_LSA_ID_LIST = 0x26,
- BSSGP_IE_LSA_INFORMATION = 0x27,
- BSSGP_IE_PACKET_FLOW_ID = 0x28,
- BSSGP_IE_PACKET_FLOW_TIMER = 0x29,
- BSSGP_IE_AGG_BSS_QOS_PROFILE = 0x3a,
- BSSGP_IE_FEATURE_BITMAP = 0x3b,
- BSSGP_IE_BUCKET_FULL_RATIO = 0x3c,
- BSSGP_IE_SERVICE_UTRAN_CCO = 0x3d,
- BSSGP_IE_NSEI = 0x3e,
- BSSGP_IE_RRLP_APDU = 0x3f,
- BSSGP_IE_LCS_QOS = 0x40,
- BSSGP_IE_LCS_CLIENT_TYPE = 0x41,
- BSSGP_IE_REQUESTED_GPS_AST_DATA = 0x42,
- BSSGP_IE_LOCATION_TYPE = 0x43,
- BSSGP_IE_LOCATION_ESTIMATE = 0x44,
- BSSGP_IE_POSITIONING_DATA = 0x45,
- BSSGP_IE_DECIPHERING_KEYS = 0x46,
- BSSGP_IE_LCS_PRIORITY = 0x47,
- BSSGP_IE_LCS_CAUSE = 0x48,
- BSSGP_IE_LCS_CAPABILITY = 0x49,
- BSSGP_IE_RRLP_FLAGS = 0x4a,
- BSSGP_IE_RIM_APP_IDENTITY = 0x4b,
- BSSGP_IE_RIM_SEQ_NR = 0x4c,
- BSSGP_IE_RIM_REQ_APP_CONTAINER = 0x4d,
- BSSGP_IE_RAN_INFO_APP_CONTAINER = 0x4e,
- BSSGP_IE_RIM_PDU_INDICATIONS = 0x4f,
- BSSGP_IE_PFC_FLOW_CTRL_PARAMS = 0x52,
- BSSGP_IE_GLOBAL_CN_ID = 0x53,
- BSSGP_IE_RIM_ROUTING_INFO = 0x54,
- BSSGP_IE_RIM_PROTOCOL_VERSION = 0x55,
- BSSGP_IE_APP_ERROR_CONTAINER = 0x56,
- BSSGP_IE_RI_REQ_RIM_CONTAINER = 0x57,
- BSSGP_IE_RI_RIM_CONTAINER = 0x58,
- BSSGP_IE_RI_APP_ERROR_RIM_CONT = 0x59,
- BSSGP_IE_RI_ACK_RIM_CONTAINER = 0x5a,
- BSSGP_IE_RI_ERROR_RIM_COINTAINER= 0x5b,
- BSSGP_IE_TMGI = 0x5c,
- BSSGP_IE_MBMS_SESSION_ID = 0x5d,
- BSSGP_IE_MBMS_SESSION_DURATION = 0x5e,
- BSSGP_IE_MBMS_SA_ID_LIST = 0x5f,
- BSSGP_IE_MBMS_RESPONSE = 0x60,
- BSSGP_IE_MBMS_RA_LIST = 0x61,
- BSSGP_IE_MBMS_SESSION_INFO = 0x62,
- BSSGP_IE_MBMS_STOP_CAUSE = 0x63,
- BSSGP_IE_SBSS_TO_TBSS_TR_CONT = 0x64,
- BSSGP_IE_TBSS_TO_SBSS_TR_CONT = 0x65,
- BSSGP_IE_NAS_CONT_FOR_PS_HO = 0x66,
- BSSGP_IE_PFC_TO_BE_SETUP_LIST = 0x67,
- BSSGP_IE_LIST_OF_SETUP_PFC = 0x68,
- BSSGP_IE_EXT_FEATURE_BITMAP = 0x69,
- BSSGP_IE_SRC_TO_TGT_TR_CONT = 0x6a,
- BSSGP_IE_TGT_TO_SRC_TR_CONT = 0x6b,
- BSSGP_IE_NC_ID = 0x6c,
- BSSGP_IE_PAGE_MODE = 0x6d,
- BSSGP_IE_CONTAINER_ID = 0x6e,
- BSSGP_IE_GLOBAL_TFI = 0x6f,
- BSSGP_IE_IMEI = 0x70,
- BSSGP_IE_TIME_TO_MBMS_DATA_XFR = 0x71,
- BSSGP_IE_MBMS_SESSION_REP_NR = 0x72,
- BSSGP_IE_INTER_RAT_HO_INFO = 0x73,
- BSSGP_IE_PS_HO_COMMAND = 0x74,
- BSSGP_IE_PS_HO_INDICATIONS = 0x75,
- BSSGP_IE_SI_PSI_CONTAINER = 0x76,
- BSSGP_IE_ACTIVE_PFC_LIST = 0x77,
- BSSGP_IE_VELOCITY_DATA = 0x78,
- BSSGP_IE_DTM_HO_COMMAND = 0x79,
- BSSGP_IE_CS_INDICATION = 0x7a,
- BSSGP_IE_RQD_GANNS_AST_DATA = 0x7b,
- BSSGP_IE_GANSS_LOCATION_TYPE = 0x7c,
- BSSGP_IE_GANSS_POSITIONING_DATA = 0x7d,
- BSSGP_IE_FLOW_CTRL_GRANULARITY = 0x7e,
- BSSGP_IE_ENB_ID = 0x7f,
- BSSGP_IE_EUTRAN_IRAT_HO_INFO = 0x80,
- BSSGP_IE_SUB_PID4RAT_FREQ_PRIO = 0x81,
- BSSGP_IE_REQ4IRAT_HO_INFO = 0x82,
- BSSGP_IE_RELIABLE_IRAT_HO_INFO = 0x83,
- BSSGP_IE_SON_TRANSFER_APP_ID = 0x84,
- BSSGP_IE_CSG_ID = 0x85,
- BSSGP_IE_TAC = 0x86,
- BSSGP_IE_REDIRECT_ATTEMPT_FLAG = 0x87,
- BSSGP_IE_REDIRECTION_INDICATION = 0x88,
- BSSGP_IE_REDIRECTION_COMPLETED = 0x89,
- BSSGP_IE_UNCONF_SEND_STATE_VAR = 0x8a,
- BSSGP_IE_IRAT_MEASUREMENT_CONF = 0x8b,
- BSSGP_IE_SCI = 0x8c,
- BSSGP_IE_GGSN_PGW_LOCATION = 0x8d,
- BSSGP_IE_SELECTED_PLMN_ID = 0x8e,
- BSSGP_IE_PRIO_CLASS_IND = 0x8f,
- BSSGP_IE_SOURCE_CELL_ID = 0x90,
- BSSGP_IE_IRAT_MEAS_CFG_E_EARFCN = 0x91,
- BSSGP_IE_EDRX_PARAMETERS = 0x92,
- BSSGP_IE_T_UNTIL_NEXT_PAGING = 0x93,
- BSSGP_IE_COVERAGE_CLASS = 0x98,
- BSSGP_IE_PAGING_ATTEMPT_INFO = 0x99,
- BSSGP_IE_EXCEPTION_REPORT_FLAG = 0x9a,
- BSSGP_IE_OLD_RA_ID = 0x9b,
- BSSGP_IE_ATTACH_IND = 0x9c,
- BSSGP_IE_PLMN_ID = 0x9d,
- BSSGP_IE_MME_QUERY = 0x9e,
- BSSGP_IE_SGSN_GROUP_ID = 0x9f,
- BSSGP_IE_ADDITIONAL_PTMSI = 0xa0,
- BSSGP_IE_UE_USAGE_TYPE = 0xa1,
- BSSGP_IE_MLAT_TIMER = 0xa2,
- BSSGP_IE_MLAT_TA = 0xa3,
- BSSGP_IE_MS_SYNC_ACCURACY = 0xa4,
- BSSGP_IE_BTS_RX_ACCURACY_LVL = 0xa5,
- BSSGP_IE_TA_REQ = 0xa6,
-};
-
-/*! Cause coding (Section 11.3.8 / Table 11.10) */
-enum gprs_bssgp_cause {
- BSSGP_CAUSE_PROC_OVERLOAD = 0x00,
- BSSGP_CAUSE_EQUIP_FAIL = 0x01,
- BSSGP_CAUSE_TRASIT_NET_FAIL = 0x02,
- BSSGP_CAUSE_CAPA_GREATER_0KPBS = 0x03,
- BSSGP_CAUSE_UNKNOWN_MS = 0x04,
- BSSGP_CAUSE_UNKNOWN_BVCI = 0x05,
- BSSGP_CAUSE_CELL_TRAF_CONG = 0x06,
- BSSGP_CAUSE_SGSN_CONG = 0x07,
- BSSGP_CAUSE_OML_INTERV = 0x08,
- BSSGP_CAUSE_BVCI_BLOCKED = 0x09,
- BSSGP_CAUSE_PFC_CREATE_FAIL = 0x0a,
- BSSGP_CAUSE_PFC_PREEMPTED = 0x0b,
- BSSGP_CAUSE_ABQP_NOT_SUPP = 0x0c,
- BSSGP_CAUSE_SEM_INCORR_PDU = 0x20,
- BSSGP_CAUSE_INV_MAND_INF = 0x21,
- BSSGP_CAUSE_MISSING_MAND_IE = 0x22,
- BSSGP_CAUSE_MISSING_COND_IE = 0x23,
- BSSGP_CAUSE_UNEXP_COND_IE = 0x24,
- BSSGP_CAUSE_COND_IE_ERR = 0x25,
- BSSGP_CAUSE_PDU_INCOMP_STATE = 0x26,
- BSSGP_CAUSE_PROTO_ERR_UNSPEC = 0x27,
- BSSGP_CAUSE_PDU_INCOMP_FEAT = 0x28,
- BSSGP_CAUSE_REQ_INFO_NOT_AVAIL = 0x29,
- BSSGP_CAUSE_UNKN_DST = 0x2a,
- BSSGP_CAUSE_UNKN_RIM_AI = 0x2b,
- BSSGP_CAUSE_INVAL_CONT_UI = 0x2c,
- BSSGP_CAUSE_PFC_QUEUE = 0x2d,
- BSSGP_CAUSE_PFC_CREATED = 0x2e,
- BSSGP_CAUSE_T12_EXPIRY = 0x2f,
- BSSGP_CAUSE_MS_UNDER_PS_HO = 0x30,
- BSSGP_CAUSE_UL_QUALITY = 0x31,
- BSSGP_CAUSE_UL_STRENGTH = 0x32,
- BSSGP_CAUSE_DL_QUALITY = 0x33,
- BSSGP_CAUSE_DL_STRENGTH = 0x34,
- BSSGP_CAUSE_DISTANCE = 0x35,
- BSSGP_CAUSE_BETTER_CELL = 0x36,
- BSSGP_CAUSE_TRAFFIC = 0x37,
- BSSGP_CAUSE_MS_RADIO_LOSS = 0x38,
- BSSGP_CAUSE_MS_BACK_OLD_CHAN = 0x39,
- BSSGP_CAUSE_T13_EXPIRY = 0x3a,
- BSSGP_CAUSE_T14_EXPIRY = 0x3b,
- BSSGP_CAUSE_NOT_ALL_PFC = 0x3c,
- BSSGP_CAUSE_CS = 0x3d,
- BSSGP_CAUSE_REQ_ALG_NOT_SUPP = 0x3e,
- BSSGP_CAUSE_RELOC_FAIL = 0x3f,
- BSSGP_CAUSE_DIR_RETRY = 0x40,
- BSSGP_CAUSE_TIME_CRIT_RELOC = 0x41,
- BSSGP_CAUSE_PS_HO_TARG_NA = 0x42,
- BSSGP_CAUSE_PS_HO_TARG_NOT_SUPP = 0x43,
- BSSGP_CAUSE_PUESBINE = 0x44,
- BSSGP_CAUSE_DTM_HO_NO_CS_RES = 0x45,
- BSSGP_CAUSE_DTM_HO_PS_ALLOC_FAIL = 0x46,
- BSSGP_CAUSE_DTM_HO_T24_EXPIRY = 0x47,
- BSSGP_CAUSE_DTM_HO_INVAL_CS_IND = 0x48,
- BSSGP_CAUSE_DTM_HO_T23_EXPIRY = 0x49,
- BSSGP_CAUSE_DTM_HO_MSC_ERR = 0x4a,
- BSSGP_CAUSE_INVAL_CSG_CELL = 0x4b,
-};
-
-/* Feature Bitmap (Section 11.3.45) */
-#define BSSGP_FEAT_PFC 0x01 /* Packet Flow Context */
-#define BSSGP_FEAT_CBL 0x02 /* Current Bucket Level */
-#define BSSGP_FEAT_INR 0x04 /* Inter-NSE re-routing */
-#define BSSGP_FEAT_LCS 0x08 /* Location Services */
-#define BSSGP_FEAT_RIM 0x10 /* RAN Inoformation Management */
-#define BSSGP_FEAT_PFC_FC 0x20 /* PFC Flow Control */
-#define BSSGP_FEAT_ERS 0x40 /* Enhanced Radio Status */
-#define BSSGP_FEAT_MBMS 0x80 /* Multimedia Broadcast */
-
-/* Extended Feature Bitmap (Section 11.3.84) */
-#define BSSGP_XFEAT_PSHO 0x01 /* PS Handover */
-#define BSSGP_XFEAT_GBIT 0x02 /* Gigabit Interface */
-#define BSSGP_XFEAT_MOCN 0x04 /* Multi-Operator CN */
-#define BSSGP_XFEAT_CSPS 0x08 /* CS/PS coordination enhancements */
-#define BSSGP_XFEAT_ECIoT 0x10 /* EC-GSM-IoT */
-#define BSSGP_XFEAT_DCN 0x20 /* Dedicated CN */
-#define BSSGP_XFEAT_eDRX 0x40 /* eDRX */
-#define BSSGP_XFEAT_MSAD 0x80 /* MS-assisted Dedicated CN selection */
-
-/* Flow Control Granularity (Section 11.3.102) */
-enum bssgp_fc_granularity {
- BSSGP_FC_GRAN_100 = 0,
- BSSGP_FC_GRAN_1000 = 1,
- BSSGP_FC_GRAN_10000 = 2,
- BSSGP_FC_GRAN_100000 = 3,
-};
-
-/* RAN-INFORMATION-REQUEST PDU Type Extension
- * 3GPP TS 48.018, table 11.3.65.1 */
-enum bssgp_rim_pdu_type {
- RIM_PDU_TYPE_STOP = 0,
- RIM_PDU_TYPE_SING_REP = 1,
- RIM_PDU_TYPE_MULT_REP = 2,
-};
-
-/* RIM PDU Indications
- * 3GPP TS 48.018, section 11.3.65.0 */
-struct bssgp_rim_pdu_ind {
-#if OSMO_IS_LITTLE_ENDIAN
- uint8_t ack_requested:1,
- pdu_type_ext:3,
- reserved:4;
-#elif OSMO_IS_BIG_ENDIAN
-/* auto-generated from the little endian part above (libosmocore/contrib/struct_endianness.py) */
- uint8_t reserved:4, pdu_type_ext:3, ack_requested:1;
-#endif
-} __attribute__ ((packed));
+#pragma message "Header osmocom/gprs/protocol/gsm_08_18.h is deprecated, include osmocom/gb/protocol/gsm_08_18.h instead"
+#include <osmocom/gb/protocol/gsm_08_18.h>
diff --git a/include/osmocom/gprs/protocol/gsm_24_301.h b/include/osmocom/gprs/protocol/gsm_24_301.h
index d4bcd87..055c7d7 100644
--- a/include/osmocom/gprs/protocol/gsm_24_301.h
+++ b/include/osmocom/gprs/protocol/gsm_24_301.h
@@ -1,11 +1,4 @@
-/*! \file gsm_24_301.h */
-
#pragma once
-/*! Tracking area TS 24.301, section 9.9.3.32 */
-struct osmo_eutran_tai {
- uint16_t mcc;
- uint16_t mnc;
- bool mnc_3_digits;
- uint16_t tac;
-};
+#pragma message "Header osmocom/gprs/protocol/gsm_24_301.h is deprecated, include osmocom/gb/protocol/gsm_24_301.h instead"
+#include <osmocom/gb/protocol/gsm_24_301.h>
diff --git a/src/gb/bssgp_bvc_fsm.c b/src/gb/bssgp_bvc_fsm.c
index 3a36c7d..2020f1a 100644
--- a/src/gb/bssgp_bvc_fsm.c
+++ b/src/gb/bssgp_bvc_fsm.c
@@ -32,10 +32,10 @@
#include <osmocom/gsm/gsm48.h>
#include <osmocom/gsm/tlv.h>
-#include <osmocom/gprs/gprs_msgb.h>
-#include <osmocom/gprs/gprs_bssgp.h>
-#include <osmocom/gprs/gprs_bssgp2.h>
-#include <osmocom/gprs/bssgp_bvc_fsm.h>
+#include <osmocom/gb/gprs_msgb.h>
+#include <osmocom/gb/gprs_bssgp.h>
+#include <osmocom/gb/gprs_bssgp2.h>
+#include <osmocom/gb/bssgp_bvc_fsm.h>
#include "common_vty.h"
diff --git a/src/gb/common_vty.c b/src/gb/common_vty.c
index ad3dea2..ad7eb11 100644
--- a/src/gb/common_vty.c
+++ b/src/gb/common_vty.c
@@ -33,7 +33,7 @@
#include <osmocom/vty/buffer.h>
#include <osmocom/vty/vty.h>
-#include <osmocom/gprs/gprs_msgb.h>
+#include <osmocom/gb/gprs_msgb.h>
#include "common_vty.h"
diff --git a/src/gb/frame_relay.c b/src/gb/frame_relay.c
index e973b91..85b3a19 100644
--- a/src/gb/frame_relay.c
+++ b/src/gb/frame_relay.c
@@ -29,7 +29,7 @@
#include <unistd.h>
#include <errno.h>
-#include <osmocom/gprs/frame_relay.h>
+#include <osmocom/gb/frame_relay.h>
#include <osmocom/core/endian.h>
#include <osmocom/core/utils.h>
#include <osmocom/core/logging.h>
diff --git a/src/gb/gb_internal.h b/src/gb/gb_internal.h
index cc7222e..b2fdf7a 100644
--- a/src/gb/gb_internal.h
+++ b/src/gb/gb_internal.h
@@ -2,7 +2,7 @@
#include <osmocom/core/msgb.h>
#include <osmocom/gsm/tlv.h>
-#include <osmocom/gprs/gprs_ns.h>
+#include <osmocom/gb/gprs_ns.h>
/* gprs_ns_sns.c */
int gprs_ns_rx_sns(struct gprs_ns_inst *nsi, struct msgb *msg, struct tlv_parsed *tp);
diff --git a/src/gb/gprs_bssgp.c b/src/gb/gprs_bssgp.c
index 7abef80..a320c5b 100644
--- a/src/gb/gprs_bssgp.c
+++ b/src/gb/gprs_bssgp.c
@@ -36,9 +36,9 @@
#include <osmocom/core/rate_ctr.h>
#include <osmocom/core/stats.h>
-#include <osmocom/gprs/gprs_bssgp.h>
-#include <osmocom/gprs/gprs_bssgp_bss.h>
-#include <osmocom/gprs/gprs_ns.h>
+#include <osmocom/gb/gprs_bssgp.h>
+#include <osmocom/gb/gprs_bssgp_bss.h>
+#include <osmocom/gb/gprs_ns.h>
#include "osmocom/gsm/gsm48.h"
#include "gprs_bssgp_internal.h"
diff --git a/src/gb/gprs_bssgp2.c b/src/gb/gprs_bssgp2.c
index 104fe08..3496b5d 100644
--- a/src/gb/gprs_bssgp2.c
+++ b/src/gb/gprs_bssgp2.c
@@ -28,9 +28,9 @@
#include <osmocom/gsm/gsm48.h>
#include <osmocom/gsm/tlv.h>
-#include <osmocom/gprs/gprs_ns2.h>
-#include <osmocom/gprs/gprs_bssgp.h>
-#include <osmocom/gprs/gprs_bssgp2.h>
+#include <osmocom/gb/gprs_ns2.h>
+#include <osmocom/gb/gprs_bssgp.h>
+#include <osmocom/gb/gprs_bssgp2.h>
/*! transmit BSSGP PDU over NS (PTP BVC)
diff --git a/src/gb/gprs_bssgp_bss.c b/src/gb/gprs_bssgp_bss.c
index 8230d87..aea6c0e 100644
--- a/src/gb/gprs_bssgp_bss.c
+++ b/src/gb/gprs_bssgp_bss.c
@@ -30,9 +30,9 @@
#include <osmocom/core/rate_ctr.h>
#include <osmocom/gsm/tlv.h>
#include <osmocom/core/talloc.h>
-#include <osmocom/gprs/gprs_bssgp.h>
-#include <osmocom/gprs/gprs_bssgp_bss.h>
-#include <osmocom/gprs/gprs_ns.h>
+#include <osmocom/gb/gprs_bssgp.h>
+#include <osmocom/gb/gprs_bssgp_bss.h>
+#include <osmocom/gb/gprs_ns.h>
#include "gprs_bssgp_internal.h"
diff --git a/src/gb/gprs_bssgp_internal.h b/src/gb/gprs_bssgp_internal.h
index 5022d32..5a87251 100644
--- a/src/gb/gprs_bssgp_internal.h
+++ b/src/gb/gprs_bssgp_internal.h
@@ -1,7 +1,7 @@
#pragma once
-#include <osmocom/gprs/gprs_bssgp.h>
+#include <osmocom/gb/gprs_bssgp.h>
extern bssgp_bvc_send bssgp_ns_send;
extern void *bssgp_ns_send_data;
diff --git a/src/gb/gprs_bssgp_rim.c b/src/gb/gprs_bssgp_rim.c
index 71f7ea8..4901f35 100644
--- a/src/gb/gprs_bssgp_rim.c
+++ b/src/gb/gprs_bssgp_rim.c
@@ -24,8 +24,8 @@
*/
#include <errno.h>
-#include <osmocom/gprs/gprs_bssgp.h>
-#include <osmocom/gprs/gprs_bssgp_rim.h>
+#include <osmocom/gb/gprs_bssgp.h>
+#include <osmocom/gb/gprs_bssgp_rim.h>
#include <osmocom/gsm/gsm0808_utils.h>
#include "gprs_bssgp_internal.h"
diff --git a/src/gb/gprs_bssgp_util.c b/src/gb/gprs_bssgp_util.c
index 92896c1..a3050e2 100644
--- a/src/gb/gprs_bssgp_util.c
+++ b/src/gb/gprs_bssgp_util.c
@@ -29,8 +29,8 @@
#include <osmocom/core/byteswap.h>
#include <osmocom/gsm/tlv.h>
#include <osmocom/core/talloc.h>
-#include <osmocom/gprs/gprs_bssgp.h>
-#include <osmocom/gprs/gprs_ns.h>
+#include <osmocom/gb/gprs_bssgp.h>
+#include <osmocom/gb/gprs_ns.h>
#include "gprs_bssgp_internal.h"
diff --git a/src/gb/gprs_bssgp_vty.c b/src/gb/gprs_bssgp_vty.c
index d04641d..47cdcec 100644
--- a/src/gb/gprs_bssgp_vty.c
+++ b/src/gb/gprs_bssgp_vty.c
@@ -34,9 +34,9 @@
#include <osmocom/core/talloc.h>
#include <osmocom/core/select.h>
#include <osmocom/core/rate_ctr.h>
-#include <osmocom/gprs/gprs_ns.h>
-#include <osmocom/gprs/gprs_bssgp.h>
-#include <osmocom/gprs/gprs_bssgp_bss.h>
+#include <osmocom/gb/gprs_ns.h>
+#include <osmocom/gb/gprs_bssgp.h>
+#include <osmocom/gb/gprs_bssgp_bss.h>
#include <osmocom/vty/vty.h>
#include <osmocom/vty/command.h>
diff --git a/src/gb/gprs_ns.c b/src/gb/gprs_ns.c
index e250eda..4eaeed4 100644
--- a/src/gb/gprs_ns.c
+++ b/src/gb/gprs_ns.c
@@ -82,9 +82,9 @@
#include <osmocom/core/stats.h>
#include <osmocom/core/socket.h>
#include <osmocom/core/signal.h>
-#include <osmocom/gprs/gprs_ns.h>
-#include <osmocom/gprs/gprs_bssgp.h>
-#include <osmocom/gprs/gprs_ns_frgre.h>
+#include <osmocom/gb/gprs_ns.h>
+#include <osmocom/gb/gprs_bssgp.h>
+#include <osmocom/gb/gprs_ns_frgre.h>
#include "common_vty.h"
#include "gb_internal.h"
diff --git a/src/gb/gprs_ns2.c b/src/gb/gprs_ns2.c
index 02d2266..ae056ee 100644
--- a/src/gb/gprs_ns2.c
+++ b/src/gb/gprs_ns2.c
@@ -80,7 +80,7 @@
#include <osmocom/core/stats.h>
#include <osmocom/core/stat_item.h>
#include <osmocom/core/talloc.h>
-#include <osmocom/gprs/gprs_msgb.h>
+#include <osmocom/gb/gprs_msgb.h>
#include <osmocom/gsm/prim.h>
#include <osmocom/gsm/tlv.h>
diff --git a/src/gb/gprs_ns2_fr.c b/src/gb/gprs_ns2_fr.c
index d651601..5cfb1d4 100644
--- a/src/gb/gprs_ns2_fr.c
+++ b/src/gb/gprs_ns2_fr.c
@@ -45,7 +45,7 @@
#include <linux/hdlc/ioctl.h>
#include <linux/sockios.h>
-#include <osmocom/gprs/frame_relay.h>
+#include <osmocom/gb/frame_relay.h>
#include <osmocom/core/byteswap.h>
#include <osmocom/core/stat_item.h>
#include <osmocom/core/logging.h>
@@ -54,10 +54,10 @@
#include <osmocom/core/socket.h>
#include <osmocom/core/timer.h>
#include <osmocom/core/talloc.h>
-#include <osmocom/gprs/gprs_ns2.h>
+#include <osmocom/gb/gprs_ns2.h>
#include <osmocom/core/netdev.h>
-#include <osmocom/gprs/protocol/gsm_08_16.h>
-#include <osmocom/gprs/protocol/gsm_08_18.h>
+#include <osmocom/gb/protocol/gsm_08_16.h>
+#include <osmocom/gb/protocol/gsm_08_18.h>
#include "config.h"
#include "common_vty.h"
diff --git a/src/gb/gprs_ns2_frgre.c b/src/gb/gprs_ns2_frgre.c
index 9391343..090602a 100644
--- a/src/gb/gprs_ns2_frgre.c
+++ b/src/gb/gprs_ns2_frgre.c
@@ -43,7 +43,7 @@
#include <osmocom/core/select.h>
#include <osmocom/core/socket.h>
#include <osmocom/core/talloc.h>
-#include <osmocom/gprs/gprs_ns2.h>
+#include <osmocom/gb/gprs_ns2.h>
#include "gprs_ns2_internal.h"
diff --git a/src/gb/gprs_ns2_internal.h b/src/gb/gprs_ns2_internal.h
index 4f33221..422614b 100644
--- a/src/gb/gprs_ns2_internal.h
+++ b/src/gb/gprs_ns2_internal.h
@@ -6,8 +6,8 @@
#include <stdint.h>
#include <osmocom/core/logging.h>
-#include <osmocom/gprs/protocol/gsm_08_16.h>
-#include <osmocom/gprs/gprs_ns2.h>
+#include <osmocom/gb/protocol/gsm_08_16.h>
+#include <osmocom/gb/gprs_ns2.h>
#define LOGNSE(nse, lvl, fmt, args ...) \
LOGP(DLNS, lvl, "NSE(%05u) " fmt, (nse)->nsei, ## args)
diff --git a/src/gb/gprs_ns2_message.c b/src/gb/gprs_ns2_message.c
index cc95334..8cddc3d 100644
--- a/src/gb/gprs_ns2_message.c
+++ b/src/gb/gprs_ns2_message.c
@@ -33,9 +33,9 @@
#include <osmocom/core/stat_item.h>
#include <osmocom/core/stats.h>
#include <osmocom/gsm/tlv.h>
-#include <osmocom/gprs/gprs_msgb.h>
-#include <osmocom/gprs/gprs_ns2.h>
-#include <osmocom/gprs/protocol/gsm_08_16.h>
+#include <osmocom/gb/gprs_msgb.h>
+#include <osmocom/gb/gprs_ns2.h>
+#include <osmocom/gb/protocol/gsm_08_16.h>
#include "gprs_ns2_internal.h"
diff --git a/src/gb/gprs_ns2_sns.c b/src/gb/gprs_ns2_sns.c
index 0afc06e..da28bbd 100644
--- a/src/gb/gprs_ns2_sns.c
+++ b/src/gb/gprs_ns2_sns.c
@@ -48,9 +48,9 @@
#include <osmocom/core/socket.h>
#include <osmocom/core/sockaddr_str.h>
#include <osmocom/gsm/tlv.h>
-#include <osmocom/gprs/gprs_msgb.h>
-#include <osmocom/gprs/gprs_ns2.h>
-#include <osmocom/gprs/protocol/gsm_08_16.h>
+#include <osmocom/gb/gprs_msgb.h>
+#include <osmocom/gb/gprs_ns2.h>
+#include <osmocom/gb/protocol/gsm_08_16.h>
#include "gprs_ns2_internal.h"
diff --git a/src/gb/gprs_ns2_udp.c b/src/gb/gprs_ns2_udp.c
index 4816021..78402d4 100644
--- a/src/gb/gprs_ns2_udp.c
+++ b/src/gb/gprs_ns2_udp.c
@@ -31,7 +31,7 @@
#include <osmocom/core/select.h>
#include <osmocom/core/sockaddr_str.h>
#include <osmocom/core/socket.h>
-#include <osmocom/gprs/gprs_ns2.h>
+#include <osmocom/gb/gprs_ns2.h>
#include "common_vty.h"
#include "gprs_ns2_internal.h"
diff --git a/src/gb/gprs_ns2_vc_fsm.c b/src/gb/gprs_ns2_vc_fsm.c
index 9cd83c4..9227b55 100644
--- a/src/gb/gprs_ns2_vc_fsm.c
+++ b/src/gb/gprs_ns2_vc_fsm.c
@@ -42,8 +42,8 @@
#include <osmocom/core/stat_item.h>
#include <osmocom/gsm/prim.h>
#include <osmocom/gsm/tlv.h>
-#include <osmocom/gprs/gprs_msgb.h>
-#include <osmocom/gprs/protocol/gsm_08_16.h>
+#include <osmocom/gb/gprs_msgb.h>
+#include <osmocom/gb/protocol/gsm_08_16.h>
#include "gprs_ns2_internal.h"
diff --git a/src/gb/gprs_ns2_vty.c b/src/gb/gprs_ns2_vty.c
index 3046fff..ec880ae 100644
--- a/src/gb/gprs_ns2_vty.c
+++ b/src/gb/gprs_ns2_vty.c
@@ -41,8 +41,8 @@
#include <osmocom/core/talloc.h>
#include <osmocom/core/sockaddr_str.h>
#include <osmocom/core/socket.h>
-#include <osmocom/gprs/frame_relay.h>
-#include <osmocom/gprs/gprs_ns2.h>
+#include <osmocom/gb/frame_relay.h>
+#include <osmocom/gb/gprs_ns2.h>
#include <osmocom/gsm/tlv.h>
#include <osmocom/vty/command.h>
#include <osmocom/vty/logging.h>
diff --git a/src/gb/gprs_ns_frgre.c b/src/gb/gprs_ns_frgre.c
index dbbd8d2..1ba8020 100644
--- a/src/gb/gprs_ns_frgre.c
+++ b/src/gb/gprs_ns_frgre.c
@@ -38,7 +38,7 @@
#include <osmocom/core/msgb.h>
#include <osmocom/core/talloc.h>
#include <osmocom/core/socket.h>
-#include <osmocom/gprs/gprs_ns.h>
+#include <osmocom/gb/gprs_ns.h>
#include "common_vty.h"
diff --git a/src/gb/gprs_ns_sns.c b/src/gb/gprs_ns_sns.c
index aa8b121..1db90be 100644
--- a/src/gb/gprs_ns_sns.c
+++ b/src/gb/gprs_ns_sns.c
@@ -16,8 +16,8 @@
#include <osmocom/core/signal.h>
#include <osmocom/core/socket.h>
#include <osmocom/gsm/tlv.h>
-#include <osmocom/gprs/gprs_msgb.h>
-#include <osmocom/gprs/gprs_ns.h>
+#include <osmocom/gb/gprs_msgb.h>
+#include <osmocom/gb/gprs_ns.h>
#include "common_vty.h"
#include "gb_internal.h"
diff --git a/src/gb/gprs_ns_vty.c b/src/gb/gprs_ns_vty.c
index f27bf6a..29ddf10 100644
--- a/src/gb/gprs_ns_vty.c
+++ b/src/gb/gprs_ns_vty.c
@@ -36,8 +36,8 @@
#include <osmocom/core/talloc.h>
#include <osmocom/core/select.h>
#include <osmocom/core/rate_ctr.h>
-#include <osmocom/gprs/gprs_ns.h>
-#include <osmocom/gprs/gprs_bssgp.h>
+#include <osmocom/gb/gprs_ns.h>
+#include <osmocom/gb/gprs_bssgp.h>
#include <osmocom/core/socket.h>
#include <osmocom/vty/vty.h>
#include <osmocom/vty/command.h>
diff --git a/tests/fr/fr_test.c b/tests/fr/fr_test.c
index cdcdb43..c55e94b 100644
--- a/tests/fr/fr_test.c
+++ b/tests/fr/fr_test.c
@@ -17,7 +17,7 @@
#define _GNU_SOURCE
#include <osmocom/core/application.h>
-#include <osmocom/gprs/gprs_ns.h>
+#include <osmocom/gb/gprs_ns.h>
#include <sys/types.h>
#include <sys/socket.h>
diff --git a/tests/gb/bssgp_fc_test.c b/tests/gb/bssgp_fc_test.c
index 63e8308..1400435 100644
--- a/tests/gb/bssgp_fc_test.c
+++ b/tests/gb/bssgp_fc_test.c
@@ -13,7 +13,7 @@
#include <osmocom/core/utils.h>
#include <osmocom/core/logging.h>
#include <osmocom/core/talloc.h>
-#include <osmocom/gprs/gprs_bssgp.h>
+#include <osmocom/gb/gprs_bssgp.h>
static unsigned long in_ctr = 1;
static struct timeval tv_start;
diff --git a/tests/gb/gprs_bssgp_rim_test.c b/tests/gb/gprs_bssgp_rim_test.c
index bb533f6..c602caa 100644
--- a/tests/gb/gprs_bssgp_rim_test.c
+++ b/tests/gb/gprs_bssgp_rim_test.c
@@ -14,9 +14,9 @@
#include <osmocom/core/application.h>
#include <osmocom/core/utils.h>
-#include <osmocom/gprs/gprs_bssgp.h>
-#include <osmocom/gprs/gprs_ns.h>
-#include <osmocom/gprs/gprs_bssgp_rim.h>
+#include <osmocom/gb/gprs_bssgp.h>
+#include <osmocom/gb/gprs_ns.h>
+#include <osmocom/gb/gprs_bssgp_rim.h>
#include <stdio.h>
#include <stdlib.h>
diff --git a/tests/gb/gprs_bssgp_test.c b/tests/gb/gprs_bssgp_test.c
index 775ae43..ec5da05 100644
--- a/tests/gb/gprs_bssgp_test.c
+++ b/tests/gb/gprs_bssgp_test.c
@@ -17,9 +17,9 @@
#include <osmocom/core/logging.h>
#include <osmocom/core/talloc.h>
#include <osmocom/core/prim.h>
-#include <osmocom/gprs/gprs_bssgp.h>
-#include <osmocom/gprs/gprs_ns.h>
-#include <osmocom/gprs/gprs_bssgp_bss.h>
+#include <osmocom/gb/gprs_bssgp.h>
+#include <osmocom/gb/gprs_ns.h>
+#include <osmocom/gb/gprs_bssgp_bss.h>
#include <stdio.h>
#include <stdlib.h>
diff --git a/tests/gb/gprs_ns2_test.c b/tests/gb/gprs_ns2_test.c
index 0221a8d..f507910 100644
--- a/tests/gb/gprs_ns2_test.c
+++ b/tests/gb/gprs_ns2_test.c
@@ -27,9 +27,9 @@
#include <osmocom/core/socket.h>
#include <osmocom/core/talloc.h>
#include <osmocom/core/write_queue.h>
-#include <osmocom/gprs/gprs_msgb.h>
-#include <osmocom/gprs/gprs_ns2.h>
-#include <osmocom/gprs/gprs_bssgp.h>
+#include <osmocom/gb/gprs_msgb.h>
+#include <osmocom/gb/gprs_ns2.h>
+#include <osmocom/gb/gprs_bssgp.h>
#include "../../src/gb/gprs_ns2_internal.h"
diff --git a/tests/gb/gprs_ns_test.c b/tests/gb/gprs_ns_test.c
index fc1ec60..4f33531 100644
--- a/tests/gb/gprs_ns_test.c
+++ b/tests/gb/gprs_ns_test.c
@@ -25,9 +25,9 @@
#include <osmocom/core/talloc.h>
#include <osmocom/core/signal.h>
#include <osmocom/core/rate_ctr.h>
-#include <osmocom/gprs/gprs_msgb.h>
-#include <osmocom/gprs/gprs_ns.h>
-#include <osmocom/gprs/gprs_bssgp.h>
+#include <osmocom/gb/gprs_msgb.h>
+#include <osmocom/gb/gprs_ns.h>
+#include <osmocom/gb/gprs_bssgp.h>
#define REMOTE_BSS_ADDR 0x01020304
#define REMOTE_SGSN_ADDR 0x05060708
diff --git a/utils/osmo-ns-dummy-vty.c b/utils/osmo-ns-dummy-vty.c
index 2e59b11..540ba41 100644
--- a/utils/osmo-ns-dummy-vty.c
+++ b/utils/osmo-ns-dummy-vty.c
@@ -38,7 +38,7 @@
#include <osmocom/core/logging.h>
#include <osmocom/gsm/prim.h>
-#include <osmocom/gprs/gprs_ns2.h>
+#include <osmocom/gb/gprs_ns2.h>
#include <osmocom/vty/vty.h>
#include <osmocom/vty/command.h>
diff --git a/utils/osmo-ns-dummy.c b/utils/osmo-ns-dummy.c
index 890444c..afbf4ae 100644
--- a/utils/osmo-ns-dummy.c
+++ b/utils/osmo-ns-dummy.c
@@ -10,7 +10,7 @@
#include <osmocom/core/stats.h>
#include <osmocom/ctrl/control_if.h>
#include <osmocom/ctrl/control_vty.h>
-#include <osmocom/gprs/gprs_ns2.h>
+#include <osmocom/gb/gprs_ns2.h>
#include <osmocom/vty/vty.h>
#include <osmocom/vty/telnet_interface.h>
#include <osmocom/vty/command.h>
To view, visit change 31360. To unsubscribe, or for help writing mail filters, visit settings.