1/* 2 ************************************************************************** 3 * Copyright (c) 2013-2015, The Linux Foundation. All rights reserved. 4 * Permission to use, copy, modify, and/or distribute this software for 5 * any purpose with or without fee is hereby granted, provided that the 6 * above copyright notice and this permission notice appear in all copies. 7 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 8 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 9 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 10 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 11 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 12 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT 13 * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 14 ************************************************************************** 15 */ 16 17/* 18 * nss_tx_rx_common.h 19 * NSS APIs common header file 20 */ 21 22#ifndef __NSS_TX_RX_COMMON_H 23#define __NSS_TX_RX_COMMON_H 24 25#include "nss_core.h" 26#include <nss_hal.h> 27#include <linux/module.h> 28#include <linux/vmalloc.h> 29 30/* 31 * Global definitions 32 */ 33#define NSS_HLOS_MESSAGE_VERSION 0 34 35/* 36 * Global variables/extern declarations 37 */ 38extern struct nss_top_instance nss_top_main; 39 40#if (NSS_DEBUG_LEVEL > 0) 41#define NSS_VERIFY_CTX_MAGIC(x) nss_verify_ctx_magic(x) 42#define NSS_VERIFY_INIT_DONE(x) nss_verify_init_done(x) 43 44/* 45 * nss_verify_ctx_magic() 46 */ 47static inline void nss_verify_ctx_magic(struct nss_ctx_instance *nss_ctx) 48{ 49 nss_assert(nss_ctx->magic == NSS_CTX_MAGIC); 50} 51 52static inline void nss_verify_init_done(struct nss_ctx_instance *nss_ctx) 53{ 54 nss_assert(nss_ctx->state == NSS_CORE_STATE_INITIALIZED); 55} 56 57#else 58#define NSS_VERIFY_CTX_MAGIC(x) 59#define NSS_VERIFY_INIT_DONE(x) 60#endif 61 62/* 63 * Deprecated Redirect 64 */ 65 66/** 67 * @brief Request/Response types 68 */ 69enum nss_tx_rx_virt_if_msg_types { 70 NSS_TX_RX_VIRT_IF_OPEN = NSS_IF_OPEN, 71 NSS_TX_RX_VIRT_IF_CLOSE = NSS_IF_CLOSE, 72 NSS_TX_RX_VIRT_IF_LINK_STATE_NOTIFY = NSS_IF_LINK_STATE_NOTIFY, 73 NSS_TX_RX_VIRT_IF_MTU_CHANGE = NSS_IF_MTU_CHANGE, 74 NSS_TX_RX_VIRT_IF_MAC_ADDR_SET = NSS_IF_MAC_ADDR_SET, 75 NSS_TX_RX_VIRT_IF_STATS_SYNC = NSS_IF_STATS, 76 NSS_TX_RX_VIRT_IF_ISHAPER_ASSIGN = NSS_IF_ISHAPER_ASSIGN, 77 NSS_TX_RX_VIRT_IF_BSHAPER_ASSIGN = NSS_IF_BSHAPER_ASSIGN, 78 NSS_TX_RX_VIRT_IF_ISHAPER_UNASSIGN = NSS_IF_ISHAPER_UNASSIGN, 79 NSS_TX_RX_VIRT_IF_BSHAPER_UNASSIGN = NSS_IF_BSHAPER_UNASSIGN, 80 NSS_TX_RX_VIRT_IF_ISHAPER_CONFIG = NSS_IF_ISHAPER_CONFIG, 81 NSS_TX_RX_VIRT_IF_BSHAPER_CONFIG = NSS_IF_BSHAPER_CONFIG, 82 NSS_TX_RX_VIRT_IF_TX_CREATE_MSG = NSS_IF_MAX_MSG_TYPES + 1, 83 NSS_TX_RX_VIRT_IF_TX_DESTROY_MSG, 84 NSS_TX_RX_VIRT_IF_STATS_SYNC_MSG, 85 NSS_TX_RX_VIRT_IF_MAX_MSG_TYPES, 86}; 87 88/** 89 * virt_if error types 90 */ 91enum nss_tx_rx_virt_if_error_types { 92 NSS_TX_RX_VIRT_IF_SUCCESS, /*< Success */ 93 NSS_TX_RX_VIRT_IF_CORE_FAILURE, /*< nss core failure */ 94 NSS_TX_RX_VIRT_IF_ALLOC_FAILURE, /*< Memory allocation failure */ 95 NSS_TX_RX_VIRT_IF_DYNAMIC_IF_FAILURE, /*< Dynamic interface failure */ 96 NSS_TX_RX_VIRT_IF_MSG_TX_FAILURE, /*< Message transmission failure */ 97 NSS_TX_RX_VIRT_IF_REG_FAILURE, /*< Registration failure */ 98 NSS_TX_RX_VIRT_IF_CORE_NOT_INITIALIZED, /*< NSS core not intialized */ 99}; 100 101/** 102 * Structure which contains stats received from NSS. 103 */ 104struct nss_tx_rx_virt_if_stats { 105 struct nss_if_stats node_stats; /**< common stats */ 106 uint32_t tx_enqueue_failed; /**< tx enqueue failures in the FW */ 107 uint32_t shaper_enqueue_failed; /**< shaper enqueue failures in the FW */ 108}; 109 110/** 111 * The NSS virtual interface creation structure. 112 */ 113struct nss_tx_rx_virt_if_create_msg { 114 uint32_t flags; /**< Interface flags */ 115 uint8_t mac_addr[ETH_ALEN]; /**< MAC address */ 116}; 117 118/** 119 * The NSS virtual interface destruction structure. 120 */ 121struct nss_tx_rx_virt_if_destroy_msg { 122 int32_t reserved; /**< place holder */ 123}; 124 125/** 126 * Message structure to send/receive virtual interface commands 127 */ 128struct nss_tx_rx_virt_if_msg { 129 struct nss_cmn_msg cm; 130 /**< Message Header */ 131 union { 132 union nss_if_msgs if_msgs; 133 struct nss_tx_rx_virt_if_create_msg if_create; 134 /**< Message: create virt if rule */ 135 struct nss_tx_rx_virt_if_destroy_msg if_destroy; 136 /**< Message: destroy virt if rule */ 137 struct nss_tx_rx_virt_if_stats stats; 138 /**< Message: stats */ 139 } msg; 140}; 141 142/* 143 * Private data structure for virt_if interface 144 */ 145struct nss_tx_rx_virt_if_pvt { 146 struct semaphore sem; 147 struct completion complete; 148 int response; 149 int sem_init_done; 150}; 151 152typedef void (*nss_tx_rx_virt_if_data_callback_t)(struct net_device *netdev, struct sk_buff *skb, struct napi_struct *napi); 153typedef void (*nss_tx_rx_virt_if_msg_callback_t)(void *app_data, struct nss_cmn_msg *msg); 154 155/* 156 * Handles associated with redir interfaces(virt_if & wifi_i). 157 * TODO: Once wifi moves to using the new interfaces, this will be deprecated. 158 */ 159 160struct nss_tx_rx_virt_if_handle { 161 struct nss_ctx_instance *nss_ctx; 162 int32_t if_num; 163 struct nss_tx_rx_virt_if_pvt *pvt; 164 struct nss_tx_rx_virt_if_stats stats; 165 nss_tx_rx_virt_if_msg_callback_t cb; 166 void *app_data; 167}; 168 169/** 170 * @brief Get stats for redir interface from NSS driver 171 * 172 * @param if_num Interface number (provided during dynamic_interface allocation) 173 * @param i index of stats 174 * @param line buffer into which the stats will be copied. 175 * 176 * @return int32_t Returns 0 if if_num is not in range or the number of bytes copied. 177 */ 178extern int32_t nss_tx_rx_virt_if_copy_stats(int32_t if_num, int i, char *line); 179 180/* 181 * CB handlers for variour interfaces 182 */ 183void nss_phys_if_register_handler(uint32_t if_num); 184extern void nss_crypto_register_handler(void); 185extern void nss_ipsec_register_handler(void); 186extern void nss_ipv4_register_handler(void); 187extern void nss_ipv4_reasm_register_handler(void); 188extern void nss_ipv6_register_handler(void); 189extern void nss_ipv6_reasm_register_handler(void); 190extern void nss_n2h_register_handler(void); 191extern void nss_tunipip6_register_handler(void); 192extern void nss_pppoe_register_handler(void); 193extern void nss_freq_register_handler(void); 194extern void nss_eth_rx_register_handler(void); 195extern void nss_lag_register_handler(void); 196extern void nss_dynamic_interface_register_handler(void); 197extern void nss_gre_redir_register_handler(void); 198extern void nss_lso_rx_register_handler(void); 199extern void nss_sjack_register_handler(void); 200extern void nss_wifi_register_handler(void); 201 202/* 203 * nss_if_msg_handler() 204 * External reference for internal base class handler for interface messages. 205 * 206 * This is not registered with nss_core.c as it is really a base class feature 207 * of the phys_if and virt_if handlers. 208 */ 209extern void nss_if_msg_handler(struct nss_ctx_instance *nss_ctx, struct nss_cmn_msg *ncm, 210 __attribute__((unused))void *app_data); 211 212#endif /* __NSS_TX_RX_COMMON_H */ 213