Neels Hofmeyr | 7299215 | 2020-09-19 02:36:08 +0200 | [diff] [blame^] | 1 | #pragma once |
| 2 | |
| 3 | #include <osmocom/core/linuxlist.h> |
| 4 | #include <osmocom/gsm/gsm0808.h> |
| 5 | #include <osmocom/sigtran/sccp_sap.h> |
| 6 | |
| 7 | #include <osmocom/smlc/debug.h> |
| 8 | #include <osmocom/smlc/lb_conn.h> |
| 9 | |
| 10 | struct vlr_subscr; |
| 11 | struct lb_conn; |
| 12 | struct neighbor_ident_entry; |
| 13 | |
| 14 | #define LOG_LB_PEER_CAT(LB_PEER, subsys, loglevel, fmt, args ...) \ |
| 15 | LOGPFSMSL((LB_PEER)? (LB_PEER)->fi : NULL, subsys, loglevel, fmt, ## args) |
| 16 | |
| 17 | #define LOG_LB_PEER(LB_PEER, loglevel, fmt, args ...) \ |
| 18 | LOG_LB_PEER_CAT(LB_PEER, DLB, loglevel, fmt, ## args) |
| 19 | |
| 20 | struct lb_peer { |
| 21 | struct llist_head entry; |
| 22 | struct osmo_fsm_inst *fi; |
| 23 | |
| 24 | struct sccp_lb_inst *sli; |
| 25 | struct osmo_sccp_addr peer_addr; |
| 26 | }; |
| 27 | |
| 28 | #define lb_peer_for_each_lb_conn(LB_CONN, LB_PEER) \ |
| 29 | llist_for_each_entry(LB_CONN, &(LB_PEER)->sli->lb_conns, entry) \ |
| 30 | if ((LB_CONN)->lb_peer == (LB_PEER)) |
| 31 | |
| 32 | #define lb_peer_for_each_lb_conn_safe(LB_CONN, LB_CONN_NEXT, LB_PEER) \ |
| 33 | llist_for_each_entry_safe(LB_CONN, LB_CONN_NEXT, &(LB_PEER)->sli->lb_conns, entry) \ |
| 34 | if ((LB_CONN)->lb_peer == (LB_PEER)) |
| 35 | |
| 36 | enum lb_peer_state { |
| 37 | LB_PEER_ST_WAIT_RX_RESET = 0, |
| 38 | LB_PEER_ST_WAIT_RX_RESET_ACK, |
| 39 | LB_PEER_ST_READY, |
| 40 | LB_PEER_ST_DISCARDING, |
| 41 | }; |
| 42 | |
| 43 | enum lb_peer_event { |
| 44 | LB_PEER_EV_MSG_UP_CL = 0, |
| 45 | LB_PEER_EV_MSG_UP_CO_INITIAL, |
| 46 | LB_PEER_EV_MSG_UP_CO, |
| 47 | LB_PEER_EV_MSG_DOWN_CL, |
| 48 | LB_PEER_EV_MSG_DOWN_CO_INITIAL, |
| 49 | LB_PEER_EV_MSG_DOWN_CO, |
| 50 | LB_PEER_EV_RX_RESET, |
| 51 | LB_PEER_EV_RX_RESET_ACK, |
| 52 | LB_PEER_EV_CONNECTION_SUCCESS, |
| 53 | LB_PEER_EV_CONNECTION_TIMEOUT, |
| 54 | }; |
| 55 | |
| 56 | struct lb_peer_ev_ctx { |
| 57 | uint32_t conn_id; |
| 58 | struct lb_conn *lb_conn; |
| 59 | struct msgb *msg; |
| 60 | }; |
| 61 | |
| 62 | struct lb_peer *lb_peer_find_or_create(struct sccp_lb_inst *sli, const struct osmo_sccp_addr *peer_addr); |
| 63 | struct lb_peer *lb_peer_find(struct sccp_lb_inst *sli, const struct osmo_sccp_addr *peer_addr); |
| 64 | |
| 65 | int lb_peer_up_l2(struct sccp_lb_inst *sli, const struct osmo_sccp_addr *calling_addr, bool co, uint32_t conn_id, |
| 66 | struct msgb *l2); |
| 67 | void lb_peer_disconnect(struct sccp_lb_inst *sli, uint32_t conn_id); |