pespin has uploaded this change for review. ( https://gerrit.osmocom.org/c/libosmocore/+/31360 )
Change subject: Move include osmocom/gprs -> osmocom/gb, deprecate osmocom/gprs/ ......................................................................
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>