blob: 5640780ee8ec8b210b1ff5f82921502e1d8835d1 [file] [log] [blame]
#pragma once
/* SMLC Lb connection implementation */
#include <stdint.h>
#include <osmocom/core/linuxlist.h>
#include <osmocom/smlc/smlc_subscr.h>
struct lb_peer;
struct osmo_fsm_inst;
struct msgb;
struct bssmap_le_pdu;
#define LOG_LB_CONN_SL(CONN, CAT, LEVEL, file, line, FMT, args...) \
LOGPSRC(CAT, LEVEL, file, line, "Lb-%d %s %s: " FMT, (CONN) ? (CONN)->sccp_conn_id : 0, \
((CONN) && (CONN)->smlc_subscr) ? smlc_subscr_to_str_c(OTC_SELECT, (CONN)->smlc_subscr) : "no-subscr", \
(CONN) ? osmo_use_count_to_str_c(OTC_SELECT, &(CONN)->use_count) : "-", \
##args)
#define LOG_LB_CONN_S(CONN, CAT, LEVEL, FMT, args...) \
LOG_LB_CONN_SL(CONN, CAT, LEVEL, NULL, 0, FMT, ##args)
#define LOG_LB_CONN(CONN, LEVEL, FMT, args...) \
LOG_LB_CONN_S(CONN, DLB, LEVEL, FMT, ##args)
#define SMLC_SUBSCR_USE_LB_CONN "Lb-conn"
struct lb_conn {
struct llist_head entry;
struct osmo_use_count use_count;
struct lb_peer *lb_peer;
uint32_t sccp_conn_id;
bool closing;
struct smlc_subscr *smlc_subscr;
struct smlc_loc_req *smlc_loc_req;
};
#define lb_conn_get(lb_conn, use) \
OSMO_ASSERT(osmo_use_count_get_put(&(lb_conn)->use_count, use, 1) == 0)
#define lb_conn_put(lb_conn, use) \
OSMO_ASSERT(osmo_use_count_get_put(&(lb_conn)->use_count, use, -1) == 0)
struct lb_conn *lb_conn_create_incoming(struct lb_peer *lb_peer, uint32_t sccp_conn_id, const char *use_token);
struct lb_conn *lb_conn_create_outgoing(struct lb_peer *lb_peer, const char *use_token);
struct lb_conn *lb_conn_find_by_smlc_subscr(struct smlc_subscr *smlc_subscr, const char *use_token);
void lb_conn_msc_role_gone(struct lb_conn *lb_conn, struct osmo_fsm_inst *msc_role);
void lb_conn_close(struct lb_conn *lb_conn);
void lb_conn_discard(struct lb_conn *lb_conn);
int lb_conn_rx(struct lb_conn *lb_conn, struct msgb *msg, bool initial);
int lb_conn_send_bssmap_le(struct lb_conn *lb_conn, const struct bssmap_le_pdu *bssmap_le);