blob: 9d3a6205eb3cb08b080c579f944dba0891f98acb [file] [log] [blame]
Harald Welte17a892f2020-12-07 21:39:03 +01001#pragma once
2#include <stdint.h>
3
4struct gprs_ns2_inst;
5struct osmo_fsm_inst;
6struct gprs_ra_id;
Harald Welte1fcfce82020-12-08 21:15:45 +01007struct bssgp2_flow_ctrl;
Harald Welte17a892f2020-12-07 21:39:03 +01008
9enum bssp_ptp_bvc_fsm_state {
10 BSSGP_BVCFSM_S_NULL,
11 BSSGP_BVCFSM_S_BLOCKED,
12 BSSGP_BVCFSM_S_WAIT_RESET_ACK,
13 BSSGP_BVCFSM_S_UNBLOCKED,
14};
15
16enum bssgp_ptp_bvc_fsm_event {
17 /* Rx of BSSGP PDUs from the remote side; 'data' is 'struct tlv_parsed', and
18 * the assumption is that the caller has already validated all mandatory IEs
19 * are present and of sufficient length */
20 BSSGP_BVCFSM_E_RX_BLOCK,
21 BSSGP_BVCFSM_E_RX_BLOCK_ACK,
22 BSSGP_BVCFSM_E_RX_UNBLOCK,
23 BSSGP_BVCFSM_E_RX_UNBLOCK_ACK,
24 BSSGP_BVCFSM_E_RX_RESET,
25 BSSGP_BVCFSM_E_RX_RESET_ACK,
Harald Welte1fcfce82020-12-08 21:15:45 +010026 BSSGP_BVCFSM_E_RX_FC_BVC,
27 BSSGP_BVCFSM_E_RX_FC_BVC_ACK,
Harald Welte17a892f2020-12-07 21:39:03 +010028 /* Requests of the local user */
29 BSSGP_BVCFSM_E_REQ_BLOCK, /* data: uint8_t *cause */
30 BSSGP_BVCFSM_E_REQ_UNBLOCK,
31 BSSGP_BVCFSM_E_REQ_RESET, /* data: uint8_t *cause */
Harald Welte1fcfce82020-12-08 21:15:45 +010032 BSSGP_BVCFSM_E_REQ_FC_BVC, /* data: struct bssgp2_flow_ctrl */
Harald Welte17a892f2020-12-07 21:39:03 +010033};
34
35struct bssgp_bvc_fsm_ops {
36 /* call-back notifying the user of a state change */
37 void (*state_chg_notification)(uint16_t nsei, uint16_t bvci, int old_state, int new_state,
38 void *priv);
39 /* call-back notifying the user of a BVC-RESET event */
40 void (*reset_notification)(uint16_t nsei, uint16_t bvci, const struct gprs_ra_id *ra_id,
41 uint16_t cell_id, uint8_t cause, void *priv);
Harald Welte1fcfce82020-12-08 21:15:45 +010042 void (*rx_fc_bvc)(uint16_t nsei, uint16_t bvci, const struct bssgp2_flow_ctrl *fc, void *priv);
Daniel Willmann767bfd82022-03-30 11:34:36 +020043 void (*reset_ack_notification)(uint16_t nsei, uint16_t bvci, const struct gprs_ra_id *ra_id,
44 uint16_t cell_id, uint8_t cause, void *priv);
Harald Welte17a892f2020-12-07 21:39:03 +010045};
46
47struct osmo_fsm_inst *
48bssgp_bvc_fsm_alloc_sig_bss(void *ctx, struct gprs_ns2_inst *nsi, uint16_t nsei, uint32_t features);
49
50struct osmo_fsm_inst *
51bssgp_bvc_fsm_alloc_ptp_bss(void *ctx, struct gprs_ns2_inst *nsi, uint16_t nsei, uint16_t bvci,
52 const struct gprs_ra_id *ra_id, uint16_t cell_id);
53
54struct osmo_fsm_inst *
55bssgp_bvc_fsm_alloc_sig_sgsn(void *ctx, struct gprs_ns2_inst *nsi, uint16_t nsei, uint32_t features);
56
57struct osmo_fsm_inst *
58bssgp_bvc_fsm_alloc_ptp_sgsn(void *ctx, struct gprs_ns2_inst *nsi, uint16_t nsei, uint16_t bvci);
59
60void bssgp_bvc_fsm_set_ops(struct osmo_fsm_inst *fi, const struct bssgp_bvc_fsm_ops *ops, void *ops_priv);
61
62bool bssgp_bvc_fsm_is_unblocked(struct osmo_fsm_inst *fi);
63
64uint8_t bssgp_bvc_fsm_get_block_cause(struct osmo_fsm_inst *fi);
65
Daniel Willmann4e5cdad2021-02-12 22:27:56 +010066uint32_t bssgp_bvc_fsm_get_features_advertised(struct osmo_fsm_inst *fi);
67uint32_t bssgp_bvc_fsm_get_features_received(struct osmo_fsm_inst *fi);
68uint32_t bssgp_bvc_fsm_get_features_negotiated(struct osmo_fsm_inst *fi);
Daniel Willmann1ff86f72021-01-25 17:02:25 +010069
70void bssgp_bvc_fsm_set_max_pdu_len(struct osmo_fsm_inst *fi, uint16_t max_pdu_len);
71uint16_t bssgp_bvc_fsm_get_max_pdu_len(const struct osmo_fsm_inst *fi);