From 73952e3ab4629076c67fd64351d3d0649d75a426 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/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 + 4 files changed, 511 insertions(+) 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 (limited to 'openbsc/include/osmocom') diff --git a/openbsc/include/osmocom/gprs/Makefile.am b/openbsc/include/osmocom/gprs/Makefile.am new file mode 100644 index 00000000..fe5714ea --- /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 00000000..bfc7d331 --- /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 00000000..7045d84d --- /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 00000000..abcd43ff --- /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 -- cgit v1.2.3 From 605ac5d1e760fad061513e555b005ff5753f3ff1 Mon Sep 17 00:00:00 2001 From: Harald Welte Date: Sat, 16 Jun 2012 16:09:52 +0800 Subject: libgb: move GPRS specific msgb CB definitions to separate header --- openbsc/include/osmocom/gprs/Makefile.am | 2 +- openbsc/include/osmocom/gprs/gprs_bssgp.h | 1 + openbsc/include/osmocom/gprs/gprs_msgb.h | 30 ++++++++++++++++++++++++++++++ openbsc/include/osmocom/gprs/gprs_ns.h | 1 + 4 files changed, 33 insertions(+), 1 deletion(-) create mode 100644 openbsc/include/osmocom/gprs/gprs_msgb.h (limited to 'openbsc/include/osmocom') diff --git a/openbsc/include/osmocom/gprs/Makefile.am b/openbsc/include/osmocom/gprs/Makefile.am index fe5714ea..66b414f3 100644 --- a/openbsc/include/osmocom/gprs/Makefile.am +++ b/openbsc/include/osmocom/gprs/Makefile.am @@ -1,3 +1,3 @@ -libgb_HEADERS = gprs_bssgp.h gprs_ns.h gprs_ns_frgre.h +libgb_HEADERS = gprs_bssgp.h gprs_ns.h gprs_ns_frgre.h gprs_msgb.h libgbdir = $(includedir)/osmocom/gprs diff --git a/openbsc/include/osmocom/gprs/gprs_bssgp.h b/openbsc/include/osmocom/gprs/gprs_bssgp.h index bfc7d331..9970a513 100644 --- a/openbsc/include/osmocom/gprs/gprs_bssgp.h +++ b/openbsc/include/osmocom/gprs/gprs_bssgp.h @@ -198,6 +198,7 @@ enum bssgp_ctr { #include +#include /* BSSGP-UL-UNITDATA.ind */ int gprs_bssgp_rcvmsg(struct msgb *msg); diff --git a/openbsc/include/osmocom/gprs/gprs_msgb.h b/openbsc/include/osmocom/gprs/gprs_msgb.h new file mode 100644 index 00000000..eddd888f --- /dev/null +++ b/openbsc/include/osmocom/gprs/gprs_msgb.h @@ -0,0 +1,30 @@ +#ifndef _LIBGB_MSGB_H +#define _LIBGB_MSGB_H + +#include +/* 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)); +#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 + +#endif diff --git a/openbsc/include/osmocom/gprs/gprs_ns.h b/openbsc/include/osmocom/gprs/gprs_ns.h index 7045d84d..cfc2e905 100644 --- a/openbsc/include/osmocom/gprs/gprs_ns.h +++ b/openbsc/include/osmocom/gprs/gprs_ns.h @@ -88,6 +88,7 @@ enum ns_cause { #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)" -- cgit v1.2.3 From 4fcdd76073edd55fb84e4579777eca006836662c Mon Sep 17 00:00:00 2001 From: Harald Welte Date: Sat, 16 Jun 2012 16:40:42 +0800 Subject: libgb: Use library SS_L_NS instead lf local SS_NS which removes some further dependencies of libgb to openbsc internal code and data. --- openbsc/include/osmocom/gprs/gprs_ns.h | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) (limited to 'openbsc/include/osmocom') diff --git a/openbsc/include/osmocom/gprs/gprs_ns.h b/openbsc/include/osmocom/gprs/gprs_ns.h index cfc2e905..ab4bd4e6 100644 --- a/openbsc/include/osmocom/gprs/gprs_ns.h +++ b/openbsc/include/osmocom/gprs/gprs_ns.h @@ -203,7 +203,7 @@ struct gprs_nsvc { }; /* Create a new NS protocol instance */ -struct gprs_ns_inst *gprs_ns_instantiate(gprs_ns_cb_t *cb); +struct gprs_ns_inst *gprs_ns_instantiate(gprs_ns_cb_t *cb, void *ctx); /* Destroy a NS protocol instance */ void gprs_ns_destroy(struct gprs_ns_inst *nsi); @@ -246,6 +246,18 @@ static inline struct msgb *gprs_ns_msgb_alloc(void) return msgb_alloc_headroom(NS_ALLOC_SIZE, NS_ALLOC_HEADROOM, "GPRS/NS"); } +enum signal_ns { + S_NS_RESET, + S_NS_BLOCK, + S_NS_UNBLOCK, + S_NS_ALIVE_EXP, /* Tns-alive expired more than N times */ +}; + +struct ns_signal_data { + struct gprs_nsvc *nsvc; + uint8_t cause; +}; + /*! }@ */ #endif -- cgit v1.2.3 From cca4963c581f26353b6fb1187446df70b399cf29 Mon Sep 17 00:00:00 2001 From: Harald Welte Date: Sat, 16 Jun 2012 17:45:59 +0800 Subject: libgb: Remove dependency to openbsc/debug.h --- openbsc/include/osmocom/gprs/gprs_bssgp.h | 1 + openbsc/include/osmocom/gprs/gprs_msgb.h | 4 ++++ openbsc/include/osmocom/gprs/gprs_ns.h | 2 ++ 3 files changed, 7 insertions(+) (limited to 'openbsc/include/osmocom') diff --git a/openbsc/include/osmocom/gprs/gprs_bssgp.h b/openbsc/include/osmocom/gprs/gprs_bssgp.h index 9970a513..25c902c1 100644 --- a/openbsc/include/osmocom/gprs/gprs_bssgp.h +++ b/openbsc/include/osmocom/gprs/gprs_bssgp.h @@ -249,5 +249,6 @@ int gprs_bssgp_tx_paging(uint16_t nsei, uint16_t ns_bvci, /* gprs_bssgp_vty.c */ int gprs_bssgp_vty_init(void); +void gprs_bssgp_set_log_ss(int ss); #endif /* _GPRS_BSSGP_H */ diff --git a/openbsc/include/osmocom/gprs/gprs_msgb.h b/openbsc/include/osmocom/gprs/gprs_msgb.h index eddd888f..3567bb7f 100644 --- a/openbsc/include/osmocom/gprs/gprs_msgb.h +++ b/openbsc/include/osmocom/gprs/gprs_msgb.h @@ -27,4 +27,8 @@ struct libgb_msgb_cb { #define msgb_bcid(__x) LIBGB_MSGB_CB(__x)->bssgp_cell_id #define msgb_llch(__x) LIBGB_MSGB_CB(__x)->llch +/* logging contexts */ +#define GPRS_CTX_NSVC 0 +#define GPRS_CTX_BVC 1 + #endif diff --git a/openbsc/include/osmocom/gprs/gprs_ns.h b/openbsc/include/osmocom/gprs/gprs_ns.h index ab4bd4e6..a77515d2 100644 --- a/openbsc/include/osmocom/gprs/gprs_ns.h +++ b/openbsc/include/osmocom/gprs/gprs_ns.h @@ -258,6 +258,8 @@ struct ns_signal_data { uint8_t cause; }; +void gprs_ns_set_log_ss(int ss); + /*! }@ */ #endif -- cgit v1.2.3 From 8ef54d112c2c17a5303fac035825640987cbd40a Mon Sep 17 00:00:00 2001 From: Harald Welte Date: Sun, 17 Jun 2012 09:31:16 +0800 Subject: libgb: remove dependency of BSSGP to include sgsn/gmm internal structs --- openbsc/include/osmocom/gprs/gprs_bssgp.h | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) (limited to 'openbsc/include/osmocom') diff --git a/openbsc/include/osmocom/gprs/gprs_bssgp.h b/openbsc/include/osmocom/gprs/gprs_bssgp.h index 25c902c1..4fcdfb56 100644 --- a/openbsc/include/osmocom/gprs/gprs_bssgp.h +++ b/openbsc/include/osmocom/gprs/gprs_bssgp.h @@ -204,8 +204,21 @@ enum bssgp_ctr { 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); +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; + uint16_t drx_parms; + /* FIXME: priority */ + struct bssgp_lv ms_ra_cap; + uint8_t qos_profile[3]; +}; +int gprs_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, -- cgit v1.2.3 From 15a36434e9d51e57514b2b9357a41293b063e970 Mon Sep 17 00:00:00 2001 From: Harald Welte Date: Sun, 17 Jun 2012 12:16:31 +0800 Subject: libgb: don't call directly into GMM / LLC layer Instead of direct function calls to individual functions, we now generate primitives (osmo_prim) and send them to one application-provided function "bssgp_prim_cb()" --- openbsc/include/osmocom/gprs/gprs_bssgp.h | 37 +++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) (limited to 'openbsc/include/osmocom') diff --git a/openbsc/include/osmocom/gprs/gprs_bssgp.h b/openbsc/include/osmocom/gprs/gprs_bssgp.h index 4fcdfb56..e060fc03 100644 --- a/openbsc/include/osmocom/gprs/gprs_bssgp.h +++ b/openbsc/include/osmocom/gprs/gprs_bssgp.h @@ -144,6 +144,7 @@ enum gprs_bssgp_cause { /* Our implementation */ #include +#include /* gprs_bssgp_util.c */ extern struct gprs_ns_inst *bssgp_nsi; @@ -155,6 +156,40 @@ int bssgp_tx_simple_bvci(uint8_t pdu_type, uint16_t nsei, /* 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, +}; + +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; + } u; +}; + /* gprs_bssgp.c */ #define BVC_S_BLOCKED 0x0001 @@ -264,4 +299,6 @@ int gprs_bssgp_tx_paging(uint16_t nsei, uint16_t ns_bvci, int gprs_bssgp_vty_init(void); void gprs_bssgp_set_log_ss(int ss); +int bssgp_prim_cb(struct osmo_prim_hdr *oph, void *ctx); + #endif /* _GPRS_BSSGP_H */ -- cgit v1.2.3 From f543036719ccbb2431563d6af968502f9097db98 Mon Sep 17 00:00:00 2001 From: Harald Welte Date: Sun, 17 Jun 2012 12:25:53 +0800 Subject: libgb: prefix all NS related functions with gprs_ --- openbsc/include/osmocom/gprs/gprs_ns.h | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) (limited to 'openbsc/include/osmocom') diff --git a/openbsc/include/osmocom/gprs/gprs_ns.h b/openbsc/include/osmocom/gprs/gprs_ns.h index a77515d2..206873b6 100644 --- a/openbsc/include/osmocom/gprs/gprs_ns.h +++ b/openbsc/include/osmocom/gprs/gprs_ns.h @@ -211,6 +211,12 @@ 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); + + struct sockaddr_in; /* main function for higher layers (BSSGP) to send NS messages */ @@ -223,15 +229,10 @@ 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); +struct gprs_nsvc *gprs_nsvc_create(struct gprs_ns_inst *nsi, uint16_t nsvci); +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); /* Initiate a RESET procedure (including timer start, ...)*/ void gprs_nsvc_reset(struct gprs_nsvc *nsvc, uint8_t cause); -- cgit v1.2.3 From 8eda90d9506ca4c34a3476415eb70d51043fcdf1 Mon Sep 17 00:00:00 2001 From: Harald Welte Date: Sun, 17 Jun 2012 12:58:46 +0800 Subject: libgb/gprs: don't use log_info from libcommon anymore --- openbsc/include/osmocom/gprs/gprs_msgb.h | 3 +++ 1 file changed, 3 insertions(+) (limited to 'openbsc/include/osmocom') diff --git a/openbsc/include/osmocom/gprs/gprs_msgb.h b/openbsc/include/osmocom/gprs/gprs_msgb.h index 3567bb7f..f4c85547 100644 --- a/openbsc/include/osmocom/gprs/gprs_msgb.h +++ b/openbsc/include/osmocom/gprs/gprs_msgb.h @@ -31,4 +31,7 @@ struct libgb_msgb_cb { #define GPRS_CTX_NSVC 0 #define GPRS_CTX_BVC 1 +#include +int gprs_log_filter_fn(const struct log_context *ctx, + struct log_target *tar); #endif -- cgit v1.2.3 From de4599cc350747609f1b66d84885b34cf76ae253 Mon Sep 17 00:00:00 2001 From: Harald Welte Date: Sun, 17 Jun 2012 13:04:02 +0800 Subject: libgb: make sure all BSSGP functions have bssgp_ prefix We change the minority of functions employing the gprs_bssgp_ prefix to match with the majority without gprs_ in front. --- openbsc/include/osmocom/gprs/gprs_bssgp.h | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) (limited to 'openbsc/include/osmocom') diff --git a/openbsc/include/osmocom/gprs/gprs_bssgp.h b/openbsc/include/osmocom/gprs/gprs_bssgp.h index e060fc03..66c2290f 100644 --- a/openbsc/include/osmocom/gprs/gprs_bssgp.h +++ b/openbsc/include/osmocom/gprs/gprs_bssgp.h @@ -236,7 +236,7 @@ enum bssgp_ctr { #include /* BSSGP-UL-UNITDATA.ind */ -int gprs_bssgp_rcvmsg(struct msgb *msg); +int bssgp_rcvmsg(struct msgb *msg); /* BSSGP-DL-UNITDATA.req */ struct bssgp_lv { @@ -252,8 +252,8 @@ struct bssgp_dl_ud_par { struct bssgp_lv ms_ra_cap; uint8_t qos_profile[3]; }; -int gprs_bssgp_tx_dl_ud(struct msgb *msg, uint16_t pdu_lifetime, - struct bssgp_dl_ud_par *dup); +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, @@ -292,12 +292,12 @@ struct bssgp_paging_info { }; /* 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); +int 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); -void gprs_bssgp_set_log_ss(int ss); +int bssgp_vty_init(void); +void bssgp_set_log_ss(int ss); int bssgp_prim_cb(struct osmo_prim_hdr *oph, void *ctx); -- cgit v1.2.3 From 8648e49a1c10ec2f6d1560aa3f6c70b059eb52c7 Mon Sep 17 00:00:00 2001 From: Harald Welte Date: Sun, 17 Jun 2012 13:12:51 +0800 Subject: libgb: separate header files related to spec and implementation like in libosmogsm, we separate between header files that are just reflecting information in the respective specs, and header files that related to our specific implementation. --- openbsc/include/osmocom/gprs/Makefile.am | 2 + openbsc/include/osmocom/gprs/gprs_bssgp.h | 142 +-------------------- openbsc/include/osmocom/gprs/gprs_ns.h | 81 +----------- openbsc/include/osmocom/gprs/protocol/Makefile.am | 3 + openbsc/include/osmocom/gprs/protocol/gsm_08_16.h | 85 +++++++++++++ openbsc/include/osmocom/gprs/protocol/gsm_08_18.h | 144 ++++++++++++++++++++++ 6 files changed, 238 insertions(+), 219 deletions(-) create mode 100644 openbsc/include/osmocom/gprs/protocol/Makefile.am create mode 100644 openbsc/include/osmocom/gprs/protocol/gsm_08_16.h create mode 100644 openbsc/include/osmocom/gprs/protocol/gsm_08_18.h (limited to 'openbsc/include/osmocom') diff --git a/openbsc/include/osmocom/gprs/Makefile.am b/openbsc/include/osmocom/gprs/Makefile.am index 66b414f3..d39592c1 100644 --- a/openbsc/include/osmocom/gprs/Makefile.am +++ b/openbsc/include/osmocom/gprs/Makefile.am @@ -1,3 +1,5 @@ libgb_HEADERS = gprs_bssgp.h gprs_ns.h gprs_ns_frgre.h gprs_msgb.h libgbdir = $(includedir)/osmocom/gprs + +SUBDIRS = protocol diff --git a/openbsc/include/osmocom/gprs/gprs_bssgp.h b/openbsc/include/osmocom/gprs/gprs_bssgp.h index 66c2290f..949dbdc8 100644 --- a/openbsc/include/osmocom/gprs/gprs_bssgp.h +++ b/openbsc/include/osmocom/gprs/gprs_bssgp.h @@ -3,149 +3,11 @@ #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 #include +#include + /* gprs_bssgp_util.c */ extern struct gprs_ns_inst *bssgp_nsi; struct msgb *bssgp_msgb_alloc(void); diff --git a/openbsc/include/osmocom/gprs/gprs_ns.h b/openbsc/include/osmocom/gprs/gprs_ns.h index 206873b6..a7f32b25 100644 --- a/openbsc/include/osmocom/gprs/gprs_ns.h +++ b/openbsc/include/osmocom/gprs/gprs_ns.h @@ -3,85 +3,6 @@ #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 @@ -90,6 +11,8 @@ enum ns_cause { #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 \ diff --git a/openbsc/include/osmocom/gprs/protocol/Makefile.am b/openbsc/include/osmocom/gprs/protocol/Makefile.am new file mode 100644 index 00000000..8255a952 --- /dev/null +++ b/openbsc/include/osmocom/gprs/protocol/Makefile.am @@ -0,0 +1,3 @@ +libgbp_HEADERS = gsm_08_16.h gsm_08_18.h + +libgbpdir = $(includedir)/osmocom/gprs/protocol diff --git a/openbsc/include/osmocom/gprs/protocol/gsm_08_16.h b/openbsc/include/osmocom/gprs/protocol/gsm_08_16.h new file mode 100644 index 00000000..4c3eda32 --- /dev/null +++ b/openbsc/include/osmocom/gprs/protocol/gsm_08_16.h @@ -0,0 +1,85 @@ +#ifndef _OSMO_08_16_H +#define _OSMO_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) */ + +#include + +/*! \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, +}; + +#endif diff --git a/openbsc/include/osmocom/gprs/protocol/gsm_08_18.h b/openbsc/include/osmocom/gprs/protocol/gsm_08_18.h new file mode 100644 index 00000000..3a351eaa --- /dev/null +++ b/openbsc/include/osmocom/gprs/protocol/gsm_08_18.h @@ -0,0 +1,144 @@ +#ifndef _OSMO_08_18_H +#define _OSMO_08_18_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, +}; + +#endif -- cgit v1.2.3