| /* |
| ************************************************************************** |
| * Copyright (c) 2017, 2019 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. |
| ************************************************************************** |
| */ |
| |
| #ifndef _NSS_CONNMGR_GRE_PUBLIC_H_ |
| #define _NSS_CONNMGR_GRE_PUBLIC_H_ |
| |
| #include "nss_dynamic_interface.h" |
| |
| /** |
| * @brief tap/tun enums |
| * |
| * Only tap is supported |
| */ |
| enum nss_connmgr_gre_mode { |
| GRE_MODE_TUN, /**< Tun interface */ |
| GRE_MODE_TAP, /**< Tap interface */ |
| GRE_MODE_MAX /**< Max type */ |
| }; |
| |
| /** |
| * @brief ipv4/ipv6 tunnel |
| * |
| * Only ipv4 is supported |
| */ |
| enum nss_connmgr_gre_ip_type { |
| GRE_OVER_IPV4, /**< IPv4 tunnel */ |
| GRE_OVER_IPV6, /**< IPv6 tunnel */ |
| }; |
| |
| /** |
| * @brief GRE err codes |
| * |
| * Error codes |
| */ |
| enum nss_connmgr_gre_err_codes { |
| GRE_SUCCESS = 0, /**< Success */ |
| GRE_ERR_ALLOC_NETDEV = 1, /**< Alloc netdevice failed */ |
| GRE_ERR_NO_NETDEV = 2, /**< No netdevice found */ |
| GRE_ERR_NO_LOCAL_NETDEV = 3, /**< No netdevice found for corresonding src IP address in cfg */ |
| GRE_ERR_NO_NEXT_NETDEV = 4, /**< No netdevice found for next device in cfg */ |
| GRE_ERR_RADDR_ROUTE_LOOKUP = 5, /**< Route look up failed for destination IP address */ |
| GRE_ERR_NOT_GRE_NETDEV = 6, /**< Netdevice is not of type GRE */ |
| GRE_ERR_NETDEV_REG_FAILED = 7, /**< Netdevice registration failed */ |
| GRE_ERR_INVALID_MODE = 8, /**< Invalid GRE mode */ |
| GRE_ERR_INVALID_MAC = 9, /**< Invalid MAC */ |
| GRE_ERR_NEIGH_CREATE = 10, /**< Error in creating neigh entry for IP */ |
| GRE_ERR_NEIGH_LOOKUP = 11, /**< Neighbour lookup failed */ |
| GRE_ERR_NEIGH_DEV_LOOPBACK = 12, /**< Neighbour dev is loopback device */ |
| GRE_ERR_NEIGH_DEV_NOARP = 13, /**< Neighbour dev is no ARP device */ |
| GRE_ERR_INVALID_IP = 14, /**< Invalid IP address */ |
| GRE_ERR_NODE_UNREG_IN_AE = 15, /**< Node is not recognized by NSS */ |
| GRE_ERR_NEXT_NODE_UNREG_IN_AE = 16, /**< Next node is not registered in NSS */ |
| GRE_ERR_DYNMAIC_IFACE_CREATE = 17, /**< Dynamic interface creation failed */ |
| GRE_ERR_DYNMAIC_IFACE_DESTROY = 18, /**< Dynamic interface destroy failed */ |
| GRE_ERR_GRE_IFACE_REG = 19, /**< GRE iface register with NSS drv failed */ |
| GRE_ERR_AE_CONFIG_FAILED = 20, /**< AE engine config faild */ |
| GRE_ERR_AE_DECONFIG_FAILED = 21, /**< AE engine delete command faild */ |
| GRE_ERR_AE_SET_NEXT_HOP = 22, /**< Set next hop in AE failed */ |
| GRE_ERR_UNSUPPORTED_CFG = 23, /**< Unsupported configuration */ |
| GRE_ERR_IN_INTERRUPT_CTX = 24, /**< APIs invoked in interrupt context */ |
| GRE_ERR_ALLOC_GRE_INSTANCE = 25, /**< GRE interface instance allcation failed */ |
| GRE_ERR_NO_GRE_INSTANCE = 26, /**< GRE interface instance is not found */ |
| GRE_ERR_MAX |
| }; |
| |
| /** |
| * @brief User config structure |
| * |
| * User of this client driver needs to fill in this structure and call |
| * nss_connmgr_gre_create_interface() API to create GRE tap interface. |
| * There is no support for Sequence number and checksum. |
| */ |
| struct nss_connmgr_gre_cfg { |
| enum nss_connmgr_gre_mode mode; /**< GRE modes. (Mandatory field) */ |
| enum nss_connmgr_gre_ip_type ip_type; /**< IP types (Mandatory field) */ |
| |
| bool set_df; /**< Set DF flag ? (Optional field) */ |
| bool ikey_valid, okey_valid; /**< Take care of keys ? (Optional field)*/ |
| bool iseq_valid, oseq_valid; /**< Take care of sequence number ? (No support)*/ |
| bool icsum_valid, ocsum_valid; /**< Take care of checksum ? (No support)*/ |
| bool tos_inherit; /**< Inherit TOS ? (Optional) */ |
| bool ttl_inherit; /**< Interit TTL ? (Optional) */ |
| bool dscp_valid; /**< Is DSCP provided per packet? (Optional) */ |
| bool use_mac_hdr; /**< Add MAC header which is provided (Optional field)*/ |
| bool add_padding; /**< Add padding to make GRE 4 byte aligned ? (Optional field) */ |
| bool copy_metadata; /**< Copy metadata during alignment ? (Optional field) */ |
| bool is_ipv6; /**< Set if addr is IPv6 (Mandatory field)*/ |
| |
| uint32_t src_ip[4]; /**< Src IP address (Mandatory field) */ |
| uint32_t dest_ip[4]; /**< Dest IP address (Mandatory field)*/ |
| |
| uint16_t src_mac[3]; /**< Src MAC address (Depends on use_mac_hdr field) */ |
| uint16_t dest_mac[3]; /**< Dest MAC address (Depends on use_mac_hdr field) */ |
| |
| uint32_t ikey; /**< In Key (Optional field)*/ |
| uint32_t okey; /**< Out Key (Optional field)*/ |
| |
| struct net_device *next_dev; /**< Next network device inner flow (Mandatory field)*/ |
| enum nss_dynamic_interface_type inner_nss_if_type; /**< Dynamic interface type of inner network device */ |
| |
| struct net_device *next_dev_outer; /**< Next network device outer flow (Mandatory field)*/ |
| enum nss_dynamic_interface_type outer_nss_if_type; /**< Dynamic interface type of outer network device */ |
| |
| char *name; /**< Name of GRE Tap interface (Optional field) */ |
| |
| uint8_t ttl; /**< Time to Live (Depends on ttl_inherit field) */ |
| uint8_t tos; /**< Type of service (Depends on tos_inherit field) */ |
| uint16_t reserved; /**< Reserved for future use */ |
| }; |
| |
| /** |
| * @brief GRE interface Create/Delete API |
| * |
| * API to create/delete GRE interface. These API should not |
| * be invoked in interrupt/softirq context |
| */ |
| struct net_device *nss_connmgr_gre_create_interface( |
| struct nss_connmgr_gre_cfg *cfg, enum nss_connmgr_gre_err_codes *err_code); |
| |
| enum nss_connmgr_gre_err_codes nss_connmgr_gre_destroy_interface(struct net_device *dev); |
| |
| /** |
| * @brief GRE interface Open API |
| * |
| * API to enable GRE interface. |
| */ |
| extern int nss_connmgr_gre_dev_open(struct net_device *dev); |
| |
| /** |
| * @brief GRE interface Close API |
| * |
| * API to disable GRE interface. |
| */ |
| extern int nss_connmgr_gre_dev_close(struct net_device *dev); |
| |
| #endif |