blob: ef0fc838416b18e37276634673146746180b81a1 [file] [log] [blame]
Matt Johnstonf9b99f12024-09-17 16:48:34 +08001/* 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
Matt Johnston44e64df2024-11-05 16:59:42 +080027#ifndef MCTP_DEFAULT_CLOCK_GETTIME
28#define MCTP_DEFAULT_CLOCK_GETTIME 1
29#endif
30
Matt Johnston4058b2c2024-11-07 14:53:50 +080031#ifndef MCTP_CONTROL_HANDLER
32#define MCTP_CONTROL_HANDLER 1
33#endif
34
Matt Johnston44e64df2024-11-05 16:59:42 +080035/* Tag expiry timeout, in milliseconds */
36static const uint64_t MCTP_TAG_TIMEOUT = 6000;
37
Matt Johnstonf9b99f12024-09-17 16:48:34 +080038/* Internal data structures */
39
40enum mctp_bus_state {
41 mctp_bus_state_constructed = 0,
42 mctp_bus_state_tx_enabled,
43 mctp_bus_state_tx_disabled,
44};
45
46struct mctp_bus {
47 mctp_eid_t eid;
48 struct mctp_binding *binding;
49 enum mctp_bus_state state;
50 struct mctp *mctp;
51
52 /* Current message to transmit */
53 void *tx_msg;
54 /* Position in tx_msg */
55 size_t tx_msgpos;
56 /* Length of tx_msg */
57 size_t tx_msglen;
58 /* Length of current packet payload */
59 size_t tx_pktlen;
60 uint8_t tx_seq;
61 uint8_t tx_src;
62 uint8_t tx_dest;
63 bool tx_to;
64 uint8_t tx_tag;
65
66 /* todo: routing */
67};
68
69struct mctp_msg_ctx {
70 /* NULL buf indicates an unused mctp_msg_ctx */
71 void *buf;
72
73 uint8_t src;
74 uint8_t dest;
75 uint8_t tag;
76 uint8_t last_seq;
77 size_t buf_size;
78 size_t buf_alloc_size;
79 size_t fragment_size;
80};
81
82struct mctp_req_tag {
83 /* 0 is an unused entry */
84 mctp_eid_t local;
85 mctp_eid_t remote;
86 uint8_t tag;
Matt Johnston44e64df2024-11-05 16:59:42 +080087 /* time of tag expiry */
88 uint64_t expiry;
Matt Johnstonf9b99f12024-09-17 16:48:34 +080089};
90
Matt Johnston4058b2c2024-11-07 14:53:50 +080091#define MCTP_CONTROL_MAX_TYPES 10
92
93struct mctp_control {
94 /* Types to report from Get MCTP Version Support */
95 uint8_t msg_types[MCTP_CONTROL_MAX_TYPES];
96 size_t num_msg_types;
97};
98
Matt Johnstonf9b99f12024-09-17 16:48:34 +080099struct mctp {
100 int n_busses;
101 struct mctp_bus busses[MCTP_MAX_BUSSES];
102
103 /* Message RX callback */
104 mctp_rx_fn message_rx;
105 void *message_rx_data;
106
107 /* Packet capture callback */
108 mctp_capture_fn capture;
109 void *capture_data;
110
111 /* Message reassembly. */
112 struct mctp_msg_ctx msg_ctxs[MCTP_REASSEMBLY_CTXS];
113
114 /* Allocated outbound TO tags */
115 struct mctp_req_tag req_tags[MCTP_REQ_TAGS];
116 /* used to avoid always allocating tag 0 */
117 uint8_t tag_round_robin;
118
119 enum {
120 ROUTE_ENDPOINT,
121 ROUTE_BRIDGE,
122 } route_policy;
123 size_t max_message_size;
124
Matt Johnston4058b2c2024-11-07 14:53:50 +0800125#if MCTP_CONTROL_HANDLER
126 struct mctp_control control;
127#endif
128
Matt Johnstonf9b99f12024-09-17 16:48:34 +0800129 void *alloc_ctx;
Matt Johnston44e64df2024-11-05 16:59:42 +0800130
131 uint64_t (*platform_now)(void *);
132 void *platform_now_ctx;
Matt Johnstonf9b99f12024-09-17 16:48:34 +0800133};