root/include/linux/mlx5/fs_helpers.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


DEFINITIONS

This source file includes following definitions.
  1. mlx5_fs_is_ipsec_flow
  2. _mlx5_fs_is_outer_ipproto_flow
  3. mlx5_fs_is_outer_tcp_flow
  4. mlx5_fs_is_outer_udp_flow
  5. mlx5_fs_is_vxlan_flow
  6. _mlx5_fs_is_outer_ipv_flow
  7. mlx5_fs_is_outer_ipv4_flow
  8. mlx5_fs_is_outer_ipv6_flow
  9. mlx5_fs_is_outer_ipsec_flow

   1 /*
   2  * Copyright (c) 2018, Mellanox Technologies. All rights reserved.
   3  *
   4  * This software is available to you under a choice of one of two
   5  * licenses.  You may choose to be licensed under the terms of the GNU
   6  * General Public License (GPL) Version 2, available from the file
   7  * COPYING in the main directory of this source tree, or the
   8  * OpenIB.org BSD license below:
   9  *
  10  *     Redistribution and use in source and binary forms, with or
  11  *     without modification, are permitted provided that the following
  12  *     conditions are met:
  13  *
  14  *      - Redistributions of source code must retain the above
  15  *        copyright notice, this list of conditions and the following
  16  *        disclaimer.
  17  *
  18  *      - Redistributions in binary form must reproduce the above
  19  *        copyright notice, this list of conditions and the following
  20  *        disclaimer in the documentation and/or other materials
  21  *        provided with the distribution.
  22  *
  23  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
  24  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
  25  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
  26  * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
  27  * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
  28  * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
  29  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
  30  * SOFTWARE.
  31  */
  32 
  33 #ifndef _MLX5_FS_HELPERS_
  34 #define _MLX5_FS_HELPERS_
  35 
  36 #include <linux/mlx5/mlx5_ifc.h>
  37 
  38 #define MLX5_FS_IPV4_VERSION 4
  39 #define MLX5_FS_IPV6_VERSION 6
  40 
  41 static inline bool mlx5_fs_is_ipsec_flow(const u32 *match_c)
  42 {
  43         void *misc_params_c = MLX5_ADDR_OF(fte_match_param, match_c,
  44                                            misc_parameters);
  45 
  46         return MLX5_GET(fte_match_set_misc, misc_params_c, outer_esp_spi);
  47 }
  48 
  49 static inline bool _mlx5_fs_is_outer_ipproto_flow(const u32 *match_c,
  50                                                   const u32 *match_v, u8 match)
  51 {
  52         const void *headers_c = MLX5_ADDR_OF(fte_match_param, match_c,
  53                                              outer_headers);
  54         const void *headers_v = MLX5_ADDR_OF(fte_match_param, match_v,
  55                                              outer_headers);
  56 
  57         return MLX5_GET(fte_match_set_lyr_2_4, headers_c, ip_protocol) == 0xff &&
  58                 MLX5_GET(fte_match_set_lyr_2_4, headers_v, ip_protocol) == match;
  59 }
  60 
  61 static inline bool mlx5_fs_is_outer_tcp_flow(const u32 *match_c,
  62                                              const u32 *match_v)
  63 {
  64         return _mlx5_fs_is_outer_ipproto_flow(match_c, match_v, IPPROTO_TCP);
  65 }
  66 
  67 static inline bool mlx5_fs_is_outer_udp_flow(const u32 *match_c,
  68                                              const u32 *match_v)
  69 {
  70         return _mlx5_fs_is_outer_ipproto_flow(match_c, match_v, IPPROTO_UDP);
  71 }
  72 
  73 static inline bool mlx5_fs_is_vxlan_flow(const u32 *match_c)
  74 {
  75         void *misc_params_c = MLX5_ADDR_OF(fte_match_param, match_c,
  76                                            misc_parameters);
  77 
  78         return MLX5_GET(fte_match_set_misc, misc_params_c, vxlan_vni);
  79 }
  80 
  81 static inline bool _mlx5_fs_is_outer_ipv_flow(struct mlx5_core_dev *mdev,
  82                                               const u32 *match_c,
  83                                               const u32 *match_v, int version)
  84 {
  85         int match_ipv = MLX5_CAP_FLOWTABLE_NIC_RX(mdev,
  86                                                   ft_field_support.outer_ip_version);
  87         const void *headers_c = MLX5_ADDR_OF(fte_match_param, match_c,
  88                                              outer_headers);
  89         const void *headers_v = MLX5_ADDR_OF(fte_match_param, match_v,
  90                                              outer_headers);
  91 
  92         if (!match_ipv) {
  93                 u16 ethertype;
  94 
  95                 switch (version) {
  96                 case MLX5_FS_IPV4_VERSION:
  97                         ethertype = ETH_P_IP;
  98                         break;
  99                 case MLX5_FS_IPV6_VERSION:
 100                         ethertype = ETH_P_IPV6;
 101                         break;
 102                 default:
 103                         return false;
 104                 }
 105 
 106                 return MLX5_GET(fte_match_set_lyr_2_4, headers_c,
 107                                 ethertype) == 0xffff &&
 108                         MLX5_GET(fte_match_set_lyr_2_4, headers_v,
 109                                  ethertype) == ethertype;
 110         }
 111 
 112         return MLX5_GET(fte_match_set_lyr_2_4, headers_c,
 113                         ip_version) == 0xf &&
 114                 MLX5_GET(fte_match_set_lyr_2_4, headers_v,
 115                          ip_version) == version;
 116 }
 117 
 118 static inline bool
 119 mlx5_fs_is_outer_ipv4_flow(struct mlx5_core_dev *mdev, const u32 *match_c,
 120                            const u32 *match_v)
 121 {
 122         return _mlx5_fs_is_outer_ipv_flow(mdev, match_c, match_v,
 123                                           MLX5_FS_IPV4_VERSION);
 124 }
 125 
 126 static inline bool
 127 mlx5_fs_is_outer_ipv6_flow(struct mlx5_core_dev *mdev, const u32 *match_c,
 128                            const u32 *match_v)
 129 {
 130         return _mlx5_fs_is_outer_ipv_flow(mdev, match_c, match_v,
 131                                           MLX5_FS_IPV6_VERSION);
 132 }
 133 
 134 static inline bool mlx5_fs_is_outer_ipsec_flow(const u32 *match_c)
 135 {
 136         void *misc_params_c =
 137                         MLX5_ADDR_OF(fte_match_param, match_c, misc_parameters);
 138 
 139         return MLX5_GET(fte_match_set_misc, misc_params_c, outer_esp_spi);
 140 }
 141 
 142 #endif

/* [<][>][^][v][top][bottom][index][help] */