149 lines · c
1/*2 * This file is part of the Chelsio T4/T5/T6 Ethernet driver for Linux.3 *4 * Copyright (c) 2017 Chelsio Communications, Inc. All rights reserved.5 *6 * This software is available to you under a choice of one of two7 * licenses. You may choose to be licensed under the terms of the GNU8 * General Public License (GPL) Version 2, available from the file9 * COPYING in the main directory of this source tree, or the10 * OpenIB.org BSD license below:11 *12 * Redistribution and use in source and binary forms, with or13 * without modification, are permitted provided that the following14 * conditions are met:15 *16 * - Redistributions of source code must retain the above17 * copyright notice, this list of conditions and the following18 * disclaimer.19 *20 * - Redistributions in binary form must reproduce the above21 * copyright notice, this list of conditions and the following22 * disclaimer in the documentation and/or other materials23 * provided with the distribution.24 *25 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,26 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF27 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND28 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS29 * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN30 * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN31 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE32 * SOFTWARE.33 */34 35#ifndef __CXGB4_TC_FLOWER_H36#define __CXGB4_TC_FLOWER_H37 38#include <net/pkt_cls.h>39 40struct ch_tc_flower_stats {41 u64 prev_packet_count;42 u64 packet_count;43 u64 byte_count;44 u64 last_used;45};46 47struct ch_tc_flower_entry {48 struct ch_filter_specification fs;49 struct ch_tc_flower_stats stats;50 unsigned long tc_flower_cookie;51 struct rhash_head node;52 struct rcu_head rcu;53 spinlock_t lock; /* lock for stats */54 u32 filter_id;55};56 57enum {58 ETH_DMAC_31_0, /* dmac bits 0.. 31 */59 ETH_DMAC_47_32, /* dmac bits 32..47 */60 ETH_SMAC_15_0, /* smac bits 0.. 15 */61 ETH_SMAC_47_16, /* smac bits 16..47 */62 63 IP4_SRC, /* 32-bit IPv4 src */64 IP4_DST, /* 32-bit IPv4 dst */65 66 IP6_SRC_31_0, /* src bits 0.. 31 */67 IP6_SRC_63_32, /* src bits 63.. 32 */68 IP6_SRC_95_64, /* src bits 95.. 64 */69 IP6_SRC_127_96, /* src bits 127..96 */70 71 IP6_DST_31_0, /* dst bits 0.. 31 */72 IP6_DST_63_32, /* dst bits 63.. 32 */73 IP6_DST_95_64, /* dst bits 95.. 64 */74 IP6_DST_127_96, /* dst bits 127..96 */75 76 TCP_SPORT, /* 16-bit TCP sport */77 TCP_DPORT, /* 16-bit TCP dport */78 79 UDP_SPORT, /* 16-bit UDP sport */80 UDP_DPORT, /* 16-bit UDP dport */81};82 83struct ch_tc_pedit_fields {84 u8 field;85 u8 size;86 u32 offset;87};88 89#define PEDIT_FIELDS(type, field, size, fs_field, offset) \90 { type## field, size, \91 offsetof(struct ch_filter_specification, fs_field) + (offset) }92 93#define PEDIT_ETH_DMAC_MASK 0xffff94#define PEDIT_TCP_UDP_SPORT_MASK 0xffff95#define PEDIT_ETH_DMAC_31_0 0x096#define PEDIT_ETH_DMAC_47_32_SMAC_15_0 0x497#define PEDIT_ETH_SMAC_47_16 0x898#define PEDIT_IP4_SRC 0xC99#define PEDIT_IP4_DST 0x10100#define PEDIT_IP6_SRC_31_0 0x8101#define PEDIT_IP6_SRC_63_32 0xC102#define PEDIT_IP6_SRC_95_64 0x10103#define PEDIT_IP6_SRC_127_96 0x14104#define PEDIT_IP6_DST_31_0 0x18105#define PEDIT_IP6_DST_63_32 0x1C106#define PEDIT_IP6_DST_95_64 0x20107#define PEDIT_IP6_DST_127_96 0x24108#define PEDIT_TCP_SPORT_DPORT 0x0109#define PEDIT_UDP_SPORT_DPORT 0x0110 111enum cxgb4_action_natmode_flags {112 CXGB4_ACTION_NATMODE_NONE = 0,113 CXGB4_ACTION_NATMODE_DIP = (1 << 0),114 CXGB4_ACTION_NATMODE_SIP = (1 << 1),115 CXGB4_ACTION_NATMODE_DPORT = (1 << 2),116 CXGB4_ACTION_NATMODE_SPORT = (1 << 3),117};118 119/* TC PEDIT action to NATMODE translation entry */120struct cxgb4_natmode_config {121 enum chip_type chip;122 u8 flags;123 u8 natmode;124};125 126void cxgb4_process_flow_actions(struct net_device *in,127 struct flow_action *actions,128 struct ch_filter_specification *fs);129int cxgb4_validate_flow_actions(struct net_device *dev,130 struct flow_action *actions,131 struct netlink_ext_ack *extack,132 u8 matchall_filter);133 134int cxgb4_tc_flower_replace(struct net_device *dev,135 struct flow_cls_offload *cls);136int cxgb4_tc_flower_destroy(struct net_device *dev,137 struct flow_cls_offload *cls);138int cxgb4_tc_flower_stats(struct net_device *dev,139 struct flow_cls_offload *cls);140int cxgb4_flow_rule_replace(struct net_device *dev, struct flow_rule *rule,141 u32 tc_prio, struct netlink_ext_ack *extack,142 struct ch_filter_specification *fs, u32 *tid);143int cxgb4_flow_rule_destroy(struct net_device *dev, u32 tc_prio,144 struct ch_filter_specification *fs, int tid);145 146int cxgb4_init_tc_flower(struct adapter *adap);147void cxgb4_cleanup_tc_flower(struct adapter *adap);148#endif /* __CXGB4_TC_FLOWER_H */149