blob: b5ac6d6182e02c3210647d76e818cbc942aff1b3 [file] [log] [blame]
Neels Hofmeyr72992152020-09-19 02:36:08 +02001#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
10struct vlr_subscr;
11struct lb_conn;
12struct 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
20struct 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
36enum 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
43enum 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
56struct lb_peer_ev_ctx {
57 uint32_t conn_id;
58 struct lb_conn *lb_conn;
59 struct msgb *msg;
60};
61
62struct lb_peer *lb_peer_find_or_create(struct sccp_lb_inst *sli, const struct osmo_sccp_addr *peer_addr);
63struct lb_peer *lb_peer_find(struct sccp_lb_inst *sli, const struct osmo_sccp_addr *peer_addr);
64
65int 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);
67void lb_peer_disconnect(struct sccp_lb_inst *sli, uint32_t conn_id);