| /* |
| ************************************************************************** |
| * Copyright (c) 2014, 2017-2018, 2020, 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_tunipip6.h |
| * NSS TUNIPIP6 interface definitions. |
| */ |
| |
| #ifndef __NSS_TUNIPIP6_H |
| #define __NSS_TUNIPIP6_H |
| |
| /** |
| * Maximum number of supported TUNIPIP6 tunnels. |
| */ |
| #define NSS_TUNIPIP6_TUNNEL_MAX 32 |
| |
| /** |
| * @addtogroup nss_tunipip6_subsystem |
| * @{ |
| */ |
| |
| /** |
| * nss_tunipip6_map_rule |
| * Mapping rule (FMR/BMR) for forwarding traffic to the node in the same domain. |
| */ |
| struct nss_tunipip6_map_rule { |
| uint32_t ip6_prefix[4]; /**< An IPv6 prefix assigned by a mapping rule. */ |
| uint32_t ip4_prefix; /**< An IPv4 prefix assigned by a mapping rule. */ |
| uint32_t ip6_prefix_len; /**< IPv6 prefix length. */ |
| uint32_t ip4_prefix_len; /**< IPv4 prefix length. */ |
| uint32_t ip6_suffix[4]; /**< IPv6 suffix. */ |
| uint32_t ip6_suffix_len; /**< IPv6 suffix length. */ |
| uint32_t ea_len; /**< Embedded Address (EA) bits. */ |
| uint32_t psid_offset; /**< PSID offset default 6. */ |
| }; |
| |
| /** |
| * nss_tunipip6_err_types |
| * Error types for response to messages from the host. |
| */ |
| enum nss_tunipip6_err_types { |
| NSS_TUNIPIP6_ERR_TYPE_MAX_TUNNELS, /**< Maximum number of tunnel reached. */ |
| NSS_TUNIPIP6_ERR_TYPE_TUNNEL_EXIST, /**< Tunnel already exists. */ |
| NSS_TUNIPIP6_ERR_TYPE_ENCAP_BAD_PARAM, /**< Bad configuration. */ |
| NSS_TUNIPIP6_ERR_TYPE_ENCAP_FMR_EXIST, /**< FMR already exists. */ |
| NSS_TUNIPIP6_ERR_TYPE_ENCAP_NO_FMR, /**< No FMR configured.*/ |
| NSS_TUNIPIP6_ERR_TYPE_ENCAP_FMR_FULL, /**< FMR table is full. */ |
| NSS_TUNIPIP6_ERR_TYPE_ENCAP_INVALID_FMR, /**< Invalid FMR configured.*/ |
| NSS_TUNIPIP6_ERR_TYPE_ENCAP_BMR_EXIST, /**< BMR already exists. */ |
| NSS_TUNIPIP6_ERR_TYPE_ENCAP_NO_BMR, /**< No BMR configured. */ |
| NSS_TUNIPIP6_ERR_TYPE_ENCAP_FMR_MEM_ALLOC_FAILED, /**< Pool allocation for FMR failed. */ |
| NSS_TUNIPIP6_ERR_TYPE_UNKNOWN, /**< Unknown message type. */ |
| NSS_TUNIPIP6_ERROR_MAX, /**< Maximum number of errors. */ |
| }; |
| |
| /** |
| * nss_tunipip6_metadata_types |
| * Message types for TUNIPIP6 (IPv4 in IPv6) tunnel requests and responses. |
| */ |
| enum nss_tunipip6_metadata_types { |
| NSS_TUNIPIP6_TX_ENCAP_IF_CREATE, |
| NSS_TUNIPIP6_TX_DECAP_IF_CREATE, |
| NSS_TUNIPIP6_STATS_SYNC, |
| NSS_TUNIPIP6_FMR_RULE_ADD, |
| NSS_TUNIPIP6_FMR_RULE_DEL, |
| NSS_TUNIPIP6_FMR_RULE_FLUSH, |
| NSS_TUNIPIP6_BMR_RULE_ADD, |
| NSS_TUNIPIP6_BMR_RULE_DEL, |
| NSS_TUNIPIP6_MAX, |
| }; |
| |
| /** |
| * nss_tunipip6_create_msg |
| * Payload for configuring the TUNIPIP6 interface. |
| */ |
| struct nss_tunipip6_create_msg { |
| uint32_t saddr[4]; /**< Tunnel source address. */ |
| uint32_t daddr[4]; /**< Tunnel destination address. */ |
| uint32_t flowlabel; /**< Tunnel IPv6 flow label. */ |
| uint32_t flags; /**< Tunnel additional flags. */ |
| uint32_t sibling_if_num; /**< Sibling interface number. */ |
| uint8_t hop_limit; /**< Tunnel IPv6 hop limit. */ |
| uint8_t draft03; /**< Use MAP-E draft03 specification. */ |
| uint8_t ttl_inherit; /**< Inherit IPv4 TTL to hoplimit. */ |
| uint8_t tos_inherit; /**< Inherit IPv4 ToS. */ |
| uint8_t frag_id_update; /**< Enable update of fragment identifier of IPv4. */ |
| uint8_t reserved[3]; /**< Reserved bytes. */ |
| uint32_t fmr_max; /**< Maximum number of FMRs that can be configured. */ |
| }; |
| |
| /** |
| * nss_tunipip6_debug_stats |
| * TUNIPIP6 debug statistics. |
| */ |
| struct nss_tunipip6_debug_stats { |
| struct { |
| struct { |
| uint32_t low_headroom; /**< Low headroom for encapsulation. */ |
| uint32_t unhandled_proto; /**< Unhandled protocol for encapsulation. */ |
| } exp; |
| |
| struct { |
| uint32_t enqueue_fail; /**< Encapsulation enqueue fail. */ |
| } drop; |
| |
| struct { |
| uint32_t err_tunnel_cfg; /**< Tunnel configuration error. */ |
| uint32_t total_fmr; /**< Total number of existing FMRs. */ |
| uint32_t fmr_add_req; /**< FMR add requests. */ |
| uint32_t fmr_del_req; /**< FMR delete requests. */ |
| uint32_t fmr_flush_req; /**< FMR flush requests. */ |
| uint32_t fmr_update_req; /**< FMR update requests. */ |
| uint32_t fmr_add_fail; /**< FMR addition failed. */ |
| uint32_t fmr_del_fail; /**< FMR deletion failed. */ |
| uint32_t err_no_fmr; /**< No FMR configured. */ |
| uint32_t bmr_add_req; /**< BMR add requests. */ |
| uint32_t bmr_del_req; /**< BMR delete requests. */ |
| uint32_t err_bmr_exist; /**< BMR already configured. */ |
| uint32_t err_no_bmr; /**< No BMR configured. */ |
| } cfg; |
| } encap; |
| |
| struct { |
| struct { |
| uint32_t enqueue_fail; /**< Decapsulation enqueue fail. */ |
| } drop; |
| } decap; |
| }; |
| |
| /** |
| * nss_tunipip6_stats_sync_msg |
| * Message information for TUNIPIP6 synchronization statistics. |
| */ |
| struct nss_tunipip6_stats_sync_msg { |
| struct nss_cmn_node_stats node_stats; /**< Common node statistics. */ |
| struct nss_tunipip6_debug_stats tun_stats; /**< TUNIPIP6 debug statistics. */ |
| }; |
| |
| /** |
| * nss_tunipip6_msg |
| * Data for sending and receiving TUNIPIP6 messages. |
| */ |
| struct nss_tunipip6_msg { |
| struct nss_cmn_msg cm; /**< Common message header. */ |
| |
| /** |
| * Payload of a TUNIPIP6 message. |
| */ |
| union { |
| struct nss_tunipip6_create_msg tunipip6_create; |
| /**< Create a TUNIPIP6 tunnel. */ |
| struct nss_tunipip6_stats_sync_msg stats; |
| /**< Synchronized statistics for the TUNIPIP6 interface. */ |
| struct nss_tunipip6_map_rule map_rule; |
| /**< BMR/FMR rule to add/delete, new or existing rules. */ |
| } msg; /**< Message payload for TUNIPIP6 messages exchanged with NSS core. */ |
| }; |
| |
| /** |
| * Callback function for receiving TUNIPIP6 messages. |
| * |
| * @datatypes |
| * nss_tunipip6_msg |
| * |
| * @param[in] app_data Pointer to the application context of the message. |
| * @param[in] msg Pointer to the message data. |
| */ |
| typedef void (*nss_tunipip6_msg_callback_t)(void *app_data, struct nss_tunipip6_msg *msg); |
| |
| /** |
| * nss_tunipip6_tx |
| * Sends a TUNIPIP6 message to NSS core. |
| * |
| * @datatypes |
| * nss_ctx_instance \n |
| * nss_tunipip6_msg |
| * |
| * @param[in] nss_ctx Pointer to the NSS context. |
| * @param[in] msg Pointer to the message data. |
| * |
| * @return |
| * Status of the Tx operation. |
| */ |
| extern nss_tx_status_t nss_tunipip6_tx(struct nss_ctx_instance *nss_ctx, struct nss_tunipip6_msg *msg); |
| |
| /** |
| * nss_tunipip6_tx_sync |
| * Sends a TUNIPIP6 message to NSS core synchronously. |
| * |
| * @datatypes |
| * nss_ctx_instance \n |
| * nss_tunipip6_msg |
| * |
| * @param[in] nss_ctx Pointer to the NSS context. |
| * @param[in] msg Pointer to the message data. |
| * |
| * @return |
| * Status of the Tx operation. |
| */ |
| extern nss_tx_status_t nss_tunipip6_tx_sync(struct nss_ctx_instance *nss_ctx, struct nss_tunipip6_msg *msg); |
| |
| /** |
| * Callback function for receiving TUNIPIP6 data. |
| * |
| * @datatypes |
| * net_device \n |
| * sk_buff \n |
| * napi_struct |
| * |
| * @param[in] netdev Pointer to the associated network device. |
| * @param[in] skb Pointer to the data socket buffer. |
| * @param[in] napi Pointer to the NAPI structure. |
| */ |
| typedef void (*nss_tunipip6_callback_t)(struct net_device *netdev, struct sk_buff *skb, struct napi_struct *napi); |
| |
| /** |
| * nss_register_tunipip6_if |
| * Registers the TUNIPIP6 interface with the NSS for sending and receiving |
| * TUNIPIP6 messages. |
| * |
| * @datatypes |
| * nss_tunipip6_callback_t \n |
| * nss_tunipip6_msg_callback_t \n |
| * net_device |
| * |
| * @param[in] if_num NSS interface number. |
| * @param[in] type Dynamic interface type. |
| * @param[in] tunipip6_callback Callback for the data. |
| * @param[in] event_callback Callback for the message. |
| * @param[in] netdev Pointer to the associated network device. |
| * @param[in] features Data socket buffer types supported by this interface. |
| * |
| * @return |
| * Pointer to the NSS core context. |
| */ |
| extern struct nss_ctx_instance *nss_register_tunipip6_if(uint32_t if_num, uint32_t type, nss_tunipip6_callback_t tunipip6_callback, |
| nss_tunipip6_msg_callback_t event_callback, struct net_device *netdev, uint32_t features); |
| |
| /** |
| * nss_unregister_tunipip6_if |
| * Deregisters the TUNIPIP6 interface from the NSS. |
| * |
| * @param[in] if_num NSS interface number. |
| * |
| * @return |
| * None. |
| */ |
| extern void nss_unregister_tunipip6_if(uint32_t if_num); |
| |
| /** |
| * nss_tunipip6_msg_init |
| * Initializes a TUNIPIP6 message. |
| * |
| * @datatypes |
| * nss_tunipip6_msg |
| * |
| * @param[in,out] ntm Pointer to the IPIP6 tunnel message. |
| * @param[in] if_num NSS interface number. |
| * @param[in] type Type of message. |
| * @param[in] len Size of the message. |
| * @param[in] cb Pointer to the message callback. |
| * @param[in] app_data Pointer to the application context of the message. |
| * |
| * @return |
| * None. |
| */ |
| extern void nss_tunipip6_msg_init(struct nss_tunipip6_msg *ntm, uint16_t if_num, uint32_t type, uint32_t len, void *cb, void *app_data); |
| |
| /** |
| * nss_tunipip6_get_context() |
| * Get TUNIPIP6 context. |
| * |
| * @return |
| * Pointer to the NSS core context. |
| */ |
| extern struct nss_ctx_instance *nss_tunipip6_get_context(void); |
| |
| /** @} */ /* end_addtogroup nss_tunipip6_subsystem */ |
| |
| #endif /* __NSS_TUN6RD_H */ |