blob: 1b9847acb0be29494b9ccec140dc71767915faec [file] [log] [blame]
/*
**************************************************************************
* Copyright (c) 2014-2021, The Linux Foundation. All rights reserved.
* Permission to use, copy, modify, and/or distribute this software for
* any purpose with or without fee is hereby granted, provided that the
* above copyright notice and this permission notice appear in all copies.
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
* OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
**************************************************************************
*/
/**
* @file nss_if.h
* NSS interface definitions.
*/
#ifndef __NSS_IF_H
#define __NSS_IF_H
#define NSS_IF_TX_TIMEOUT 3000 /* 3 Seconds */
/**
* @addtogroup nss_driver_subsystem
* @{
*/
/**
* nss_if_message_types
* Message types for the NSS interface.
*/
enum nss_if_message_types {
NSS_IF_OPEN,
NSS_IF_CLOSE,
NSS_IF_LINK_STATE_NOTIFY,
NSS_IF_MTU_CHANGE,
NSS_IF_MAC_ADDR_SET,
NSS_IF_STATS,
NSS_IF_ISHAPER_ASSIGN,
NSS_IF_BSHAPER_ASSIGN,
NSS_IF_ISHAPER_UNASSIGN,
NSS_IF_BSHAPER_UNASSIGN,
NSS_IF_ISHAPER_CONFIG,
NSS_IF_BSHAPER_CONFIG,
NSS_IF_PAUSE_ON_OFF,
NSS_IF_VSI_ASSIGN,
NSS_IF_VSI_UNASSIGN,
NSS_IF_SET_NEXTHOP,
NSS_IF_SET_IGS_NODE,
NSS_IF_CLEAR_IGS_NODE,
NSS_IF_RESET_NEXTHOP,
NSS_IF_PPE_PORT_CREATE,
NSS_IF_PPE_PORT_DESTROY,
NSS_IF_MAX_MSG_TYPES = 9999,
};
/**
* nss_if_error_types
* Error types for the NSS interface.
*/
enum nss_if_error_types {
NSS_IF_ERROR_NO_ISHAPERS,
NSS_IF_ERROR_NO_BSHAPERS,
NSS_IF_ERROR_NO_ISHAPER,
NSS_IF_ERROR_NO_BSHAPER,
NSS_IF_ERROR_ISHAPER_OLD,
NSS_IF_ERROR_BSHAPER_OLD,
NSS_IF_ERROR_ISHAPER_CONFIG_FAILED,
NSS_IF_ERROR_BSHAPER_CONFIG_FAILED,
NSS_IF_ERROR_TYPE_UNKNOWN,
NSS_IF_ERROR_TYPE_EOPEN,
NSS_IF_ERROR_TYPE_INVALID_MTU,
NSS_IF_ERROR_TYPE_INVALID_MAC_ADDR,
NSS_IF_ERROR_TYPE_VSI_NOT_MATCH,
NSS_IF_ERROR_TYPE_VSI_REASSIGN,
NSS_IF_ERROR_TYPE_VSI_INVALID,
NSS_IF_ERROR_TYPE_MAX = 9999,
};
/**
* nss_if_data_align
* Data alignment modes for the NSS interface.
*/
enum nss_if_data_align {
NSS_IF_DATA_ALIGN_2BYTE = 0,
NSS_IF_DATA_ALIGN_4BYTE = 2,
};
/**
* nss_if_open
* Message information for opening the NSS interface.
*/
struct nss_if_open {
uint32_t tx_desc_ring; /**< Tx descriptor ring address. */
uint32_t rx_desc_ring; /**< Rx descriptor ring address. */
uint32_t rx_forward_if; /**< Forward received packets to this interface. */
uint32_t alignment_mode;/**< Header alignment mode. */
};
/**
* nss_if_close
* Message information for closing the NSS interface.
*/
struct nss_if_close {
uint32_t reserved; /**< Placeholder for the structure. */
};
/**
* nss_if_link_state_notify
* Link state notification sent to the NSS interface.
*/
struct nss_if_link_state_notify {
uint32_t state;
/**< Link state UP is bit 0 set. Other bits are as defined by Linux to indicate speed and duplex. */
};
/**
* nss_if_mtu_change
* MTU change for the NSS interface.
*/
struct nss_if_mtu_change {
uint16_t min_buf_size; /**< Changed value for the minimum buffer size. */
};
/**
* nss_if_pause_on_off
* Enables or disables a pause frame for the NSS interface.
*/
struct nss_if_pause_on_off {
uint32_t pause_on; /**< Turn the pause frame ON or OFF. */
};
/**
* nss_if_mac_address_set
* MAC address setting.
*/
struct nss_if_mac_address_set {
uint8_t mac_addr[ETH_ALEN]; /**< MAC address. */
};
/**
* nss_if_shaper_assign
* Shaper assignment message.
*/
struct nss_if_shaper_assign {
uint32_t shaper_id; /**< ID of the request. */
uint32_t new_shaper_id; /**< ID of the response. */
};
/**
* nss_if_shaper_unassign
* Shaper unassign message.
*/
struct nss_if_shaper_unassign {
uint32_t shaper_id; /**< ID of the request. */
};
/**
* nss_if_shaper_configure
* Shaper configuration message.
*/
struct nss_if_shaper_configure {
struct nss_shaper_configure config; /**< Specific shaper message for a particular interface. */
};
/**
* nss_if_vsi_assign
* VSI assignment message.
*/
struct nss_if_vsi_assign {
uint32_t vsi; /**< Virtual interface number. */
};
/**
* nss_if_vsi_unassign
* VSI unassign message.
*/
struct nss_if_vsi_unassign {
uint32_t vsi; /**< Virtual interface number. */
};
/**
* nss_if_set_nexthop
* Message to set nexthop for an interface.
*/
struct nss_if_set_nexthop {
uint32_t nexthop; /**< Nexthop interface number. */
};
/**
* nss_if_igs_config
* Ingress shaper set/clear configure message structure.
*/
struct nss_if_igs_config {
int32_t igs_num; /**< Ingress shaper interface number. */
};
/**
* nss_if_ppe_port_create
* Message to create PPE port.
*/
struct nss_if_ppe_port_create {
int32_t ppe_port_num; /**< PPE port number returned by NSS. */
};
/**
* nss_if_msgs
* Information for physical NSS interface command messages.
*/
union nss_if_msgs {
struct nss_if_link_state_notify link_state_notify;
/**< Link status notification. */
struct nss_if_open open;
/**< Open the NSS interface. */
struct nss_if_close close;
/**< Close the NSS interface. */
struct nss_if_mtu_change mtu_change;
/**< MTU change notification. */
struct nss_if_mac_address_set mac_address_set;
/**< MAC address setting. */
struct nss_cmn_node_stats stats;
/**< Synchronize the satistics. */
struct nss_if_shaper_assign shaper_assign;
/**< Assign the shaper. */
struct nss_if_shaper_unassign shaper_unassign;
/**< Unassign the shaper. */
struct nss_if_shaper_configure shaper_configure;
/**< Configure the shaper. */
struct nss_if_pause_on_off pause_on_off;
/**< ON or OFF notification for a Pause frame. */
struct nss_if_vsi_assign vsi_assign;
/**< Assign the VSI. */
struct nss_if_vsi_unassign vsi_unassign;
/**< Remove the VSI assignment. */
struct nss_if_set_nexthop set_nexthop;
/**< Set nexthop of interface. */
struct nss_if_igs_config config_igs;
/**< Configure an ingress shaper interface. */
struct nss_if_ppe_port_create ppe_port_create;
/**< Create a PPE port. */
};
/**
* nss_if_msg
* Data for sending and receiving base class messages for all interface types.
*/
struct nss_if_msg {
struct nss_cmn_msg cm; /**< Common message header. */
union nss_if_msgs msg; /**< Message payload. */
};
/**
* Callback function for receiving NSS interface messages.
*
* @datatypes
* nss_if_msg
*
* @param[in] app_data Pointer to the application context of the message.
* @param[in] msg Pointer to the message data.
*/
typedef void (*nss_if_msg_callback_t)(void *app_data, struct nss_if_msg *msg);
/**
* Callback function for receiving NSS interface data.
*
* TODO: Adjust to pass app_data as unknown to the
* list layer and netdev/sk as known.
*
* @datatypes
* net_device \n
* sk_buff
*
* @param[in] netdev Pointer to the associated network device.
* @param[in] skb Pointer to the data socket buffer.
*/
typedef void (*nss_if_rx_callback_t)(struct net_device *netdev, struct sk_buff *skb);
/**
* nss_if_register
* Registers the NSS interface for sending and receiving GMAC packets and messages.
*
* @datatypes
* nss_if_rx_callback_t \n
* nss_if_msg_callback_t \n
* net_device
*
* @param[in] if_num NSS interface number.
* @param[in] rx_callback Receive callback for the packet.
* @param[in] msg_callback Receive callback for message.
* @param[in] if_ctx Pointer to the interface context provided in the
callback. This context must be the OS network
device context pointer (net_device in Linux).
*
* @return
* Pointer to the NSS core context.
*/
extern struct nss_ctx_instance *nss_if_register(uint32_t if_num,
nss_if_rx_callback_t rx_callback,
nss_if_msg_callback_t msg_callback,
struct net_device *if_ctx);
/**
* nss_if_tx_buf
* Sends GMAC packets to a specific physical or virtual network interface.
*
* @datatypes
* nss_ctx_instance \n
* sk_buff
*
* @param[in] nss_ctx Pointer to the NSS context.
* @param[in] os_buf Pointer to the OS buffer (e.g., skbuff).
* @param[in] if_num Network physical or virtual interface number.
*
* @return
* Status of the Tx operation.
*/
extern nss_tx_status_t nss_if_tx_buf(struct nss_ctx_instance *nss_ctx, struct sk_buff *os_buf, uint32_t if_num);
/**
* nss_if_tx_msg
* Sends a message to the NSS interface.
*
* @datatypes
* nss_ctx_instance \n
* nss_if_msg
*
* @param[in,out] nss_ctx Pointer to the NSS context.
* @param[in] nim Pointer to the NSS interface message.
*
* @return
* Status of the Tx operation.
*/
nss_tx_status_t nss_if_tx_msg(struct nss_ctx_instance *nss_ctx, struct nss_if_msg *nim);
/**
* nss_if_msg_sync
* Sends a message to the NSS interface and waits for the response.
*
* @datatypes
* nss_ctx_instance \n
* nss_if_msg
*
* @param[in,out] nss_ctx Pointer to the NSS context.
* @param[in] nim Pointer to the NSS interface message.
*
* @return
* Status of the Tx operation.
*/
nss_tx_status_t nss_if_msg_sync(struct nss_ctx_instance *nss_ctx, struct nss_if_msg *nim);
/**
* nss_if_set_nexthop
* Configure the next hop for an interface.
*
* @datatypes
* nss_ctx_instance
*
* @param[in] nss_ctx Pointer to the NSS context.
* @param[in] if_num NSS interface number.
* @param[in] nexthop NSS interface number for next hop node.
*
* @return
* Status of the Tx operation.
*/
nss_tx_status_t nss_if_set_nexthop(struct nss_ctx_instance *nss_ctx, uint32_t if_num, uint32_t nexthop);
/**
* nss_if_reset_nexthop
* De-configure the next hop for an interface.
*
* @datatypes
* nss_ctx_instance
*
* @param[in] nss_ctx Pointer to the NSS context.
* @param[in] if_num NSS interface number.
*
* @return
* Status of the Tx operation.
*/
nss_tx_status_t nss_if_reset_nexthop(struct nss_ctx_instance *nss_ctx, uint32_t if_num);
/**
* nss_if_change_mtu
* Changes the MTU of the interface.
*
* @datatypes
* nss_ctx_instance
*
* @param[in] nss_ctx Pointer to the NSS context.
* @param[in] if_num NSS interface number.
* @param[in] mtu New MTU.
*
* @return
* Status of the transmit operation.
*/
nss_tx_status_t nss_if_change_mtu(struct nss_ctx_instance *nss_ctx, nss_if_num_t if_num, uint16_t mtu);
/**
* nss_if_change_mac_addr
* Changes the MAC address of the interface.
*
* @datatypes
* nss_ctx_instance
*
* @param[in] nss_ctx Pointer to the NSS context.
* @param[in] if_num NSS interface number.
* @param[in] mac_addr New MAC address.
*
* @return
* Status of the transmit operation.
*/
nss_tx_status_t nss_if_change_mac_addr(struct nss_ctx_instance *nss_ctx, nss_if_num_t if_num, uint8_t *mac_addr);
/**
* nss_if_vsi_unassign
* Detaches the VSI ID from the given interface.
*
* @datatypes
* nss_ctx_instance
*
* @param[in] nss_ctx Pointer to the NSS context.
* @param[in] if_num NSS interface number.
* @param[in] vsi VSI ID.
*
* @return
* Status of the transmit operation.
*/
nss_tx_status_t nss_if_vsi_unassign(struct nss_ctx_instance *nss_ctx, nss_if_num_t if_num, uint32_t vsi);
/**
* nss_if_vsi_assign
* Attaches the VSI ID to the given interface.
*
* @datatypes
* nss_ctx_instance
*
* @param[in] nss_ctx Pointer to the NSS context.
* @param[in] if_num NSS interface number.
* @param[in] vsi VSI ID.
*
* @return
* Status of the transmit operation.
*/
nss_tx_status_t nss_if_vsi_assign(struct nss_ctx_instance *nss_ctx, nss_if_num_t if_num, uint32_t vsi);
/**
* @}
*/
#endif /* __NSS_IF_H */