#pragma once /* SMLC Lb connection implementation */ #include #include #include 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);