Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge branch 'net-sched-cls_flower-add-support-for-matching-on-ct_state-reply-flag'

Paul Blakey says:

====================
net/sched: cls_flower: Add support for matching on ct_state reply flag

This patchset adds software match support and offload of flower
match ct_state reply flag (+/-rpl).

The first patch adds the definition for the flag and match to flower.

Second patch gives the direction of the connection to the offloading
drivers via ct_metadata flow offload action.

The last patch does offload of this new ct_state by using the supplied
connection's direction.
====================

Link: https://lore.kernel.org/r/1611757967-18236-1-git-send-email-paulb@nvidia.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>

+17 -5
+10 -3
drivers/net/ethernet/mellanox/mlx5/core/en/tc_ct.c
··· 27 27 #define MLX5_CT_STATE_ESTABLISHED_BIT BIT(1) 28 28 #define MLX5_CT_STATE_TRK_BIT BIT(2) 29 29 #define MLX5_CT_STATE_NAT_BIT BIT(3) 30 + #define MLX5_CT_STATE_REPLY_BIT BIT(4) 30 31 31 32 #define MLX5_FTE_ID_BITS (mlx5e_tc_attr_to_reg_mappings[FTEID_TO_REG].mlen * 8) 32 33 #define MLX5_FTE_ID_MAX GENMASK(MLX5_FTE_ID_BITS - 1, 0) ··· 642 641 } 643 642 644 643 ct_state |= MLX5_CT_STATE_ESTABLISHED_BIT | MLX5_CT_STATE_TRK_BIT; 644 + ct_state |= meta->ct_metadata.orig_dir ? 0 : MLX5_CT_STATE_REPLY_BIT; 645 645 err = mlx5_tc_ct_entry_set_registers(ct_priv, &mod_acts, 646 646 ct_state, 647 647 meta->ct_metadata.mark, ··· 1088 1086 struct netlink_ext_ack *extack) 1089 1087 { 1090 1088 struct flow_rule *rule = flow_cls_offload_flow_rule(f); 1089 + bool trk, est, untrk, unest, new, rpl, unrpl; 1091 1090 struct flow_dissector_key_ct *mask, *key; 1092 - bool trk, est, untrk, unest, new; 1093 1091 u32 ctstate = 0, ctstate_mask = 0; 1094 1092 u16 ct_state_on, ct_state_off; 1095 1093 u16 ct_state, ct_state_mask; ··· 1115 1113 1116 1114 if (ct_state_mask & ~(TCA_FLOWER_KEY_CT_FLAGS_TRACKED | 1117 1115 TCA_FLOWER_KEY_CT_FLAGS_ESTABLISHED | 1118 - TCA_FLOWER_KEY_CT_FLAGS_NEW)) { 1116 + TCA_FLOWER_KEY_CT_FLAGS_NEW | 1117 + TCA_FLOWER_KEY_CT_FLAGS_REPLY)) { 1119 1118 NL_SET_ERR_MSG_MOD(extack, 1120 - "only ct_state trk, est and new are supported for offload"); 1119 + "only ct_state trk, est, new and rpl are supported for offload"); 1121 1120 return -EOPNOTSUPP; 1122 1121 } 1123 1122 ··· 1127 1124 trk = ct_state_on & TCA_FLOWER_KEY_CT_FLAGS_TRACKED; 1128 1125 new = ct_state_on & TCA_FLOWER_KEY_CT_FLAGS_NEW; 1129 1126 est = ct_state_on & TCA_FLOWER_KEY_CT_FLAGS_ESTABLISHED; 1127 + rpl = ct_state_on & TCA_FLOWER_KEY_CT_FLAGS_REPLY; 1130 1128 untrk = ct_state_off & TCA_FLOWER_KEY_CT_FLAGS_TRACKED; 1131 1129 unest = ct_state_off & TCA_FLOWER_KEY_CT_FLAGS_ESTABLISHED; 1130 + unrpl = ct_state_off & TCA_FLOWER_KEY_CT_FLAGS_REPLY; 1132 1131 1133 1132 ctstate |= trk ? MLX5_CT_STATE_TRK_BIT : 0; 1134 1133 ctstate |= est ? MLX5_CT_STATE_ESTABLISHED_BIT : 0; 1134 + ctstate |= rpl ? MLX5_CT_STATE_REPLY_BIT : 0; 1135 1135 ctstate_mask |= (untrk || trk) ? MLX5_CT_STATE_TRK_BIT : 0; 1136 1136 ctstate_mask |= (unest || est) ? MLX5_CT_STATE_ESTABLISHED_BIT : 0; 1137 + ctstate_mask |= (unrpl || rpl) ? MLX5_CT_STATE_REPLY_BIT : 0; 1137 1138 1138 1139 if (new) { 1139 1140 NL_SET_ERR_MSG_MOD(extack,
+1
include/net/flow_offload.h
··· 245 245 unsigned long cookie; 246 246 u32 mark; 247 247 u32 labels[4]; 248 + bool orig_dir; 248 249 } ct_metadata; 249 250 struct { /* FLOW_ACTION_MPLS_PUSH */ 250 251 u32 label;
+1
include/uapi/linux/pkt_cls.h
··· 592 592 TCA_FLOWER_KEY_CT_FLAGS_RELATED = 1 << 2, /* Related to an established connection. */ 593 593 TCA_FLOWER_KEY_CT_FLAGS_TRACKED = 1 << 3, /* Conntrack has occurred. */ 594 594 TCA_FLOWER_KEY_CT_FLAGS_INVALID = 1 << 4, /* Conntrack is invalid. */ 595 + TCA_FLOWER_KEY_CT_FLAGS_REPLY = 1 << 5, /* Packet is in the reply direction. */ 595 596 }; 596 597 597 598 enum {
+1
net/sched/act_ct.c
··· 183 183 IP_CT_ESTABLISHED_REPLY; 184 184 /* aligns with the CT reference on the SKB nf_ct_set */ 185 185 entry->ct_metadata.cookie = (unsigned long)ct | ctinfo; 186 + entry->ct_metadata.orig_dir = dir == IP_CT_DIR_ORIGINAL; 186 187 187 188 act_ct_labels = entry->ct_metadata.labels; 188 189 ct_labels = nf_ct_labels_find(ct);
+4 -2
net/sched/cls_flower.c
··· 291 291 [IP_CT_RELATED] = TCA_FLOWER_KEY_CT_FLAGS_TRACKED | 292 292 TCA_FLOWER_KEY_CT_FLAGS_RELATED, 293 293 [IP_CT_ESTABLISHED_REPLY] = TCA_FLOWER_KEY_CT_FLAGS_TRACKED | 294 - TCA_FLOWER_KEY_CT_FLAGS_ESTABLISHED, 294 + TCA_FLOWER_KEY_CT_FLAGS_ESTABLISHED | 295 + TCA_FLOWER_KEY_CT_FLAGS_REPLY, 295 296 [IP_CT_RELATED_REPLY] = TCA_FLOWER_KEY_CT_FLAGS_TRACKED | 296 - TCA_FLOWER_KEY_CT_FLAGS_RELATED, 297 + TCA_FLOWER_KEY_CT_FLAGS_RELATED | 298 + TCA_FLOWER_KEY_CT_FLAGS_REPLY, 297 299 [IP_CT_NEW] = TCA_FLOWER_KEY_CT_FLAGS_TRACKED | 298 300 TCA_FLOWER_KEY_CT_FLAGS_NEW, 299 301 };