xref: /openbmc/libmctp/core-internal.h (revision 44e64dfa1bc7de084d644b10b004b987ccea0d69)
1 /* SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later */
2 #pragma once
3 
4 #include "libmctp.h"
5 
6 /* 64kb should be sufficient for a single message. Applications
7  * requiring higher sizes can override by setting max_message_size.*/
8 #ifndef MCTP_MAX_MESSAGE_SIZE
9 #define MCTP_MAX_MESSAGE_SIZE 65536
10 #endif
11 
12 /* Must be >= 2 for bridge busses */
13 #ifndef MCTP_MAX_BUSSES
14 #define MCTP_MAX_BUSSES 2
15 #endif
16 
17 /* Concurrent reassembly contexts. */
18 #ifndef MCTP_REASSEMBLY_CTXS
19 #define MCTP_REASSEMBLY_CTXS 16
20 #endif
21 
22 /* Outbound request tags */
23 #ifndef MCTP_REQ_TAGS
24 #define MCTP_REQ_TAGS MCTP_REASSEMBLY_CTXS
25 #endif
26 
27 #ifndef MCTP_DEFAULT_CLOCK_GETTIME
28 #define MCTP_DEFAULT_CLOCK_GETTIME 1
29 #endif
30 
31 /* Tag expiry timeout, in milliseconds */
32 static const uint64_t MCTP_TAG_TIMEOUT = 6000;
33 
34 /* Internal data structures */
35 
36 enum mctp_bus_state {
37 	mctp_bus_state_constructed = 0,
38 	mctp_bus_state_tx_enabled,
39 	mctp_bus_state_tx_disabled,
40 };
41 
42 struct mctp_bus {
43 	mctp_eid_t eid;
44 	struct mctp_binding *binding;
45 	enum mctp_bus_state state;
46 	struct mctp *mctp;
47 
48 	/* Current message to transmit */
49 	void *tx_msg;
50 	/* Position in tx_msg */
51 	size_t tx_msgpos;
52 	/* Length of tx_msg */
53 	size_t tx_msglen;
54 	/* Length of current packet payload */
55 	size_t tx_pktlen;
56 	uint8_t tx_seq;
57 	uint8_t tx_src;
58 	uint8_t tx_dest;
59 	bool tx_to;
60 	uint8_t tx_tag;
61 
62 	/* todo: routing */
63 };
64 
65 struct mctp_msg_ctx {
66 	/* NULL buf indicates an unused mctp_msg_ctx */
67 	void *buf;
68 
69 	uint8_t src;
70 	uint8_t dest;
71 	uint8_t tag;
72 	uint8_t last_seq;
73 	size_t buf_size;
74 	size_t buf_alloc_size;
75 	size_t fragment_size;
76 };
77 
78 struct mctp_req_tag {
79 	/* 0 is an unused entry */
80 	mctp_eid_t local;
81 	mctp_eid_t remote;
82 	uint8_t tag;
83 	/* time of tag expiry */
84 	uint64_t expiry;
85 };
86 
87 struct mctp {
88 	int n_busses;
89 	struct mctp_bus busses[MCTP_MAX_BUSSES];
90 
91 	/* Message RX callback */
92 	mctp_rx_fn message_rx;
93 	void *message_rx_data;
94 
95 	/* Packet capture callback */
96 	mctp_capture_fn capture;
97 	void *capture_data;
98 
99 	/* Message reassembly. */
100 	struct mctp_msg_ctx msg_ctxs[MCTP_REASSEMBLY_CTXS];
101 
102 	/* Allocated outbound TO tags */
103 	struct mctp_req_tag req_tags[MCTP_REQ_TAGS];
104 	/* used to avoid always allocating tag 0 */
105 	uint8_t tag_round_robin;
106 
107 	enum {
108 		ROUTE_ENDPOINT,
109 		ROUTE_BRIDGE,
110 	} route_policy;
111 	size_t max_message_size;
112 
113 	void *alloc_ctx;
114 
115 	uint64_t (*platform_now)(void *);
116 	void *platform_now_ctx;
117 };
118