From ea34a4e3a7741c0b03fc421e2850234b82a0977c Mon Sep 17 00:00:00 2001 From: Harald Welte Date: Sat, 16 Jun 2012 14:59:56 +0800 Subject: split libgb into a separate library for outside use This also removes the dependency to osmo_sock() inside libcommon and replaces it with osmo_sock_* from libosmocore --- openbsc/configure.ac | 2 + openbsc/include/Makefile.am | 2 +- openbsc/include/openbsc/Makefile.am | 4 +- openbsc/include/openbsc/gb_proxy.h | 2 +- openbsc/include/openbsc/gprs_bssgp.h | 250 -------------------------- openbsc/include/openbsc/gprs_ns.h | 250 -------------------------- openbsc/include/openbsc/gprs_ns_frgre.h | 6 - openbsc/include/openbsc/sgsn.h | 2 +- openbsc/include/osmocom/Makefile.am | 1 + openbsc/include/osmocom/gprs/Makefile.am | 3 + openbsc/include/osmocom/gprs/gprs_bssgp.h | 252 +++++++++++++++++++++++++++ openbsc/include/osmocom/gprs/gprs_ns.h | 250 ++++++++++++++++++++++++++ openbsc/include/osmocom/gprs/gprs_ns_frgre.h | 6 + openbsc/src/gprs/gb_proxy.c | 5 +- openbsc/src/gprs/gb_proxy_main.c | 5 +- openbsc/src/gprs/gb_proxy_vty.c | 3 +- openbsc/src/gprs/gprs_gmm.c | 3 +- openbsc/src/gprs/gprs_llc.c | 2 +- openbsc/src/gprs/gprs_sgsn.c | 5 +- openbsc/src/gprs/gprs_sndcp.c | 2 +- openbsc/src/gprs/sgsn_libgtp.c | 4 +- openbsc/src/gprs/sgsn_main.c | 5 +- openbsc/src/gprs/sgsn_vty.c | 2 +- openbsc/src/libbsc/bsc_vty.c | 2 +- openbsc/src/libgb/gprs_bssgp.c | 8 +- openbsc/src/libgb/gprs_bssgp_bss.c | 4 +- openbsc/src/libgb/gprs_bssgp_util.c | 4 +- openbsc/src/libgb/gprs_bssgp_vty.c | 13 +- openbsc/src/libgb/gprs_ns.c | 21 ++- openbsc/src/libgb/gprs_ns_frgre.c | 14 +- openbsc/src/libgb/gprs_ns_vty.c | 13 +- 31 files changed, 586 insertions(+), 559 deletions(-) delete mode 100644 openbsc/include/openbsc/gprs_bssgp.h delete mode 100644 openbsc/include/openbsc/gprs_ns.h delete mode 100644 openbsc/include/openbsc/gprs_ns_frgre.h create mode 100644 openbsc/include/osmocom/Makefile.am create mode 100644 openbsc/include/osmocom/gprs/Makefile.am create mode 100644 openbsc/include/osmocom/gprs/gprs_bssgp.h create mode 100644 openbsc/include/osmocom/gprs/gprs_ns.h create mode 100644 openbsc/include/osmocom/gprs/gprs_ns_frgre.h diff --git a/openbsc/configure.ac b/openbsc/configure.ac index 16eb732b6..3f9333a31 100644 --- a/openbsc/configure.ac +++ b/openbsc/configure.ac @@ -114,6 +114,8 @@ AM_CONFIG_HEADER(bscconfig.h) AC_OUTPUT( openbsc.pc include/openbsc/Makefile + include/osmocom/Makefile + include/osmocom/gprs/Makefile include/Makefile src/Makefile src/libtrau/Makefile diff --git a/openbsc/include/Makefile.am b/openbsc/include/Makefile.am index 4596b6e3c..2cc8bee71 100644 --- a/openbsc/include/Makefile.am +++ b/openbsc/include/Makefile.am @@ -1,3 +1,3 @@ -SUBDIRS = openbsc +SUBDIRS = openbsc osmocom noinst_HEADERS = mISDNif.h compat_af_isdn.h diff --git a/openbsc/include/openbsc/Makefile.am b/openbsc/include/openbsc/Makefile.am index 8e64ff8d3..58fa691b0 100644 --- a/openbsc/include/openbsc/Makefile.am +++ b/openbsc/include/openbsc/Makefile.am @@ -7,9 +7,9 @@ noinst_HEADERS = abis_nm.h abis_rsl.h db.h gsm_04_08.h gsm_data.h \ system_information.h handover.h mgcp_internal.h \ vty.h socket.h e1_config.h trau_upqueue.h token_auth.h \ handover_decision.h rrlp.h control_if.h \ - crc24.h gprs_bssgp.h gprs_llc.h gprs_ns.h gprs_gmm.h \ + crc24.h gprs_llc.h gprs_gmm.h \ gb_proxy.h gprs_sgsn.h gsm_04_08_gprs.h sgsn.h \ - gprs_ns_frgre.h auth.h osmo_msc.h bsc_msc.h bsc_nat.h \ + auth.h osmo_msc.h bsc_msc.h bsc_nat.h \ osmo_bsc_rf.h osmo_bsc.h network_listen.h bsc_nat_sccp.h \ osmo_msc_data.h osmo_bsc_grace.h sms_queue.h abis_om2000.h \ bss.h gsm_data_shared.h control_cmd.h ipaccess.h mncc_int.h diff --git a/openbsc/include/openbsc/gb_proxy.h b/openbsc/include/openbsc/gb_proxy.h index c0cdcbf05..2c8ddb334 100644 --- a/openbsc/include/openbsc/gb_proxy.h +++ b/openbsc/include/openbsc/gb_proxy.h @@ -4,7 +4,7 @@ #include -#include +#include #include struct gbproxy_config { diff --git a/openbsc/include/openbsc/gprs_bssgp.h b/openbsc/include/openbsc/gprs_bssgp.h deleted file mode 100644 index df93f5b2c..000000000 --- a/openbsc/include/openbsc/gprs_bssgp.h +++ /dev/null @@ -1,250 +0,0 @@ -#ifndef _GPRS_BSSGP_H -#define _GPRS_BSSGP_H - -#include - -/*! \brief Fixed BVCI definitions (Section 5.4.1) */ -#define BVCI_SIGNALLING 0x0000 -#define BVCI_PTM 0x0001 - -/*! \brief 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, - BSSGP_PDUT_PTM_UNITDATA = 0x03, - /* PDUs between GMM SAPs */ - BSSGP_PDUT_PAGING_PS = 0x06, - BSSGP_PDUT_PAGING_CS = 0x07, - BSSGP_PDUT_RA_CAPA_UDPATE = 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, - /* 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_SGSN_INVOKE_TRACE = 0x40, - BSSGP_PDUT_STATUS = 0x41, - /* 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, -}; - -/*! \brief 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)); - -/*! \brief BSSGP normal header */ -struct bssgp_normal_hdr { - uint8_t pdu_type; /*!< BSSGP PDU type */ - uint8_t data[0]; /*!< optional/conditional IEs as TLVs */ -}; - -/*! \brief BSSGP Information Element Identifiers */ -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, -}; - -/*! \brief 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_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, -}; - -/* Our implementation */ - -/* gprs_bssgp_util.c */ -extern struct gprs_ns_inst *bssgp_nsi; -struct msgb *bssgp_msgb_alloc(void); -const char *bssgp_cause_str(enum gprs_bssgp_cause cause); -/* 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); - -/* gprs_bssgp.c */ - -#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; - - /* 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; -/* 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); - -#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, -}; - - -#include - -/* BSSGP-UL-UNITDATA.ind */ -int gprs_bssgp_rcvmsg(struct msgb *msg); - -/* BSSGP-DL-UNITDATA.req */ -struct sgsn_mm_ctx; -int gprs_bssgp_tx_dl_ud(struct msgb *msg, struct sgsn_mm_ctx *mmctx); - -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, uint8_t *buf, int len) -{ - return tlv_parse(tp, &tvlv_att_def, buf, len, 0, 0); -} - -/*! \brief BSSGP Paging mode */ -enum bssgp_paging_mode { - BSSGP_PAGING_PS, - BSSGP_PAGING_CS, -}; - -/*! \brief 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 */ -}; - -/*! \brief 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 gprs_bssgp_tx_paging(uint16_t nsei, uint16_t ns_bvci, - struct bssgp_paging_info *pinfo); - -/* gprs_bssgp_vty.c */ -int gprs_bssgp_vty_init(void); - -#endif /* _GPRS_BSSGP_H */ diff --git a/openbsc/include/openbsc/gprs_ns.h b/openbsc/include/openbsc/gprs_ns.h deleted file mode 100644 index 7045d84d1..000000000 --- a/openbsc/include/openbsc/gprs_ns.h +++ /dev/null @@ -1,250 +0,0 @@ -#ifndef _GPRS_NS_H -#define _GPRS_NS_H - -#include - -/* 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) */ - -/*! \addtogroup libgb - * @{ - */ - -/*! \file gprs_ns.h */ - -/*! \brief 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)); - -/*! \brief 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, -}; - -/*! \brief 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, -}; - -/*! \brief 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, -}; - -/* Our Implementation */ -#include -#include -#include -#include -#include - -#define NS_TIMERS_COUNT 7 -#define NS_TIMERS "(tns-block|tns-block-retries|tns-reset|tns-reset-retries|tns-test|tns-alive|tns-alive-retries)" -#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" - -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, -}; - -#define NSE_S_BLOCKED 0x0001 -#define NSE_S_ALIVE 0x0002 - -/*! \brief 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 */ -}; - -/*! \brief Osmoco NS events */ -enum gprs_ns_evt { - GPRS_NS_EVT_UNIT_DATA, -}; - -struct gprs_nsvc; -/*! \brief 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); - -/*! \brief An instance of the NS protocol stack */ -struct gprs_ns_inst { - /*! \brief callback to the user for incoming UNIT DATA IND */ - gprs_ns_cb_t *cb; - - /*! \brief linked lists of all NSVC in this instance */ - struct llist_head gprs_nsvcs; - - /*! \brief a NSVC object that's needed to deal with packets for - * unknown NSVC */ - struct gprs_nsvc *unknown_nsvc; - - uint16_t timeout[NS_TIMERS_COUNT]; - - /*! \brief NS-over-IP specific bits */ - struct { - struct osmo_fd fd; - uint32_t local_ip; - uint16_t local_port; - } nsip; - /*! \brief NS-over-FR-over-GRE-over-IP specific bits */ - struct { - struct osmo_fd fd; - uint32_t local_ip; - unsigned int enabled:1; - } frgre; -}; - -enum nsvc_timer_mode { - /* standard timers */ - NSVC_TIMER_TNS_TEST, - NSVC_TIMER_TNS_ALIVE, - NSVC_TIMER_TNS_RESET, - _NSVC_TIMER_NR, -}; - -/*! \brief Structure representing a single NS-VC */ -struct gprs_nsvc { - /*! \brief list of NS-VCs within NS Instance */ - struct llist_head list; - /*! \brief pointer to NS Instance */ - struct gprs_ns_inst *nsi; - - uint16_t nsei; /*! \brief end-to-end significance */ - uint16_t nsvci; /*! \brief uniquely identifies NS-VC at SGSN */ - - uint32_t state; - uint32_t remote_state; - - struct osmo_timer_list timer; - enum nsvc_timer_mode timer_mode; - int alive_retries; - - unsigned int remote_end_is_sgsn:1; - unsigned int persistent:1; - - struct rate_ctr_group *ctrg; - - /*! \brief which link-layer are we based on? */ - enum gprs_ns_ll ll; - - union { - struct { - struct sockaddr_in bts_addr; - } ip; - struct { - struct sockaddr_in bts_addr; - } frgre; - }; -}; - -/* Create a new NS protocol instance */ -struct gprs_ns_inst *gprs_ns_instantiate(gprs_ns_cb_t *cb); - -/* 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); - -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); - -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); - -/* Establish a connection (from the BSS) to the SGSN */ -struct gprs_nsvc *nsip_connect(struct gprs_ns_inst *nsi, - struct sockaddr_in *dest, uint16_t nsei, - uint16_t nsvci); - -struct gprs_nsvc *nsvc_create(struct gprs_ns_inst *nsi, uint16_t nsvci); -void nsvc_delete(struct gprs_nsvc *nsvc); -struct gprs_nsvc *nsvc_by_nsei(struct gprs_ns_inst *nsi, uint16_t nsei); -struct gprs_nsvc *nsvc_by_nsvci(struct gprs_ns_inst *nsi, uint16_t nsvci); - -/* Initiate a RESET procedure (including timer start, ...)*/ -void 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); - -#define NS_ALLOC_SIZE 2048 -#define NS_ALLOC_HEADROOM 20 -static inline struct msgb *gprs_ns_msgb_alloc(void) -{ - return msgb_alloc_headroom(NS_ALLOC_SIZE, NS_ALLOC_HEADROOM, "GPRS/NS"); -} - -/*! }@ */ - -#endif diff --git a/openbsc/include/openbsc/gprs_ns_frgre.h b/openbsc/include/openbsc/gprs_ns_frgre.h deleted file mode 100644 index abcd43ffb..000000000 --- a/openbsc/include/openbsc/gprs_ns_frgre.h +++ /dev/null @@ -1,6 +0,0 @@ -#ifndef _GPRS_NS_FRGRE_H -#define _GPRS_NS_FRGRE_H - -int gprs_ns_frgre_sendmsg(struct gprs_nsvc *nsvc, struct msgb *msg); - -#endif diff --git a/openbsc/include/openbsc/sgsn.h b/openbsc/include/openbsc/sgsn.h index 966b4e68b..48a7b3474 100644 --- a/openbsc/include/openbsc/sgsn.h +++ b/openbsc/include/openbsc/sgsn.h @@ -4,7 +4,7 @@ #include -#include +#include #include struct sgsn_config { diff --git a/openbsc/include/osmocom/Makefile.am b/openbsc/include/osmocom/Makefile.am new file mode 100644 index 000000000..596ce23fc --- /dev/null +++ b/openbsc/include/osmocom/Makefile.am @@ -0,0 +1 @@ +SUBDIRS = gprs diff --git a/openbsc/include/osmocom/gprs/Makefile.am b/openbsc/include/osmocom/gprs/Makefile.am new file mode 100644 index 000000000..fe5714ea8 --- /dev/null +++ b/openbsc/include/osmocom/gprs/Makefile.am @@ -0,0 +1,3 @@ +libgb_HEADERS = gprs_bssgp.h gprs_ns.h gprs_ns_frgre.h + +libgbdir = $(includedir)/osmocom/gprs diff --git a/openbsc/include/osmocom/gprs/gprs_bssgp.h b/openbsc/include/osmocom/gprs/gprs_bssgp.h new file mode 100644 index 000000000..bfc7d331d --- /dev/null +++ b/openbsc/include/osmocom/gprs/gprs_bssgp.h @@ -0,0 +1,252 @@ +#ifndef _GPRS_BSSGP_H +#define _GPRS_BSSGP_H + +#include + +/*! \brief Fixed BVCI definitions (Section 5.4.1) */ +#define BVCI_SIGNALLING 0x0000 +#define BVCI_PTM 0x0001 + +/*! \brief 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, + BSSGP_PDUT_PTM_UNITDATA = 0x03, + /* PDUs between GMM SAPs */ + BSSGP_PDUT_PAGING_PS = 0x06, + BSSGP_PDUT_PAGING_CS = 0x07, + BSSGP_PDUT_RA_CAPA_UDPATE = 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, + /* 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_SGSN_INVOKE_TRACE = 0x40, + BSSGP_PDUT_STATUS = 0x41, + /* 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, +}; + +/*! \brief 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)); + +/*! \brief BSSGP normal header */ +struct bssgp_normal_hdr { + uint8_t pdu_type; /*!< BSSGP PDU type */ + uint8_t data[0]; /*!< optional/conditional IEs as TLVs */ +}; + +/*! \brief BSSGP Information Element Identifiers */ +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, +}; + +/*! \brief 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_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, +}; + +/* Our implementation */ + +#include + +/* gprs_bssgp_util.c */ +extern struct gprs_ns_inst *bssgp_nsi; +struct msgb *bssgp_msgb_alloc(void); +const char *bssgp_cause_str(enum gprs_bssgp_cause cause); +/* 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); + +/* gprs_bssgp.c */ + +#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; + + /* 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; +/* 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); + +#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, +}; + + +#include + +/* BSSGP-UL-UNITDATA.ind */ +int gprs_bssgp_rcvmsg(struct msgb *msg); + +/* BSSGP-DL-UNITDATA.req */ +struct sgsn_mm_ctx; +int gprs_bssgp_tx_dl_ud(struct msgb *msg, struct sgsn_mm_ctx *mmctx); + +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, uint8_t *buf, int len) +{ + return tlv_parse(tp, &tvlv_att_def, buf, len, 0, 0); +} + +/*! \brief BSSGP Paging mode */ +enum bssgp_paging_mode { + BSSGP_PAGING_PS, + BSSGP_PAGING_CS, +}; + +/*! \brief 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 */ +}; + +/*! \brief 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 gprs_bssgp_tx_paging(uint16_t nsei, uint16_t ns_bvci, + struct bssgp_paging_info *pinfo); + +/* gprs_bssgp_vty.c */ +int gprs_bssgp_vty_init(void); + +#endif /* _GPRS_BSSGP_H */ diff --git a/openbsc/include/osmocom/gprs/gprs_ns.h b/openbsc/include/osmocom/gprs/gprs_ns.h new file mode 100644 index 000000000..7045d84d1 --- /dev/null +++ b/openbsc/include/osmocom/gprs/gprs_ns.h @@ -0,0 +1,250 @@ +#ifndef _GPRS_NS_H +#define _GPRS_NS_H + +#include + +/* 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) */ + +/*! \addtogroup libgb + * @{ + */ + +/*! \file gprs_ns.h */ + +/*! \brief 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)); + +/*! \brief 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, +}; + +/*! \brief 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, +}; + +/*! \brief 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, +}; + +/* Our Implementation */ +#include +#include +#include +#include +#include + +#define NS_TIMERS_COUNT 7 +#define NS_TIMERS "(tns-block|tns-block-retries|tns-reset|tns-reset-retries|tns-test|tns-alive|tns-alive-retries)" +#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" + +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, +}; + +#define NSE_S_BLOCKED 0x0001 +#define NSE_S_ALIVE 0x0002 + +/*! \brief 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 */ +}; + +/*! \brief Osmoco NS events */ +enum gprs_ns_evt { + GPRS_NS_EVT_UNIT_DATA, +}; + +struct gprs_nsvc; +/*! \brief 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); + +/*! \brief An instance of the NS protocol stack */ +struct gprs_ns_inst { + /*! \brief callback to the user for incoming UNIT DATA IND */ + gprs_ns_cb_t *cb; + + /*! \brief linked lists of all NSVC in this instance */ + struct llist_head gprs_nsvcs; + + /*! \brief a NSVC object that's needed to deal with packets for + * unknown NSVC */ + struct gprs_nsvc *unknown_nsvc; + + uint16_t timeout[NS_TIMERS_COUNT]; + + /*! \brief NS-over-IP specific bits */ + struct { + struct osmo_fd fd; + uint32_t local_ip; + uint16_t local_port; + } nsip; + /*! \brief NS-over-FR-over-GRE-over-IP specific bits */ + struct { + struct osmo_fd fd; + uint32_t local_ip; + unsigned int enabled:1; + } frgre; +}; + +enum nsvc_timer_mode { + /* standard timers */ + NSVC_TIMER_TNS_TEST, + NSVC_TIMER_TNS_ALIVE, + NSVC_TIMER_TNS_RESET, + _NSVC_TIMER_NR, +}; + +/*! \brief Structure representing a single NS-VC */ +struct gprs_nsvc { + /*! \brief list of NS-VCs within NS Instance */ + struct llist_head list; + /*! \brief pointer to NS Instance */ + struct gprs_ns_inst *nsi; + + uint16_t nsei; /*! \brief end-to-end significance */ + uint16_t nsvci; /*! \brief uniquely identifies NS-VC at SGSN */ + + uint32_t state; + uint32_t remote_state; + + struct osmo_timer_list timer; + enum nsvc_timer_mode timer_mode; + int alive_retries; + + unsigned int remote_end_is_sgsn:1; + unsigned int persistent:1; + + struct rate_ctr_group *ctrg; + + /*! \brief which link-layer are we based on? */ + enum gprs_ns_ll ll; + + union { + struct { + struct sockaddr_in bts_addr; + } ip; + struct { + struct sockaddr_in bts_addr; + } frgre; + }; +}; + +/* Create a new NS protocol instance */ +struct gprs_ns_inst *gprs_ns_instantiate(gprs_ns_cb_t *cb); + +/* 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); + +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); + +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); + +/* Establish a connection (from the BSS) to the SGSN */ +struct gprs_nsvc *nsip_connect(struct gprs_ns_inst *nsi, + struct sockaddr_in *dest, uint16_t nsei, + uint16_t nsvci); + +struct gprs_nsvc *nsvc_create(struct gprs_ns_inst *nsi, uint16_t nsvci); +void nsvc_delete(struct gprs_nsvc *nsvc); +struct gprs_nsvc *nsvc_by_nsei(struct gprs_ns_inst *nsi, uint16_t nsei); +struct gprs_nsvc *nsvc_by_nsvci(struct gprs_ns_inst *nsi, uint16_t nsvci); + +/* Initiate a RESET procedure (including timer start, ...)*/ +void 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); + +#define NS_ALLOC_SIZE 2048 +#define NS_ALLOC_HEADROOM 20 +static inline struct msgb *gprs_ns_msgb_alloc(void) +{ + return msgb_alloc_headroom(NS_ALLOC_SIZE, NS_ALLOC_HEADROOM, "GPRS/NS"); +} + +/*! }@ */ + +#endif diff --git a/openbsc/include/osmocom/gprs/gprs_ns_frgre.h b/openbsc/include/osmocom/gprs/gprs_ns_frgre.h new file mode 100644 index 000000000..abcd43ffb --- /dev/null +++ b/openbsc/include/osmocom/gprs/gprs_ns_frgre.h @@ -0,0 +1,6 @@ +#ifndef _GPRS_NS_FRGRE_H +#define _GPRS_NS_FRGRE_H + +int gprs_ns_frgre_sendmsg(struct gprs_nsvc *nsvc, struct msgb *msg); + +#endif diff --git a/openbsc/src/gprs/gb_proxy.c b/openbsc/src/gprs/gb_proxy.c index 1261cccae..afe793d49 100644 --- a/openbsc/src/gprs/gb_proxy.c +++ b/openbsc/src/gprs/gb_proxy.c @@ -32,10 +32,11 @@ #include #include +#include +#include + #include #include -#include -#include #include struct gbprox_peer { diff --git a/openbsc/src/gprs/gb_proxy_main.c b/openbsc/src/gprs/gb_proxy_main.c index 0bfc6cf3b..5791dab39 100644 --- a/openbsc/src/gprs/gb_proxy_main.c +++ b/openbsc/src/gprs/gb_proxy_main.c @@ -37,10 +37,11 @@ #include #include +#include +#include + #include #include -#include -#include #include #include diff --git a/openbsc/src/gprs/gb_proxy_vty.c b/openbsc/src/gprs/gb_proxy_vty.c index 09395ed6b..574f45f78 100644 --- a/openbsc/src/gprs/gb_proxy_vty.c +++ b/openbsc/src/gprs/gb_proxy_vty.c @@ -24,9 +24,10 @@ #include +#include + #include #include -#include #include #include diff --git a/openbsc/src/gprs/gprs_gmm.c b/openbsc/src/gprs/gprs_gmm.c index cc9d2972e..0ed716290 100644 --- a/openbsc/src/gprs/gprs_gmm.c +++ b/openbsc/src/gprs/gprs_gmm.c @@ -38,6 +38,8 @@ #include #include +#include + #include #include #include @@ -45,7 +47,6 @@ #include #include #include -#include #include #include #include diff --git a/openbsc/src/gprs/gprs_llc.c b/openbsc/src/gprs/gprs_llc.c index 708c4c69c..b26f263f2 100644 --- a/openbsc/src/gprs/gprs_llc.c +++ b/openbsc/src/gprs/gprs_llc.c @@ -26,12 +26,12 @@ #include #include #include +#include #include #include #include #include -#include #include #include #include diff --git a/openbsc/src/gprs/gprs_sgsn.c b/openbsc/src/gprs/gprs_sgsn.c index 85f710500..d8da84661 100644 --- a/openbsc/src/gprs/gprs_sgsn.c +++ b/openbsc/src/gprs/gprs_sgsn.c @@ -25,11 +25,12 @@ #include #include #include +#include +#include + #include #include #include -#include -#include #include #include #include diff --git a/openbsc/src/gprs/gprs_sndcp.c b/openbsc/src/gprs/gprs_sndcp.c index e422426a1..853f8dbc9 100644 --- a/openbsc/src/gprs/gprs_sndcp.c +++ b/openbsc/src/gprs/gprs_sndcp.c @@ -27,10 +27,10 @@ #include #include #include +#include #include #include -#include #include #include diff --git a/openbsc/src/gprs/sgsn_libgtp.c b/openbsc/src/gprs/sgsn_libgtp.c index 71694a433..a45d344e1 100644 --- a/openbsc/src/gprs/sgsn_libgtp.c +++ b/openbsc/src/gprs/sgsn_libgtp.c @@ -36,13 +36,13 @@ #include #include #include -#include +#include +#include #include #include #include #include -#include #include #include diff --git a/openbsc/src/gprs/sgsn_main.c b/openbsc/src/gprs/sgsn_main.c index f7eb2214d..640388d80 100644 --- a/openbsc/src/gprs/sgsn_main.c +++ b/openbsc/src/gprs/sgsn_main.c @@ -38,6 +38,9 @@ #include #include +#include +#include + #include #include @@ -45,8 +48,6 @@ #include #include #include -#include -#include #include #include diff --git a/openbsc/src/gprs/sgsn_vty.c b/openbsc/src/gprs/sgsn_vty.c index 0125dad3b..f4a8083a3 100644 --- a/openbsc/src/gprs/sgsn_vty.c +++ b/openbsc/src/gprs/sgsn_vty.c @@ -28,7 +28,7 @@ #include #include -#include +#include #include #include #include diff --git a/openbsc/src/libbsc/bsc_vty.c b/openbsc/src/libbsc/bsc_vty.c index cacc6b048..413eac44d 100644 --- a/openbsc/src/libbsc/bsc_vty.c +++ b/openbsc/src/libbsc/bsc_vty.c @@ -41,7 +41,7 @@ #include #include #include -#include +#include #include #include #include diff --git a/openbsc/src/libgb/gprs_bssgp.c b/openbsc/src/libgb/gprs_bssgp.c index 6722cafba..e93b3de9a 100644 --- a/openbsc/src/libgb/gprs_bssgp.c +++ b/openbsc/src/libgb/gprs_bssgp.c @@ -35,10 +35,10 @@ #include #include #include -#include -#include -#include -#include + +#include +#include + #include void *bssgp_tall_ctx = NULL; diff --git a/openbsc/src/libgb/gprs_bssgp_bss.c b/openbsc/src/libgb/gprs_bssgp_bss.c index 9d76c3aa0..a53423ca1 100644 --- a/openbsc/src/libgb/gprs_bssgp_bss.c +++ b/openbsc/src/libgb/gprs_bssgp_bss.c @@ -28,11 +28,11 @@ #include #include #include +#include +#include #include #include -#include -#include uint8_t *bssgp_msgb_tlli_put(struct msgb *msg, uint32_t tlli) { diff --git a/openbsc/src/libgb/gprs_bssgp_util.c b/openbsc/src/libgb/gprs_bssgp_util.c index a1eb37e18..c794a590e 100644 --- a/openbsc/src/libgb/gprs_bssgp_util.c +++ b/openbsc/src/libgb/gprs_bssgp_util.c @@ -27,11 +27,11 @@ #include #include #include +#include +#include #include #include -#include -#include struct gprs_ns_inst *bssgp_nsi; diff --git a/openbsc/src/libgb/gprs_bssgp_vty.c b/openbsc/src/libgb/gprs_bssgp_vty.c index a0d74ac94..256e8af7f 100644 --- a/openbsc/src/libgb/gprs_bssgp_vty.c +++ b/openbsc/src/libgb/gprs_bssgp_vty.c @@ -26,17 +26,13 @@ #include -#include #include #include #include #include #include -#include -#include -#include -#include -#include +#include +#include #include #include @@ -44,6 +40,11 @@ #include #include +#include +#include +#include + + /* FIXME: this should go to some common file as it is copied * in vty_interface.c of the BSC */ static const struct value_string gprs_bssgp_timer_strs[] = { diff --git a/openbsc/src/libgb/gprs_ns.c b/openbsc/src/libgb/gprs_ns.c index 39ccd2851..c1efa4318 100644 --- a/openbsc/src/libgb/gprs_ns.c +++ b/openbsc/src/libgb/gprs_ns.c @@ -68,18 +68,18 @@ #include -#include #include #include #include #include #include +#include +#include +#include +#include + #include #include -#include -#include -#include -#include static const struct tlv_definition ns_att_tlvdef = { .def = { @@ -1026,14 +1026,19 @@ static int nsip_fd_cb(struct osmo_fd *bfd, unsigned int what) */ int gprs_ns_nsip_listen(struct gprs_ns_inst *nsi) { + struct in_addr in; int ret; - ret = make_sock(&nsi->nsip.fd, IPPROTO_UDP, nsi->nsip.local_ip, - nsi->nsip.local_port, 0, nsip_fd_cb, NULL); + in.s_addr = htonl(nsi->nsip.local_ip); + + nsi->nsip.fd.cb = nsip_fd_cb; + nsi->nsip.fd.data = nsi; + ret = osmo_sock_init_ofd(&nsi->nsip.fd, AF_INET, SOCK_DGRAM, + IPPROTO_UDP, inet_ntoa(in), + nsi->nsip.local_port, OSMO_SOCK_F_BIND); if (ret < 0) return ret; - nsi->nsip.fd.data = nsi; return ret; } diff --git a/openbsc/src/libgb/gprs_ns_frgre.c b/openbsc/src/libgb/gprs_ns_frgre.c index 27c5c57b7..9be9f2a8f 100644 --- a/openbsc/src/libgb/gprs_ns_frgre.c +++ b/openbsc/src/libgb/gprs_ns_frgre.c @@ -34,10 +34,10 @@ #include #include #include +#include +#include -#include #include -#include #define GRE_PTYPE_FR 0x6559 #define GRE_PTYPE_IPv4 0x0800 @@ -282,8 +282,11 @@ static int nsfrgre_fd_cb(struct osmo_fd *bfd, unsigned int what) int gprs_ns_frgre_listen(struct gprs_ns_inst *nsi) { + struct in_addr in; int rc; + in.s_addr = htonl(nsi->frgre.local_ip); + /* Make sure we close any existing socket before changing it */ if (nsi->frgre.fd.fd) close(nsi->frgre.fd.fd); @@ -291,8 +294,11 @@ int gprs_ns_frgre_listen(struct gprs_ns_inst *nsi) if (!nsi->frgre.enabled) return 0; - rc = make_sock(&nsi->frgre.fd, IPPROTO_GRE, nsi->frgre.local_ip, - 0, 0, nsfrgre_fd_cb, NULL); + nsi->frgre.fd.cb = nsfrgre_fd_cb; + nsi->frgre.fd.data = nsi; + rc = osmo_sock_init_ofd(&nsi->frgre.fd, AF_INET, SOCK_RAW, + IPPROTO_GRE, inet_ntoa(in), 0, + OSMO_SOCK_F_BIND); if (rc < 0) { LOGP(DNS, LOGL_ERROR, "Error creating GRE socket (%s)\n", strerror(errno)); diff --git a/openbsc/src/libgb/gprs_ns_vty.c b/openbsc/src/libgb/gprs_ns_vty.c index 1e485ac9d..f1ab28731 100644 --- a/openbsc/src/libgb/gprs_ns_vty.c +++ b/openbsc/src/libgb/gprs_ns_vty.c @@ -26,17 +26,13 @@ #include -#include #include #include #include #include #include -#include -#include -#include -#include -#include +#include +#include #include #include @@ -44,6 +40,11 @@ #include #include +#include +#include +#include +#include + static struct gprs_ns_inst *vty_nsi = NULL; /* FIXME: this should go to some common file as it is copied -- cgit v1.2.3