blob: 6251ce15684abc69687a13d8f1da5d6a6eaa44b8 [file] [log] [blame]
/*
* include/vservices/transport.h
*
* Copyright (c) 2012-2018 General Dynamics
* Copyright (c) 2014 Open Kernel Labs, Inc.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*
* This file contains the transport vtable structure. This is made public so
* that the application drivers can call the vtable functions directly (via
* the inlined wrappers in service.h) rather than indirectly via a function
* call.
*
*/
#ifndef _VSERVICES_TRANSPORT_H_
#define _VSERVICES_TRANSPORT_H_
#include <linux/types.h>
#include <vservices/types.h>
struct vs_transport;
struct vs_mbuf;
struct vs_service_device;
/**
* struct vs_transport_vtable - Transport driver operations. Transport drivers
* must provide implementations for all operations in this table.
* --- Message buffer allocation ---
* @alloc_mbuf: Allocate an mbuf of the given size for the given service
* @free_mbuf: Deallocate an mbuf
* @mbuf_size: Return the size in bytes of a message buffer. The size returned
* should be the total number of bytes including any headers.
* @max_mbuf_size: Return the maximum allowable message buffer allocation size.
* --- Message sending ---
* @send: Queue an mbuf for sending
* @flush: Start the transfer for the current message batch, if any
* @notify: Send a notification
* --- Transport-level reset handling ---
* @reset: Reset the transport layer
* @ready: Ready the transport layer
* --- Service management ---
* @service_add: A new service has been added to this transport's session
* @service_remove: A service has been removed from this transport's session
* @service_start: A service on this transport's session has had its resource
* allocations set and is about to start. This is always interleaved with
* service_reset, with one specific exception: the core service client,
* which has its quotas initially hard-coded to 0 send / 1 recv and
* adjusted when the initial startup message arrives.
* @service_reset: A service on this transport's session has just been reset,
* and any resources allocated to it should be cleaned up to prepare
* for later reallocation.
* @service_send_avail: The number of message buffers that this service is
* able to send before going over quota.
* --- Query transport capabilities ---
* @get_notify_bits: Fetch the number of sent and received notification bits
* supported by this transport. Note that this can be any positive value
* up to UINT_MAX.
* @get_quota_limits: Fetch the total send and receive message buffer quotas
* supported by this transport. Note that this can be any positive value
* up to UINT_MAX.
*/
struct vs_transport_vtable {
/* Message buffer allocation */
struct vs_mbuf *(*alloc_mbuf)(struct vs_transport *transport,
struct vs_service_device *service, size_t size,
gfp_t gfp_flags);
void (*free_mbuf)(struct vs_transport *transport,
struct vs_service_device *service,
struct vs_mbuf *mbuf);
size_t (*mbuf_size)(struct vs_mbuf *mbuf);
size_t (*max_mbuf_size)(struct vs_transport *transport);
/* Sending messages */
int (*send)(struct vs_transport *transport,
struct vs_service_device *service,
struct vs_mbuf *mbuf, unsigned long flags);
int (*flush)(struct vs_transport *transport,
struct vs_service_device *service);
int (*notify)(struct vs_transport *transport,
struct vs_service_device *service,
unsigned long bits);
/* Raising and clearing transport-level reset */
void (*reset)(struct vs_transport *transport);
void (*ready)(struct vs_transport *transport);
/* Service management */
int (*service_add)(struct vs_transport *transport,
struct vs_service_device *service);
void (*service_remove)(struct vs_transport *transport,
struct vs_service_device *service);
int (*service_start)(struct vs_transport *transport,
struct vs_service_device *service);
int (*service_reset)(struct vs_transport *transport,
struct vs_service_device *service);
ssize_t (*service_send_avail)(struct vs_transport *transport,
struct vs_service_device *service);
/* Query transport capabilities */
void (*get_notify_bits)(struct vs_transport *transport,
unsigned *send_notify_bits, unsigned *recv_notify_bits);
void (*get_quota_limits)(struct vs_transport *transport,
unsigned *send_quota, unsigned *recv_quota);
};
/* Flags for .send */
#define VS_TRANSPORT_SEND_FLAGS_MORE 0x1
/**
* struct vs_transport - A structure representing a transport
* @type: type of transport i.e. microvisror/loopback etc
* @vt: Transport operations table
* @notify_info: Array of incoming notification settings
* @notify_info_size: Size of the incoming notification array
*/
struct vs_transport {
const char *type;
const struct vs_transport_vtable *vt;
struct vs_notify_info *notify_info;
int notify_info_size;
};
/**
* struct vs_mbuf - Message buffer. This is always allocated and released by the
* transport callbacks defined above, so it may be embedded in a
* transport-specific structure containing additional state.
* @data: Message data buffer
* @size: Size of the data buffer in bytes
* @is_recv: True if this mbuf was received from the other end of the
* transport. False if it was allocated by this end for sending.
* @priv: Private value that will not be touched by the framework
* @queue: list_head for entry in lists. The session layer uses this queue
* for receiving messages. The transport driver may use this queue for its
* own purposes when sending messages.
*/
struct vs_mbuf {
void *data;
size_t size;
bool is_recv;
void *priv;
struct list_head queue;
};
#endif /* _VSERVICES_TRANSPORT_H_ */