developer | 0aaf79d | 2023-08-21 14:10:16 +0800 | [diff] [blame] | 1 | From 72dd3b798e3a08122e9a769d6f0197b0f357478e Mon Sep 17 00:00:00 2001 |
| 2 | From: Bo-Cun Chen <bc-bocun.chen@mediatek.com> |
| 3 | Date: Wed, 23 Aug 2023 14:03:52 +0800 |
| 4 | Subject: [PATCH] 999-3019-flow-offload-add-mtkhnat-dscp |
| 5 | |
| 6 | --- |
| 7 | drivers/net/ethernet/mediatek/mtk_ppe.c | 11 +++++++ |
| 8 | drivers/net/ethernet/mediatek/mtk_ppe.h | 1 + |
| 9 | .../net/ethernet/mediatek/mtk_ppe_offload.c | 12 +++++++ |
| 10 | include/net/netfilter/nf_flow_table.h | 2 ++ |
| 11 | net/netfilter/nf_flow_table_offload.c | 7 +++- |
| 12 | net/netfilter/xt_FLOWOFFLOAD.c | 32 +++++++++++++++++++ |
| 13 | 6 files changed, 64 insertions(+), 1 deletion(-) |
| 14 | |
developer | e181c88 | 2023-03-03 17:15:06 +0800 | [diff] [blame] | 15 | diff --git a/drivers/net/ethernet/mediatek/mtk_ppe.c b/drivers/net/ethernet/mediatek/mtk_ppe.c |
developer | 0aaf79d | 2023-08-21 14:10:16 +0800 | [diff] [blame] | 16 | index 4c17a4e..2860e99 100755 |
developer | e181c88 | 2023-03-03 17:15:06 +0800 | [diff] [blame] | 17 | --- a/drivers/net/ethernet/mediatek/mtk_ppe.c |
| 18 | +++ b/drivers/net/ethernet/mediatek/mtk_ppe.c |
developer | ee39bcf | 2023-06-16 08:03:30 +0800 | [diff] [blame] | 19 | @@ -435,6 +435,17 @@ int mtk_foe_entry_set_qid(struct mtk_foe_entry *entry, int qid) |
| 20 | |
developer | e181c88 | 2023-03-03 17:15:06 +0800 | [diff] [blame] | 21 | return 0; |
| 22 | } |
developer | ee39bcf | 2023-06-16 08:03:30 +0800 | [diff] [blame] | 23 | + |
| 24 | +int mtk_foe_entry_set_dscp(struct mtk_foe_entry *entry, int dscp) |
developer | e181c88 | 2023-03-03 17:15:06 +0800 | [diff] [blame] | 25 | +{ |
developer | ee39bcf | 2023-06-16 08:03:30 +0800 | [diff] [blame] | 26 | + u32 *ib2 = mtk_foe_entry_ib2(entry); |
developer | e181c88 | 2023-03-03 17:15:06 +0800 | [diff] [blame] | 27 | + |
| 28 | + *ib2 &= ~MTK_FOE_IB2_DSCP; |
| 29 | + *ib2 |= FIELD_PREP(MTK_FOE_IB2_DSCP, dscp); |
| 30 | + |
| 31 | + return 0; |
| 32 | +} |
| 33 | + |
developer | ee39bcf | 2023-06-16 08:03:30 +0800 | [diff] [blame] | 34 | static inline bool mtk_foe_entry_usable(struct mtk_foe_entry *entry) |
developer | e181c88 | 2023-03-03 17:15:06 +0800 | [diff] [blame] | 35 | { |
developer | ee39bcf | 2023-06-16 08:03:30 +0800 | [diff] [blame] | 36 | return !(entry->ib1 & MTK_FOE_IB1_STATIC) && |
developer | e181c88 | 2023-03-03 17:15:06 +0800 | [diff] [blame] | 37 | diff --git a/drivers/net/ethernet/mediatek/mtk_ppe.h b/drivers/net/ethernet/mediatek/mtk_ppe.h |
developer | 0aaf79d | 2023-08-21 14:10:16 +0800 | [diff] [blame] | 38 | index 4abed85..57251d3 100644 |
developer | e181c88 | 2023-03-03 17:15:06 +0800 | [diff] [blame] | 39 | --- a/drivers/net/ethernet/mediatek/mtk_ppe.h |
| 40 | +++ b/drivers/net/ethernet/mediatek/mtk_ppe.h |
developer | ee39bcf | 2023-06-16 08:03:30 +0800 | [diff] [blame] | 41 | @@ -430,6 +430,7 @@ int mtk_foe_entry_set_pppoe(struct mtk_foe_entry *entry, int sid); |
| 42 | int mtk_foe_entry_set_wdma(struct mtk_foe_entry *entry, int wdma_idx, int txq, |
| 43 | int bss, int wcid); |
| 44 | int mtk_foe_entry_set_qid(struct mtk_foe_entry *entry, int qid); |
| 45 | +int mtk_foe_entry_set_dscp(struct mtk_foe_entry *entry, int dscp); |
developer | 0aaf79d | 2023-08-21 14:10:16 +0800 | [diff] [blame] | 46 | bool mtk_foe_entry_match(struct mtk_foe_entry *entry, struct mtk_foe_entry *data); |
developer | e181c88 | 2023-03-03 17:15:06 +0800 | [diff] [blame] | 47 | int mtk_foe_entry_commit(struct mtk_ppe *ppe, struct mtk_flow_entry *entry); |
| 48 | void mtk_foe_entry_clear(struct mtk_ppe *ppe, struct mtk_flow_entry *entry); |
developer | e181c88 | 2023-03-03 17:15:06 +0800 | [diff] [blame] | 49 | diff --git a/drivers/net/ethernet/mediatek/mtk_ppe_offload.c b/drivers/net/ethernet/mediatek/mtk_ppe_offload.c |
developer | 0aaf79d | 2023-08-21 14:10:16 +0800 | [diff] [blame] | 50 | index 989b412..f89875d 100644 |
developer | e181c88 | 2023-03-03 17:15:06 +0800 | [diff] [blame] | 51 | --- a/drivers/net/ethernet/mediatek/mtk_ppe_offload.c |
| 52 | +++ b/drivers/net/ethernet/mediatek/mtk_ppe_offload.c |
developer | 0aaf79d | 2023-08-21 14:10:16 +0800 | [diff] [blame] | 53 | @@ -262,6 +262,7 @@ mtk_flow_offload_replace(struct mtk_eth *eth, struct flow_cls_offload *f) |
developer | e181c88 | 2023-03-03 17:15:06 +0800 | [diff] [blame] | 54 | int wed_index = -1; |
| 55 | u16 addr_type = 0; |
| 56 | u8 l4proto = 0; |
| 57 | + u8 dscp = 0; |
| 58 | int err = 0; |
| 59 | int i; |
| 60 | |
developer | 0aaf79d | 2023-08-21 14:10:16 +0800 | [diff] [blame] | 61 | @@ -298,6 +299,15 @@ mtk_flow_offload_replace(struct mtk_eth *eth, struct flow_cls_offload *f) |
developer | e181c88 | 2023-03-03 17:15:06 +0800 | [diff] [blame] | 62 | return -EOPNOTSUPP; |
| 63 | } |
| 64 | |
| 65 | + if (flow_rule_match_key(rule, FLOW_DISSECTOR_KEY_IP)) { |
| 66 | + struct flow_match_ip match; |
| 67 | + |
| 68 | + flow_rule_match_ip(rule, &match); |
| 69 | + dscp = match.key->tos; |
| 70 | + } else { |
| 71 | + return -EOPNOTSUPP; |
| 72 | + } |
| 73 | + |
| 74 | switch (addr_type) { |
| 75 | case 0: |
| 76 | offload_type = MTK_PPE_PKT_TYPE_BRIDGE; |
developer | 0aaf79d | 2023-08-21 14:10:16 +0800 | [diff] [blame] | 77 | @@ -471,6 +481,8 @@ mtk_flow_offload_replace(struct mtk_eth *eth, struct flow_cls_offload *f) |
developer | e181c88 | 2023-03-03 17:15:06 +0800 | [diff] [blame] | 78 | if (data.pppoe.num == 1) |
developer | ee39bcf | 2023-06-16 08:03:30 +0800 | [diff] [blame] | 79 | mtk_foe_entry_set_pppoe(&foe, data.pppoe.sid); |
developer | e181c88 | 2023-03-03 17:15:06 +0800 | [diff] [blame] | 80 | |
developer | ee39bcf | 2023-06-16 08:03:30 +0800 | [diff] [blame] | 81 | + mtk_foe_entry_set_dscp(&foe, dscp); |
developer | e181c88 | 2023-03-03 17:15:06 +0800 | [diff] [blame] | 82 | + |
developer | 0aaf79d | 2023-08-21 14:10:16 +0800 | [diff] [blame] | 83 | mtk_foe_entry_set_sp(eth->ppe[ppe_index], &foe); |
| 84 | |
developer | e181c88 | 2023-03-03 17:15:06 +0800 | [diff] [blame] | 85 | err = mtk_flow_set_output_device(eth, &foe, odev, f->flow->ct, data.eth.h_dest, |
developer | e181c88 | 2023-03-03 17:15:06 +0800 | [diff] [blame] | 86 | diff --git a/include/net/netfilter/nf_flow_table.h b/include/net/netfilter/nf_flow_table.h |
developer | 0aaf79d | 2023-08-21 14:10:16 +0800 | [diff] [blame] | 87 | index feac793..97a277d 100644 |
developer | e181c88 | 2023-03-03 17:15:06 +0800 | [diff] [blame] | 88 | --- a/include/net/netfilter/nf_flow_table.h |
| 89 | +++ b/include/net/netfilter/nf_flow_table.h |
| 90 | @@ -36,6 +36,7 @@ struct nf_flow_key { |
| 91 | }; |
| 92 | struct flow_dissector_key_tcp tcp; |
| 93 | struct flow_dissector_key_ports tp; |
| 94 | + struct flow_dissector_key_ip ip; |
| 95 | } __aligned(BITS_PER_LONG / 8); /* Ensure that we can do comparisons as longs. */ |
| 96 | |
| 97 | struct nf_flow_match { |
| 98 | @@ -145,6 +146,7 @@ struct flow_offload_tuple { |
| 99 | u8 h_dest[ETH_ALEN]; |
| 100 | } out; |
| 101 | }; |
| 102 | + u8 tos; |
| 103 | }; |
| 104 | |
| 105 | struct flow_offload_tuple_rhash { |
| 106 | diff --git a/net/netfilter/nf_flow_table_offload.c b/net/netfilter/nf_flow_table_offload.c |
developer | 0aaf79d | 2023-08-21 14:10:16 +0800 | [diff] [blame] | 107 | index ba34572..b8b2fa6 100644 |
developer | e181c88 | 2023-03-03 17:15:06 +0800 | [diff] [blame] | 108 | --- a/net/netfilter/nf_flow_table_offload.c |
| 109 | +++ b/net/netfilter/nf_flow_table_offload.c |
| 110 | @@ -104,6 +104,7 @@ static int nf_flow_rule_match(struct nf_flow_match *match, |
| 111 | NF_FLOW_DISSECTOR(match, FLOW_DISSECTOR_KEY_IPV6_ADDRS, ipv6); |
| 112 | NF_FLOW_DISSECTOR(match, FLOW_DISSECTOR_KEY_TCP, tcp); |
| 113 | NF_FLOW_DISSECTOR(match, FLOW_DISSECTOR_KEY_PORTS, tp); |
| 114 | + NF_FLOW_DISSECTOR(match, FLOW_DISSECTOR_KEY_IP, ip); |
| 115 | |
| 116 | if (other_dst && other_dst->lwtstate) { |
| 117 | tun_info = lwt_tun_info(other_dst->lwtstate); |
| 118 | @@ -183,10 +184,14 @@ static int nf_flow_rule_match(struct nf_flow_match *match, |
| 119 | key->tp.dst = tuple->dst_port; |
| 120 | mask->tp.dst = 0xffff; |
| 121 | |
| 122 | + key->ip.tos = tuple->tos; |
| 123 | + mask->ip.tos = 0xff; |
| 124 | + |
| 125 | match->dissector.used_keys |= BIT(FLOW_DISSECTOR_KEY_META) | |
| 126 | BIT(FLOW_DISSECTOR_KEY_CONTROL) | |
| 127 | BIT(FLOW_DISSECTOR_KEY_BASIC) | |
| 128 | - BIT(FLOW_DISSECTOR_KEY_PORTS); |
| 129 | + BIT(FLOW_DISSECTOR_KEY_PORTS) | |
| 130 | + BIT(FLOW_DISSECTOR_KEY_IP); |
| 131 | return 0; |
| 132 | } |
| 133 | |
| 134 | diff --git a/net/netfilter/xt_FLOWOFFLOAD.c b/net/netfilter/xt_FLOWOFFLOAD.c |
developer | 0aaf79d | 2023-08-21 14:10:16 +0800 | [diff] [blame] | 135 | index 1defb15..d4aecab 100644 |
developer | e181c88 | 2023-03-03 17:15:06 +0800 | [diff] [blame] | 136 | --- a/net/netfilter/xt_FLOWOFFLOAD.c |
| 137 | +++ b/net/netfilter/xt_FLOWOFFLOAD.c |
| 138 | @@ -49,6 +49,35 @@ static DEFINE_SPINLOCK(hooks_lock); |
| 139 | |
| 140 | struct xt_flowoffload_table flowtable[2]; |
| 141 | |
| 142 | +static int |
| 143 | +xt_flowoffload_dscp_init(struct sk_buff *skb, struct flow_offload *flow, |
| 144 | + enum ip_conntrack_dir dir) |
| 145 | +{ |
| 146 | + const struct flow_offload_tuple *flow_tuple = &flow->tuplehash[dir].tuple; |
| 147 | + struct iphdr *iph; |
| 148 | + struct ipv6hdr *ip6h; |
| 149 | + u32 offset = 0; |
| 150 | + u8 tos = 0; |
| 151 | + |
| 152 | + switch (flow_tuple->l3proto) { |
| 153 | + case NFPROTO_IPV4: |
| 154 | + iph = (struct iphdr *)(skb_network_header(skb) + offset); |
| 155 | + tos = iph->tos; |
| 156 | + break; |
| 157 | + case NFPROTO_IPV6: |
| 158 | + ip6h = (struct ipv6hdr *)(skb_network_header(skb) + offset); |
| 159 | + tos = ipv6_get_dsfield(ip6h); |
| 160 | + break; |
| 161 | + default: |
| 162 | + return -1; |
| 163 | + }; |
| 164 | + |
| 165 | + flow->tuplehash[dir].tuple.tos = tos; |
| 166 | + flow->tuplehash[!dir].tuple.tos = tos; |
| 167 | + |
| 168 | + return 0; |
| 169 | +} |
| 170 | + |
| 171 | static unsigned int |
| 172 | xt_flowoffload_net_hook(void *priv, struct sk_buff *skb, |
| 173 | const struct nf_hook_state *state) |
developer | 0aaf79d | 2023-08-21 14:10:16 +0800 | [diff] [blame] | 174 | @@ -617,6 +646,9 @@ flowoffload_tg(struct sk_buff *skb, const struct xt_action_param *par) |
developer | e181c88 | 2023-03-03 17:15:06 +0800 | [diff] [blame] | 175 | if (flow_offload_route_init(flow, &route) < 0) |
| 176 | goto err_flow_add; |
| 177 | |
| 178 | + if (xt_flowoffload_dscp_init(skb, flow, dir) < 0) |
| 179 | + goto err_flow_add; |
| 180 | + |
| 181 | if (tcph) { |
| 182 | ct->proto.tcp.seen[0].flags |= IP_CT_TCP_FLAG_BE_LIBERAL; |
| 183 | ct->proto.tcp.seen[1].flags |= IP_CT_TCP_FLAG_BE_LIBERAL; |
developer | 0aaf79d | 2023-08-21 14:10:16 +0800 | [diff] [blame] | 184 | -- |
| 185 | 2.18.0 |
| 186 | |