libosmo-gprs/include/osmocom/gprs/sndcp/sndcp_prim.h

213 lines
6.4 KiB
C

#pragma once
/* 3GPP TS 44.065, section 5 "Service primitives and functions" */
#include <stdint.h>
#include <stddef.h>
#include <osmocom/core/prim.h>
#include <osmocom/gsm/gsm0808_utils.h>
#include <osmocom/gprs/sndcp/sndcp.h>
struct osmo_gprs_llc_prim;
/* Section 5.1 "Service primitives" */
enum osmo_gprs_sndcp_prim_sap {
OSMO_GPRS_SNDCP_SAP_SN,
OSMO_GPRS_SNDCP_SAP_SNSM,
};
extern const struct value_string osmo_gprs_sndcp_prim_sap_names[];
static inline const char *osmo_gprs_sndcp_prim_sap_name(enum osmo_gprs_sndcp_prim_sap val)
{
return get_value_string(osmo_gprs_sndcp_prim_sap_names, val);
}
/* Table 1: SNDCP layer service primitives */
enum osmo_gprs_sndcp_sn_prim_type {
OSMO_GPRS_SNDCP_SN_DATA, /* Req/Ind: N-PDU, NSAPI, N-PDU Number*/
OSMO_GPRS_SNDCP_SN_UNITDATA, /* Req/Ind: N-PDU, NSAPI */
OSMO_GPRS_SNDCP_SN_XID, /* Req/Ind/Resp/Cnf: Req/Neg SNDCP XID Parameters */
};
extern const struct value_string osmo_gprs_sndcp_sn_prim_type_names[];
static inline const char *osmo_gprs_sndcp_sn_prim_type_name(enum osmo_gprs_sndcp_sn_prim_type val)
{
return get_value_string(osmo_gprs_sndcp_sn_prim_type_names, val);
}
/* Table 2: Service primitives used by the SNDCP entity */
enum osmo_gprs_sndcp_snsm_prim_type {
OSMO_GPRS_SNDCP_SNSM_ACTIVATE, /* Ind/Resp: TLLI, NSAPI, QoS profile, SAPI, Radio Priority */
OSMO_GPRS_SNDCP_SNSM_DEACTIVATE, /* Ind/Resp: TLLI, NSAPI(s), LLC Release Indicator, XID Negotiation Indicator */
OSMO_GPRS_SNDCP_SNSM_MODIFY, /* Ind/Resp: TLLI, NSAPI, QoS Profile, SAPI, Radio Priority, Send N-PDU Number, Receive N-PDU Number */
OSMO_GPRS_SNDCP_SNSM_STATUS, /* Req: TLLI, SAPI, Cause */
OSMO_GPRS_SNDCP_SNSM_SEQUENCE, /* Ind/Resp: TLLI, NSAPI, Receive N-PDU Number */
OSMO_GPRS_SNDCP_SNSM_STOP_ASSIGN, /* Ind/Resp: TLLI, NSAPI */
};
extern const struct value_string osmo_gprs_sndcp_snsm_prim_type_names[];
static inline const char *osmo_gprs_sndcp_snsm_prim_type_name(enum osmo_gprs_sndcp_snsm_prim_type val)
{
return get_value_string(osmo_gprs_sndcp_snsm_prim_type_names, val);
}
/* Parameters for OSMO_GPRS_SNDCP_SN_* prims */
struct osmo_gprs_sndcp_sn_prim {
/* Common fields */
uint32_t tlli;
uint8_t sapi; /* llc */
/* Specific fields */
union {
/* OSMO_GPRS_SNDCP_SN_DATA | Req */
struct {
uint8_t nsapi;
uint8_t *npdu;
size_t npdu_len;
uint32_t npdu_number;
} data_req;
/* OSMO_GPRS_SNDCP_SN_DATA | Ind */
struct {
uint8_t nsapi;
uint8_t *npdu;
size_t npdu_len;
} data_ind;
/* OSMO_GPRS_SNDCP_SN_UNITDATA | Req */
struct {
uint8_t nsapi;
uint8_t *npdu;
size_t npdu_len;
} unitdata_req;
/* OSMO_GPRS_SNDCP_SN_UNITDATA | Ind */
struct {
uint8_t nsapi;
uint8_t *npdu;
size_t npdu_len;
} unitdata_ind;
/* OSMO_GPRS_SNDCP_SN_XID | Req */
struct {
uint8_t nsapi;
struct {
bool active;
bool passive;
int s01;
} pcomp_rfc1144;
struct {
bool active;
bool passive;
int p0;
int p1;
int p2;
} dcomp_v42bis;
} xid_req;
/* OSMO_GPRS_SNDCP_SN_XID | Ind */
struct {
uint8_t *req_xid;
uint32_t req_xid_len;
} xid_ind;
/* OSMO_GPRS_SNDCP_SN_XID | Rsp */
struct {
uint8_t nsapi;
} xid_rsp;
/* OSMO_GPRS_SNDCP_SN_XID | Cnf */
struct {
uint8_t *neg_xid;
uint32_t neg_xid_len;
} xid_cnf;
};
};
/* Parameters for OSMO_GPRS_SNDCP_SNSM_* prims */
struct osmo_gprs_sndcp_snsm_prim {
/* Common fields */
uint32_t tlli;
/* Specific fields */
union {
/* OSMO_GPRS_SNDCP_SNSM_ACTIVATE | Ind */
struct {
uint8_t nsapi;
uint8_t sapi;
uint8_t qos_params[3];
uint8_t radio_prio;
} activate_ind;
/* OSMO_GPRS_SNDCP_SNSM_ACTIVATE | Rsp */
struct {
uint8_t nsapi;
} activate_rsp;
/* OSMO_GPRS_SNDCP_SNSM_DEACTIVATE | Req */
struct {
uint8_t nsapi;
/* TODO: LLC Release Indicator,
XID Negotiation Indicator
*/
} deactivate_ind;
/* OSMO_GPRS_SNDCP_SNSM_DEACTIVATE | Rsp */
struct {
uint8_t nsapi;
} deactivate_rsp;
/* OSMO_GPRS_SNDCP_SNSM_MODIFY | Ind */
struct {
uint8_t nsapi;
uint8_t sapi;
uint8_t qos_params[3];
uint8_t radio_prio;
unsigned int tx_npdu_nr;
unsigned int rx_npdu_nr;
} modify_ind;
/* OSMO_GPRS_SNDCP_SNSM_MODIFY | Rsp */
struct {
uint8_t nsapi;
} modify_rsp;
/* OSMO_GPRS_SNDCP_SNSM_STATUS| Req */
struct {
uint8_t sapi;
uint8_t cause;
} status_req;
/* OSMO_GPRS_SNDCP_SNSM_SEQUENCE | Ind */
struct {
uint8_t nsapi;
unsigned int rx_npdu_nr;
} sequence_ind;
/* OSMO_GPRS_SNDCP_SNSM_SEQUENCE | Rsp */
struct {
uint8_t nsapi;
} sequence_rsp;
/* OSMO_GPRS_SNDCP_SNSM_STOP_ASSIGN | Ind */
struct {
uint8_t nsapi;
} stop_assign_ind;
};
};
struct osmo_gprs_sndcp_prim {
struct osmo_prim_hdr oph;
union {
struct osmo_gprs_sndcp_sn_prim sn;
struct osmo_gprs_sndcp_snsm_prim snsm;
};
};
typedef int (*osmo_gprs_sndcp_prim_up_cb)(struct osmo_gprs_sndcp_prim *sndcp_prim, void *up_user_data);
void osmo_gprs_sndcp_prim_set_up_cb(osmo_gprs_sndcp_prim_up_cb up_cb, void *up_user_data);
typedef int (*osmo_gprs_sndcp_prim_down_cb)(struct osmo_gprs_llc_prim *llc_prim, void *down_user_data);
void osmo_gprs_sndcp_prim_set_down_cb(osmo_gprs_sndcp_prim_down_cb down_cb, void *down_user_data);
typedef int (*osmo_gprs_sndcp_prim_snsm_cb)(struct osmo_gprs_sndcp_prim *sndcp_prim, void *snsm_user_data);
void osmo_gprs_sndcp_prim_set_snsm_cb(osmo_gprs_sndcp_prim_snsm_cb snsm_cb, void *snsm_user_data);
int osmo_gprs_sndcp_prim_upper_down(struct osmo_gprs_sndcp_prim *sndcp_prim);
int osmo_gprs_sndcp_prim_lower_up(struct osmo_gprs_llc_prim *llc_prim);
int osmo_gprs_sndcp_prim_dispatch_snsm(struct osmo_gprs_sndcp_prim *sndcp_prim);
const char *osmo_gprs_sndcp_prim_name(const struct osmo_gprs_sndcp_prim *sndcp_prim);
/* Alloc primitive for SN SAP: */
struct osmo_gprs_sndcp_prim *osmo_gprs_sndcp_prim_alloc_sn_data_req(uint32_t tlli, uint8_t sapi, uint8_t nsapi, uint8_t *npdu, size_t npdu_len);
struct osmo_gprs_sndcp_prim *osmo_gprs_sndcp_prim_alloc_sn_unitdata_req(uint32_t tlli, uint8_t sapi, uint8_t nsapi, uint8_t *npdu, size_t npdu_len);
struct osmo_gprs_sndcp_prim *osmo_gprs_sndcp_prim_alloc_sn_xid_req(uint32_t tlli, uint8_t sapi, uint8_t nsapi);
struct osmo_gprs_sndcp_prim *osmo_gprs_sndcp_prim_alloc_sn_xid_rsp(uint32_t tlli, uint8_t sapi, uint8_t nsapi);
/* Alloc primitive for SNSM SAP: */
struct osmo_gprs_sndcp_prim *osmo_gprs_sndcp_prim_alloc_snsm_activate_ind(uint32_t tlli, uint8_t nsapi, uint8_t sapi);
struct osmo_gprs_sndcp_prim *osmo_gprs_sndcp_prim_alloc_snsm_deactivate_ind(uint32_t tlli, uint8_t nsapi);