blob: ef0fc838416b18e37276634673146746180b81a1 [file] [log] [blame]
/* SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later */
#pragma once
#include "libmctp.h"
/* 64kb should be sufficient for a single message. Applications
* requiring higher sizes can override by setting max_message_size.*/
#ifndef MCTP_MAX_MESSAGE_SIZE
#define MCTP_MAX_MESSAGE_SIZE 65536
#endif
/* Must be >= 2 for bridge busses */
#ifndef MCTP_MAX_BUSSES
#define MCTP_MAX_BUSSES 2
#endif
/* Concurrent reassembly contexts. */
#ifndef MCTP_REASSEMBLY_CTXS
#define MCTP_REASSEMBLY_CTXS 16
#endif
/* Outbound request tags */
#ifndef MCTP_REQ_TAGS
#define MCTP_REQ_TAGS MCTP_REASSEMBLY_CTXS
#endif
#ifndef MCTP_DEFAULT_CLOCK_GETTIME
#define MCTP_DEFAULT_CLOCK_GETTIME 1
#endif
#ifndef MCTP_CONTROL_HANDLER
#define MCTP_CONTROL_HANDLER 1
#endif
/* Tag expiry timeout, in milliseconds */
static const uint64_t MCTP_TAG_TIMEOUT = 6000;
/* Internal data structures */
enum mctp_bus_state {
mctp_bus_state_constructed = 0,
mctp_bus_state_tx_enabled,
mctp_bus_state_tx_disabled,
};
struct mctp_bus {
mctp_eid_t eid;
struct mctp_binding *binding;
enum mctp_bus_state state;
struct mctp *mctp;
/* Current message to transmit */
void *tx_msg;
/* Position in tx_msg */
size_t tx_msgpos;
/* Length of tx_msg */
size_t tx_msglen;
/* Length of current packet payload */
size_t tx_pktlen;
uint8_t tx_seq;
uint8_t tx_src;
uint8_t tx_dest;
bool tx_to;
uint8_t tx_tag;
/* todo: routing */
};
struct mctp_msg_ctx {
/* NULL buf indicates an unused mctp_msg_ctx */
void *buf;
uint8_t src;
uint8_t dest;
uint8_t tag;
uint8_t last_seq;
size_t buf_size;
size_t buf_alloc_size;
size_t fragment_size;
};
struct mctp_req_tag {
/* 0 is an unused entry */
mctp_eid_t local;
mctp_eid_t remote;
uint8_t tag;
/* time of tag expiry */
uint64_t expiry;
};
#define MCTP_CONTROL_MAX_TYPES 10
struct mctp_control {
/* Types to report from Get MCTP Version Support */
uint8_t msg_types[MCTP_CONTROL_MAX_TYPES];
size_t num_msg_types;
};
struct mctp {
int n_busses;
struct mctp_bus busses[MCTP_MAX_BUSSES];
/* Message RX callback */
mctp_rx_fn message_rx;
void *message_rx_data;
/* Packet capture callback */
mctp_capture_fn capture;
void *capture_data;
/* Message reassembly. */
struct mctp_msg_ctx msg_ctxs[MCTP_REASSEMBLY_CTXS];
/* Allocated outbound TO tags */
struct mctp_req_tag req_tags[MCTP_REQ_TAGS];
/* used to avoid always allocating tag 0 */
uint8_t tag_round_robin;
enum {
ROUTE_ENDPOINT,
ROUTE_BRIDGE,
} route_policy;
size_t max_message_size;
#if MCTP_CONTROL_HANDLER
struct mctp_control control;
#endif
void *alloc_ctx;
uint64_t (*platform_now)(void *);
void *platform_now_ctx;
};