]> Git Repo - J-linux.git/commitdiff
octeontx2-pf: Add TC flower offload support for TCP flags
authorSai Krishna <[email protected]>
Tue, 5 Mar 2024 18:16:06 +0000 (23:46 +0530)
committerDavid S. Miller <[email protected]>
Fri, 8 Mar 2024 10:26:52 +0000 (10:26 +0000)
This patch adds TC offload support for matching TCP flags
from TCP header.

Example usage:
tc qdisc add dev eth0 ingress

TC rule to drop the TCP SYN packets:
tc filter add dev eth0 ingress protocol ip flower ip_proto tcp tcp_flags
0x02/0x3f skip_sw action drop

Signed-off-by: Sai Krishna <[email protected]>
Reviewed-by: Simon Horman <[email protected]>
Signed-off-by: David S. Miller <[email protected]>
drivers/net/ethernet/marvell/octeontx2/af/mbox.h
drivers/net/ethernet/marvell/octeontx2/af/npc.h
drivers/net/ethernet/marvell/octeontx2/af/rvu_debugfs.c
drivers/net/ethernet/marvell/octeontx2/af/rvu_npc_fs.c
drivers/net/ethernet/marvell/octeontx2/nic/otx2_tc.c

index d5c4f810da612abf238b4247242421f5c404d739..61ab7f66f053cca307f77fa94302c8453818aef6 100644 (file)
@@ -1556,6 +1556,7 @@ struct flow_msg {
        u32 mpls_lse[4];
        u8 icmp_type;
        u8 icmp_code;
+       __be16 tcp_flags;
 };
 
 struct npc_install_flow_req {
index 3e6de9d7dde3fe265f016587ae8bc9dac03043ae..d883157393ea0fa0fedb6e656788f73a90d15866 100644 (file)
@@ -217,6 +217,7 @@ enum key_fields {
        NPC_MPLS4_TTL,
        NPC_TYPE_ICMP,
        NPC_CODE_ICMP,
+       NPC_TCP_FLAGS,
        NPC_HEADER_FIELDS_MAX,
        NPC_CHAN = NPC_HEADER_FIELDS_MAX, /* Valid when Rx */
        NPC_PF_FUNC, /* Valid when Tx */
index e6d7914ce61c4e8019b8b05edb0a49d810c77eb5..2500f5ba4f5a42b43ee5de8d64d7f06fb70cdd87 100644 (file)
@@ -2870,6 +2870,10 @@ static void rvu_dbg_npc_mcam_show_flows(struct seq_file *s,
                        seq_printf(s, "%d ", ntohs(rule->packet.dport));
                        seq_printf(s, "mask 0x%x\n", ntohs(rule->mask.dport));
                        break;
+               case NPC_TCP_FLAGS:
+                       seq_printf(s, "%d ", rule->packet.tcp_flags);
+                       seq_printf(s, "mask 0x%x\n", rule->mask.tcp_flags);
+                       break;
                case NPC_IPSEC_SPI:
                        seq_printf(s, "0x%x ", ntohl(rule->packet.spi));
                        seq_printf(s, "mask 0x%x\n", ntohl(rule->mask.spi));
index c75669c8fde7108828e5a7c5101f50a3b1026f90..c181e7aa9eb67d969ecdea4e513694ac59f613e5 100644 (file)
@@ -53,6 +53,7 @@ static const char * const npc_flow_names[] = {
        [NPC_MPLS4_TTL]     = "lse depth 4",
        [NPC_TYPE_ICMP] = "icmp type",
        [NPC_CODE_ICMP] = "icmp code",
+       [NPC_TCP_FLAGS] = "tcp flags",
        [NPC_UNKNOWN]   = "unknown",
 };
 
@@ -530,6 +531,7 @@ do {                                                                               \
        NPC_SCAN_HDR(NPC_DPORT_SCTP, NPC_LID_LD, NPC_LT_LD_SCTP, 2, 2);
        NPC_SCAN_HDR(NPC_TYPE_ICMP, NPC_LID_LD, NPC_LT_LD_ICMP, 0, 1);
        NPC_SCAN_HDR(NPC_CODE_ICMP, NPC_LID_LD, NPC_LT_LD_ICMP, 1, 1);
+       NPC_SCAN_HDR(NPC_TCP_FLAGS, NPC_LID_LD, NPC_LT_LD_TCP, 12, 2);
        NPC_SCAN_HDR(NPC_ETYPE_ETHER, NPC_LID_LA, NPC_LT_LA_ETHER, 12, 2);
        NPC_SCAN_HDR(NPC_ETYPE_TAG1, NPC_LID_LB, NPC_LT_LB_CTAG, 4, 2);
        NPC_SCAN_HDR(NPC_ETYPE_TAG2, NPC_LID_LB, NPC_LT_LB_STAG_QINQ, 8, 2);
@@ -574,7 +576,8 @@ static void npc_set_features(struct rvu *rvu, int blkaddr, u8 intf)
                       BIT_ULL(NPC_DPORT_TCP) | BIT_ULL(NPC_DPORT_UDP) |
                       BIT_ULL(NPC_SPORT_SCTP) | BIT_ULL(NPC_DPORT_SCTP) |
                       BIT_ULL(NPC_SPORT_SCTP) | BIT_ULL(NPC_DPORT_SCTP) |
-                      BIT_ULL(NPC_TYPE_ICMP) | BIT_ULL(NPC_CODE_ICMP);
+                      BIT_ULL(NPC_TYPE_ICMP) | BIT_ULL(NPC_CODE_ICMP) |
+                      BIT_ULL(NPC_TCP_FLAGS);
 
        /* for tcp/udp/sctp corresponding layer type should be in the key */
        if (*features & proto_flags) {
@@ -982,7 +985,8 @@ do {                                                                              \
                       mask->icmp_type, 0);
        NPC_WRITE_FLOW(NPC_CODE_ICMP, icmp_code, pkt->icmp_code, 0,
                       mask->icmp_code, 0);
-
+       NPC_WRITE_FLOW(NPC_TCP_FLAGS, tcp_flags, ntohs(pkt->tcp_flags), 0,
+                      ntohs(mask->tcp_flags), 0);
        NPC_WRITE_FLOW(NPC_IPSEC_SPI, spi, ntohl(pkt->spi), 0,
                       ntohl(mask->spi), 0);
 
index 4fd44b6eecea63c5b6f5f5ab39d04b43945b01a8..87bdb93cb066e9afba84e5a93556c1efa0d780d9 100644 (file)
@@ -638,6 +638,7 @@ static int otx2_tc_prepare_flow(struct otx2_nic *nic, struct otx2_tc_flow *node,
              BIT(FLOW_DISSECTOR_KEY_IPSEC) |
              BIT_ULL(FLOW_DISSECTOR_KEY_MPLS) |
              BIT_ULL(FLOW_DISSECTOR_KEY_ICMP) |
+             BIT_ULL(FLOW_DISSECTOR_KEY_TCP) |
              BIT_ULL(FLOW_DISSECTOR_KEY_IP))))  {
                netdev_info(nic->netdev, "unsupported flow used key 0x%llx",
                            dissector->used_keys);
@@ -857,6 +858,16 @@ static int otx2_tc_prepare_flow(struct otx2_nic *nic, struct otx2_tc_flow *node,
                }
        }
 
+       if (flow_rule_match_key(rule, FLOW_DISSECTOR_KEY_TCP)) {
+               struct flow_match_tcp match;
+
+               flow_rule_match_tcp(rule, &match);
+
+               flow_spec->tcp_flags = match.key->flags;
+               flow_mask->tcp_flags = match.mask->flags;
+               req->features |= BIT_ULL(NPC_TCP_FLAGS);
+       }
+
        if (flow_rule_match_key(rule, FLOW_DISSECTOR_KEY_MPLS)) {
                struct flow_match_mpls match;
                u8 bit;
This page took 0.235016 seconds and 4 git commands to generate.