blob: d3fc31ec852794d60ef255cff752fda2f70066e3 [file] [log] [blame] [edit]
/*
* Copyright (C) 2020 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef CHPP_LINK_H_
#define CHPP_LINK_H_
#include <stddef.h>
#include <stdint.h>
#ifdef __cplusplus
extern "C" {
#endif
/**
* Error codes used by the link layer.
*/
enum ChppLinkErrorCode {
//! No error - data queued to be sent asynchronously
CHPP_LINK_ERROR_NONE_QUEUED = 0,
//! No error - data successfully sent
CHPP_LINK_ERROR_NONE_SENT = 1,
//! Timeout
CHPP_LINK_ERROR_TIMEOUT = 2,
//! Busy
CHPP_LINK_ERROR_BUSY = 3,
//! Out of memory
CHPP_LINK_ERROR_OOM = 4,
//! Link not established
CHPP_LINK_ERROR_NO_LINK = 5,
//! Unspecified failure
CHPP_LINK_ERROR_UNSPECIFIED = 255
};
struct ChppTransportState;
/**
* Link layer configuration.
*/
struct ChppLinkConfiguration {
/**
* Size of the TX buffer in bytes.
* The TX buffer is provided by the link layer (@see getTxBuffer).
*
* The TX buffer stores the effective payload and the transport encoding
* overhead. The size of the effective payload is txBufferLen -
* CHPP_TRANSPORT_ENCODING_OVERHEAD_BYTES.
*/
size_t txBufferLen;
/**
* Size of the RX buffer in bytes.
*
* The RX buffer stores the effective payload and the transport encoding
* overhead. The size of the effective payload is rxBufferLen -
* CHPP_TRANSPORT_ENCODING_OVERHEAD_BYTES.
*/
size_t rxBufferLen;
};
struct ChppLinkApi {
/**
* Platform-specific function to initialize the link layer.
*
* @param linkContext Platform-specific struct with link state.
* @param transportContext State of the associated transport layer.
*
* The init function typically:
* - stores the transportContext in the link state. It is needed when calling
* the transport layer callbacks,
* - initializes anything required for the link layer operations.
*
* It can also store the configuration in the link state when the
* configuration differs across link instances.
*/
void (*init)(void *linkContext, struct ChppTransportState *transportContext);
/**
* Platform-specific function to deinitialize the link layer (e.g. clean
* exit).
*
* @param linkContext Platform-specific struct with link details / parameters.
*/
void (*deinit)(void *linkContext);
/**
* Platform-specific function to send Tx data over to the link layer.
*
* The TX data is located in the Tx buffer, @see getTxBuffer.
*
* @param linkContext Platform-specific struct with link details / parameters.
* @param len Length of the data to be sent in bytes.
*
* @return CHPP_LINK_ERROR_NONE_SENT if the platform implementation for this
* function is synchronous, i.e. it is done with buf and len once the function
* returns. A return value of CHPP_LINK_ERROR_NONE_QUEUED indicates that this
* function is implemented asynchronously. In this case, it is up to the
* platform implementation to call chppLinkSendDoneCb() after processing the
* contents TX buffer. Otherwise, an error code is returned per enum
* ChppLinkErrorCode.
*/
enum ChppLinkErrorCode (*send)(void *linkContext, size_t len);
/**
* Platform-specific function to perform a task from the main CHPP transport
* work thread. The task can be specified by the signal argument, which is
* triggered by previous call[s] to chppWorkThreadSignalFromLink(). An example
* of the type of work that can be performed is processing RX data from the
* physical layer.
*
* @param linkContext Platform-specific struct with link details / parameters.
* @param signal The signal that describes the work to be performed. Only bits
* specified by CHPP_TRANSPORT_SIGNAL_PLATFORM_MASK can be set.
*/
void (*doWork)(void *linkContext, uint32_t signal);
/**
* Platform-specific function to reset a non-synchronous link, where the link
* implementation is responsible for calling chppLinkSendDoneCb() after
* processing the contents of buf and len. For such links, a reset called
* before chppLinkSendDoneCb() indicates to the link to abort sending out buf,
* and that the contents of buf and len will become invalid.
*
* @param linkContext Platform-specific struct with link details / parameters.
*/
void (*reset)(void *linkContext);
/**
* Returns the link layer configuration.
*
* @param linkContext Platform-specific struct with link details / parameters.
*/
struct ChppLinkConfiguration (*getConfig)(void *linkContext);
/**
* Returns a pointer to the TX buffer.
*
* The associated transport layer will write control bytes and payload to this
* buffer.
*
* The size of the buffer must be returned in the configuration.
* @see getConfig.
*
* @param linkContext Platform-specific struct with link details / parameters.
*/
uint8_t *(*getTxBuffer)(void *linkContext);
};
#ifdef __cplusplus
}
#endif
#endif // CHPP_LINK_H_