#pragma once #include <stdint.h> #include <osmocom/gprs/protocol/gsm_08_18.h> #include <osmocom/gprs/gprs_ns2.h> struct bssgp2_flow_ctrl; struct gprs_ns2_inst; struct gprs_ra_id; struct msgb; struct bssgp2_flow_ctrl { uint8_t tag; /* maximum bucket size (Bmax) in bytes */ uint64_t bucket_size_max; /*! bucket leak rate in _bytes_ per second */ uint64_t bucket_leak_rate; /* percentage how full the given bucket is */ uint8_t bucket_full_ratio; bool bucket_full_ratio_present; union { /*! FC-BVC specifi members */ struct { /*! default maximum bucket size per MS in bytes */ uint64_t bmax_default_ms; /*! default bucket leak rate (R) for MS flow control bucket */ uint64_t r_default_ms; /*! average milliseconds of queueing delay for a BVC */ uint32_t measurement; bool measurement_present; } bvc; /*! FC-MS specifi members */ struct { /*! TLLI of the MS */ uint32_t tlli; } ms; } u; }; int bssgp2_nsi_tx_ptp(struct gprs_ns2_inst *nsi, uint16_t nsei, uint16_t bvci, struct msgb *msg, uint32_t lsp); int bssgp2_nsi_tx_sig(struct gprs_ns2_inst *nsi, uint16_t nsei, struct msgb *msg, uint32_t lsp); struct msgb *bssgp2_enc_bvc_block(uint16_t bvci, enum gprs_bssgp_cause cause); struct msgb *bssgp2_enc_bvc_block_ack(uint16_t bvci); struct msgb *bssgp2_enc_bvc_unblock(uint16_t bvci); struct msgb *bssgp2_enc_bvc_unblock_ack(uint16_t bvci); struct msgb *bssgp2_enc_bvc_reset(uint16_t bvci, enum gprs_bssgp_cause cause, const struct gprs_ra_id *ra_id, uint16_t cell_id, const uint8_t *feat_bm, const uint8_t *ext_feat_bm); struct msgb *bssgp2_enc_bvc_reset_ack(uint16_t bvci, const struct gprs_ra_id *ra_id, uint16_t cell_id, const uint8_t *feat_bm, const uint8_t *ext_feat_bm); struct msgb *bssgp2_enc_flush_ll(uint32_t tlli, uint16_t old_bvci, const uint16_t *new_bvci, const uint16_t *nsei); struct msgb *bssgp2_enc_status(uint8_t cause, const uint16_t *bvci, const struct msgb *orig_msg, uint16_t max_pdu_len); int bssgp2_dec_fc_bvc(struct bssgp2_flow_ctrl *fc, const struct tlv_parsed *tp); struct msgb *bssgp2_enc_fc_bvc(const struct bssgp2_flow_ctrl *fc, enum bssgp_fc_granularity *gran); struct msgb *bssgp2_enc_fc_bvc_ack(uint8_t tag); int bssgp2_dec_fc_ms(struct bssgp2_flow_ctrl *fc, struct tlv_parsed *tp); struct msgb *bssgp2_enc_fc_ms(const struct bssgp2_flow_ctrl *fc, enum bssgp_fc_granularity *gran); struct msgb *bssgp2_enc_fc_ms_ack(uint32_t tlli, uint8_t tag);