fs_helpers.h (4423B)
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 41static 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 49static 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 61static 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 67static 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 73static 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 81static 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 118static inline bool 119mlx5_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 126static inline bool 127mlx5_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 134static 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