blob: c7b3f9d8775587d83e304abbda657c9d5e73aedf [file] [log] [blame]
/* firmware_eip207_api_flow_cs.h
*
* EIP-207 Firmware Classification API:
* Flow Control functionality,
*
* This API is defined by the EIP-207 Classification Firmware
*
*/
/* -------------------------------------------------------------------------- */
/* */
/* Module : firmware_eip197 */
/* Version : 3.5 */
/* Configuration : FIRMWARE-GENERIC */
/* */
/* Date : 2022-Dec-21 */
/* */
/* Copyright (c) 2012-2022 by Rambus, Inc. and/or its subsidiaries. */
/* All rights reserved. Unauthorized use (including, without limitation, */
/* distribution and copying) is strictly prohibited. All use requires, */
/* and is subject to, explicit written authorization and nondisclosure */
/* agreements with Rambus, Inc. and/or its subsidiaries. */
/* */
/* For more information or support, please go to our online support system at */
/* https://sipsupport.rambus.com. */
/* In case you do not have an account for this system, please send an e-mail */
/* to sipsupport@rambus.com. */
/* -------------------------------------------------------------------------- */
#ifndef FIRMWARE_EIP207_API_FLOW_CS_H_
#define FIRMWARE_EIP207_API_FLOW_CS_H_
/*----------------------------------------------------------------------------
* This module implements (provides) the following interface(s):
*/
/*----------------------------------------------------------------------------
* This module uses (requires) the following interface(s):
*/
#include "basic_defs.h" // uint32_t
/*----------------------------------------------------------------------------
* Definitions and macros
*/
// Size of the Flow Record in 32-bit words
#define FIRMWARE_EIP207_CS_FLOW_FRC_RECORD_WORD_COUNT 16
// Size of the Transform Record in 32-bit words
#define FIRMWARE_EIP207_CS_FLOW_TRC_RECORD_WORD_COUNT 64
#define FIRMWARE_EIP207_CS_FLOW_TRC_RECORD_WORD_COUNT_LARGE 80
// Size of the ARC4 Record in 32-bit words
#define FIRMWARE_EIP207_CS_FLOW_ARC4RC_RECORD_WORD_COUNT 64
#define FIRMWARE_EIP207_CS_FLOW_ARC4RC_RECORD_WORD_COUNT_LARGE 64
// Word offset for ARC4 state record physical address
#define FIRMWARE_EIP207_CS_FLOW_FR_ARC4_ADDR_WORD_OFFSET 6
// Flow ID field length in 32-bit words
#define FIRMWARE_EIP207_CS_FLOW_HASH_ID_FIELD_WORD_COUNT 4
/*
* Flow Record field offsets
*/
// Word offset for transform record physical address offset relative to cache base address
#define FIRMWARE_EIP207_CS_FLOW_FR_XFORM_OFFS_WORD_OFFSET 4
// Word offset for transform record physical address
#define FIRMWARE_EIP207_CS_FLOW_FR_XFORM_ADDR_WORD_OFFSET 5
// Word offset for transform record physical address
#define FIRMWARE_EIP207_CS_FLOW_FR_XFORM_ADDR_HI_WORD_OFFSET 6
// Word offset for software flow record host (virtual) address
#define FIRMWARE_EIP207_CS_FLOW_FR_SW_ADDR_WORD_OFFSET 8
// Word offset for Flags field
#define FIRMWARE_EIP207_CS_FLOW_FR_FLAGS_WORD_OFFSET 9
// Word offset for MTU/Interface ID field
#define FIRMWARE_EIP207_CS_FLOW_FR_MTU_IFC_WORD_OFFSET 3
// Word offset for Next Hop MAC field (size of field is 3 words).
#define FIRMWARE_EIP207_CS_FLOW_FR_NEXTHOP_MAC_WORD_OFFSET 7
// Word offset for NAT ports
#define FIRMWARE_EIP207_CS_FLOW_FR_NAT_PORTS_WORD_OFFSET 8
// Word offset for NAT source address
#define FIRMWARE_EIP207_CS_FLOW_FR_NAT_SRC_WORD_OFFSET 9
// Word offset for NAT destination address
#define FIRMWARE_EIP207_CS_FLOW_FR_NAT_DST_WORD_OFFSET 3
// Word offset for time stamp 64-bit value, low 32-bits
#define FIRMWARE_EIP207_CS_FLOW_FR_TIME_STAMP_LO_WORD_OFFSET 12
// Word offset for time stamp 64-bit value, high 32-bits
#define FIRMWARE_EIP207_CS_FLOW_FR_TIME_STAMP_HI_WORD_OFFSET \
(FIRMWARE_EIP207_CS_FLOW_FR_TIME_STAMP_LO_WORD_OFFSET + 1)
// Word offset for octets statistics 64-bit value, low 32-bits
#define FIRMWARE_EIP207_CS_FLOW_FR_STAT_OCT_LO_WORD_OFFSET 14
// Word offset for octets statistics 64-bit value, high 32-bits
#define FIRMWARE_EIP207_CS_FLOW_FR_STAT_OCT_HI_WORD_OFFSET \
(FIRMWARE_EIP207_CS_FLOW_FR_STAT_OCT_LO_WORD_OFFSET + 1)
// Word offset for packet statistics 32-bit value
#define FIRMWARE_EIP207_CS_FLOW_FR_STAT_PKT_WORD_OFFSET 10
#define FIRMWARE_EIP207_CS_FLOW_FR_LAST_WORD_OFFSET \
(FIRMWARE_EIP207_CS_FLOW_FR_STAT_OCT_HI_WORD_OFFSET)
#if (FIRMWARE_EIP207_CS_FLOW_FR_LAST_WORD_OFFSET + 1) != \
FIRMWARE_EIP207_CS_FLOW_FRC_RECORD_WORD_COUNT
#error "Error: Firmware EIP-207 flow record offsets do not match its size"
#endif
/*
* Transform Record field offsets
*/
// Maximum offset after storing all EIP96 context information, beyond which the
// large record size and associated offsets must be used.
#define FIRMWARE_EIP207_CS_FLOW_TR_LARGE_THRESHOLD_OFFSET 56
// Offset of extension data from start of transform record.
#define FIRMWARE_EIP207_CS_FLOW_TR_EXTENSION_WORD_OFFSET 56
// Word offset for CCM salt value
#define FIRMWARE_EIP207_CS_FLOW_TR_CCM_SALT_WORD_OFFSET 56
// Word offset for pad aligment.
#define FIRMWARE_EIP207_CS_FLOW_TR_PAD_ALIGN_WORD_OFFSET 50
// Word offset for transform flags.
#define FIRMWARE_EIP207_CS_FLOW_TR_FLAGS_WORD_OFFSET 49
// Word offset for Token Verify Instruction field, 32-bit word
#define FIRMWARE_EIP207_CS_FLOW_TR_TK_VFY_INST_WORD_OFFSET 54
// Word offset for Token Context Instruction field, 32-bit word
#define FIRMWARE_EIP207_CS_FLOW_TR_TK_CTX_INST_WORD_OFFSET 55
// Word offset for NAT-T ports
#define FIMRWARE_EIP207_CS_FLOW_TR_NATT_PORTS_WORD_OFFSET 53
// Word offset for time stamp 64-bit value, low 32-bits
#define FIRMWARE_EIP207_CS_FLOW_TR_TIME_STAMP_LO_WORD_OFFSET 58
// Word offset for time stamp 64-bit value, high 32-bits
#define FIRMWARE_EIP207_CS_FLOW_TR_TIME_STAMP_HI_WORD_OFFSET \
(FIRMWARE_EIP207_CS_FLOW_TR_TIME_STAMP_LO_WORD_OFFSET + 1)
// Word offset for octets statistics 64-bit value, low 32-bits
#define FIRMWARE_EIP207_CS_FLOW_TR_STAT_OCT_LO_WORD_OFFSET 62
// Word offset for octets statistics 64-bit value, high 32-bits
#define FIRMWARE_EIP207_CS_FLOW_TR_STAT_OCT_HI_WORD_OFFSET \
(FIRMWARE_EIP207_CS_FLOW_TR_STAT_OCT_LO_WORD_OFFSET + 1)
// Word offset for packets statistics 32-bit value
#define FIRMWARE_EIP207_CS_FLOW_TR_STAT_PKT_WORD_OFFSET 60
// Word offset for token header word.
#define FIRMWARE_EIP207_CS_FLOW_TR_TK_HDR_WORD_OFFSET 48
// Word offset for various byte-sized parameters.
#define FIRMWARE_EIP207_CS_FLOW_TR_BYTE_PARAM_WORD_OFFSET 52
// Word offset for header proc context pointer.
#define FIRMWARE_EIP207_CS_FLOW_TR_HDRPROC_CTX_WORD_OFFSET 51
// Word offset for Tunnel IP source address
#define FIRMWARE_EIP207_CS_FLOW_TR_TUNNEL_SRC_WORD_OFFSET 40
// Word offset for Tunnel IP destination address
#define FIRMWARE_EIP207_CS_FLOW_TR_TUNNEL_DST_WORD_OFFSET 44
// Word offset for Tunnel IPv4 checksum
#define FIRMWARE_EIP207_CS_FLOW_TR_CHECKSUM_WORD_OFFSET 41
// Word offset for Path MTU field
#define FIRMWARE_EIP207_CS_FLOW_TR_PATH_MTU_WORD_OFFSET 57
#define FIRMWARE_EIP207_CS_FLOW_TR_LAST_WORD_OFFSET FIRMWARE_EIP207_CS_FLOW_TR_HDRPROC_CTX_WORD_OFFSET
#if (FIRMWARE_EIP207_CS_FLOW_TR_LAST_WORD_OFFSET + 1) > \
FIRMWARE_EIP207_CS_FLOW_TRC_RECORD_WORD_COUNT
#error "Error: Firmware EIP-207 transform record offsets do not match its size"
#endif
/*
* Transform Record field offsets for large records
*/
// Offset of extension data from start of transform record.
#define FIRMWARE_EIP207_CS_FLOW_TR_EXTENSION_WORD_OFFSET_LARGE 72
// Word offset for CCM salt value
#define FIRMWARE_EIP207_CS_FLOW_TR_CCM_SALT_WORD_OFFSET_LARGE 72
// Word offset for pad aligment.
#define FIRMWARE_EIP207_CS_FLOW_TR_PAD_ALIGN_WORD_OFFSET_LARGE 66
// Word offset for transform flags.
#define FIRMWARE_EIP207_CS_FLOW_TR_FLAGS_WORD_OFFSET_LARGE 65
// Word offset for Token Verify Instruction field, 32-bit word
#define FIRMWARE_EIP207_CS_FLOW_TR_TK_VFY_INST_WORD_OFFSET_LARGE 70
// Word offset for Token Context Instruction field, 32-bit word
#define FIRMWARE_EIP207_CS_FLOW_TR_TK_CTX_INST_WORD_OFFSET_LARGE 71
// Word offset for NAT-T ports
#define FIMRWARE_EIP207_CS_FLOW_TR_NATT_PORTS_WORD_OFFSET_LARGE 69
// Word offset for time stamp 64-bit value, low 32-bits
#define FIRMWARE_EIP207_CS_FLOW_TR_TIME_STAMP_LO_WORD_OFFSET_LARGE 74
// Word offset for time stamp 64-bit value, high 32-bits
#define FIRMWARE_EIP207_CS_FLOW_TR_TIME_STAMP_HI_WORD_OFFSET_LARGE \
(FIRMWARE_EIP207_CS_FLOW_TR_TIME_STAMP_LO_WORD_OFFSET_LARGE + 1)
// Word offset for octets statistics 64-bit value, low 32-bits
#define FIRMWARE_EIP207_CS_FLOW_TR_STAT_OCT_LO_WORD_OFFSET_LARGE 78
// Word offset for octets statistics 64-bit value, high 32-bits
#define FIRMWARE_EIP207_CS_FLOW_TR_STAT_OCT_HI_WORD_OFFSET_LARGE \
(FIRMWARE_EIP207_CS_FLOW_TR_STAT_OCT_LO_WORD_OFFSET_LARGE + 1)
// Word offset for packets statistics 32-bit value
#define FIRMWARE_EIP207_CS_FLOW_TR_STAT_PKT_WORD_OFFSET_LARGE 76
// Word offset for token header word.
#define FIRMWARE_EIP207_CS_FLOW_TR_TK_HDR_WORD_OFFSET_LARGE 64
// Word offset for various byte-sized parameters.
#define FIRMWARE_EIP207_CS_FLOW_TR_BYTE_PARAM_WORD_OFFSET_LARGE 68
// Word offset for header proc context pointer.
#define FIRMWARE_EIP207_CS_FLOW_TR_HDRPROC_CTX_WORD_OFFSET_LARGE 67
// Word offset for Tunnel IP source address
#define FIRMWARE_EIP207_CS_FLOW_TR_TUNNEL_SRC_WORD_OFFSET_LARGE 56
// Word offset for Tunnel IP destination address
#define FIRMWARE_EIP207_CS_FLOW_TR_TUNNEL_DST_WORD_OFFSET_LARGE 60
// Word offset for Tunnel IPv4 checksum
#define FIRMWARE_EIP207_CS_FLOW_TR_CHECKSUM_WORD_OFFSET_LARGE \
(FIRMWARE_EIP207_CS_FLOW_TR_TUNNEL_SRC_WORD_OFFSET_LARGE + 1)
// Word offset for Path MTU field
#define FIRMWARE_EIP207_CS_FLOW_TR_PATH_MTU_WORD_OFFSET_LARGE 73
#define FIRMWARE_EIP207_CS_FLOW_TR_LAST_WORD_OFFSET_LARGE \
(FIRMWARE_EIP207_CS_FLOW_TR_HDRPROC_CTX_WORD_OFFSET_LARGE)
#if (FIRMWARE_EIP207_CS_FLOW_TR_LAST_WORD_OFFSET_LARGE + 1) > \
FIRMWARE_EIP207_CS_FLOW_TRC_RECORD_WORD_COUNT_LARGE
#error "Error: Firmware EIP-207 large transform record offsets do not match its size"
#endif
/*
* Flow hash ID calculation
*/
// The maximum size of the 32-bit word array that is used as data input for
// the flow hash ID calculation
#define FIRMWARE_EIP207_CS_FLOW_HASH_ID_INPUT_WORD_COUNT 13
// Flags
#define FIRMWARE_EIP207_CS_FLOW_SELECT_IPV4 BIT_0
#define FIRMWARE_EIP207_CS_FLOW_SELECT_IPV6 BIT_1
#define FIMRWARE_EIP207_CD_FLOW_SELECT_CUSTOM BIT_2
#define FIMRWARE_EIP207_CD_FLOW_ESP_WITH_SRC BIT_3
#define FIRMWARE_EIP207_CS_FLOW_DTLS_SUPPORTED 1
// This data structure represents the packet parameters (such as IP addresses
// and ports) that select a particular flow.
typedef struct
{
// Flags, see FIRMWARE_EIP207_CS_FLOW_SELECT_*
uint32_t Flags;
// IP protocol number
uint8_t IpProto;
// IP source address
uint8_t * SrcIp_p;
// IP destination address
uint8_t * DstIp_p;
// Source port for UDP
uint16_t SrcPort;
// Destination port for UDP
uint16_t DstPort;
// Custom selection ID.
uint16_t CustomID;
// SPI in IPsec
uint32_t SPI;
// Epoch for inbound DTLS
uint16_t Epoch;
} FIRMWARE_EIP207_CS_Flow_SelectorParams_t;
/*----------------------------------------------------------------------------
* Local variables
*/
/*----------------------------------------------------------------------------
* FIRMWARE_EIP207_CS_Flow_Selectors_Reorder
*
* This function re-orders the selectors for the flow hash ID calculation.
*
* Selectors_p (input)
* Pointer to the data structure that contains the selectors from the
* packet header that can be used for the flow hash ID calculation.
*
* OutData_p (output)
* Pointer to the memory where the data arrays of 32-bit words
* will be stored. The buffer for the array must be of size
* FW207_CS_FLOW_HASH_ID_INPUT_WORD_COUNT.
*
* OutDataWordCount_p (output)
* Pointer to the memory where the data arrays size in 32-bit words
* will be stored.
*
* Return value
* None
*/
static inline void
FIRMWARE_EIP207_CS_Flow_Selectors_Reorder(
const FIRMWARE_EIP207_CS_Flow_SelectorParams_t * const Selectors_p,
uint32_t * OutData_p,
unsigned int * const OutDataWordCount_p)
{
unsigned int i = 0;
// Word 0
OutData_p[i++] = 0;
// Flags and IP protocol number
if ( Selectors_p->Flags & FIRMWARE_EIP207_CS_FLOW_SELECT_IPV6 )
OutData_p[i++] = (uint32_t)(Selectors_p->IpProto << 8) |
(uint32_t)(BIT_25);
else
OutData_p[i++] = (uint32_t)(Selectors_p->IpProto << 8);
// SPI
OutData_p[i++] = Selectors_p->SPI;
// Epoch
OutData_p[i++] = Selectors_p->Epoch;
if (Selectors_p->Flags & FIMRWARE_EIP207_CD_FLOW_SELECT_CUSTOM)
{
// Custom ID (used instead of port numbers)
OutData_p[i++] = (uint32_t)Selectors_p->CustomID;
}
else if (Selectors_p->SPI == 0)
{
// L4 (TCP or UDP) destination and source port numbers
OutData_p[i++] = (uint32_t)Selectors_p->SrcPort |
(uint32_t)(Selectors_p->DstPort << 16);
}
else
{
OutData_p[i++] = 0;
}
// Destination IP address
OutData_p[i++] = (uint32_t)Selectors_p->DstIp_p[0] |
(uint32_t)(Selectors_p->DstIp_p[1] << 8) |
(uint32_t)(Selectors_p->DstIp_p[2] << 16) |
(uint32_t)(Selectors_p->DstIp_p[3] << 24);
if ( Selectors_p->Flags & FIRMWARE_EIP207_CS_FLOW_SELECT_IPV6 )
{
OutData_p[i++] = (uint32_t)Selectors_p->DstIp_p[4] |
(uint32_t)(Selectors_p->DstIp_p[5] << 8) |
(uint32_t)(Selectors_p->DstIp_p[6] << 16) |
(uint32_t)(Selectors_p->DstIp_p[7] << 24);
OutData_p[i++] = (uint32_t)Selectors_p->DstIp_p[8] |
(uint32_t)(Selectors_p->DstIp_p[9] << 8) |
(uint32_t)(Selectors_p->DstIp_p[10] << 16)|
(uint32_t)(Selectors_p->DstIp_p[11] << 24);
OutData_p[i++] = (uint32_t)Selectors_p->DstIp_p[12] |
(uint32_t)(Selectors_p->DstIp_p[13] << 8) |
(uint32_t)(Selectors_p->DstIp_p[14] << 16)|
(uint32_t)(Selectors_p->DstIp_p[15] << 24);
}
else
{
OutData_p[i++] = 0;
OutData_p[i++] = 0;
OutData_p[i++] = 0;
}
// Source IP address
if (Selectors_p->SPI != 0 && (Selectors_p->Flags & FIMRWARE_EIP207_CD_FLOW_ESP_WITH_SRC) == 0)
{
OutData_p[i++] = 0;
OutData_p[i++] = 0;
OutData_p[i++] = 0;
OutData_p[i++] = 0;
}
else
{
OutData_p[i++] = (uint32_t)Selectors_p->SrcIp_p[0] |
(uint32_t)(Selectors_p->SrcIp_p[1] << 8) |
(uint32_t)(Selectors_p->SrcIp_p[2] << 16) |
(uint32_t)(Selectors_p->SrcIp_p[3] << 24);
if ( Selectors_p->Flags & FIRMWARE_EIP207_CS_FLOW_SELECT_IPV6 )
{
OutData_p[i++] = (uint32_t)Selectors_p->SrcIp_p[4] |
(uint32_t)(Selectors_p->SrcIp_p[5] << 8) |
(uint32_t)(Selectors_p->SrcIp_p[6] << 16) |
(uint32_t)(Selectors_p->SrcIp_p[7] << 24);
OutData_p[i++] = (uint32_t)Selectors_p->SrcIp_p[8] |
(uint32_t)(Selectors_p->SrcIp_p[9] << 8) |
(uint32_t)(Selectors_p->SrcIp_p[10] << 16)|
(uint32_t)(Selectors_p->SrcIp_p[11] << 24);
OutData_p[i++] = (uint32_t)Selectors_p->SrcIp_p[12] |
(uint32_t)(Selectors_p->SrcIp_p[13] << 8) |
(uint32_t)(Selectors_p->SrcIp_p[14] << 16)|
(uint32_t)(Selectors_p->SrcIp_p[15] << 24);
}
else
{
OutData_p[i++] = 0;
OutData_p[i++] = 0;
OutData_p[i++] = 0;
}
}
*OutDataWordCount_p = i;
}
/*----------------------------------------------------------------------------
* FIRMWARE_EIP207_CS_Flow_SeqNum_Offset_Read
*
* This function reads the word offset of the 32-bit Sequence Number field
* from the provided Token Context Instruction 32-bit word.
*
* Value (input)
* Token Context Instruction 32-bit word.
*
* WordOffset_p (output)
* Pointer to the memory where the word offset of the 32-bit Sequence Number
* field will be stored.
*
* Return value
* None
*/
static inline void
FIRMWARE_EIP207_CS_Flow_SeqNum_Offset_Read(
const uint32_t Value,
unsigned int * const WordOffset_p)
{
*WordOffset_p = (unsigned int)(Value & MASK_8_BITS);
}
#endif /* FIRMWARE_EIP207_API_FLOW_CS_H_ */
/* end of file firmware_eip207_api_flow_cs.h */