blob: a43261aad089bb88721dc57a791c69c902106d80 [file] [log] [blame]
developer0aaf79d2023-08-21 14:10:16 +08001From 72dd3b798e3a08122e9a769d6f0197b0f357478e Mon Sep 17 00:00:00 2001
2From: Bo-Cun Chen <bc-bocun.chen@mediatek.com>
3Date: Wed, 23 Aug 2023 14:03:52 +0800
4Subject: [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
developere181c882023-03-03 17:15:06 +080015diff --git a/drivers/net/ethernet/mediatek/mtk_ppe.c b/drivers/net/ethernet/mediatek/mtk_ppe.c
developer0aaf79d2023-08-21 14:10:16 +080016index 4c17a4e..2860e99 100755
developere181c882023-03-03 17:15:06 +080017--- a/drivers/net/ethernet/mediatek/mtk_ppe.c
18+++ b/drivers/net/ethernet/mediatek/mtk_ppe.c
developeree39bcf2023-06-16 08:03:30 +080019@@ -435,6 +435,17 @@ int mtk_foe_entry_set_qid(struct mtk_foe_entry *entry, int qid)
20
developere181c882023-03-03 17:15:06 +080021 return 0;
22 }
developeree39bcf2023-06-16 08:03:30 +080023+
24+int mtk_foe_entry_set_dscp(struct mtk_foe_entry *entry, int dscp)
developere181c882023-03-03 17:15:06 +080025+{
developeree39bcf2023-06-16 08:03:30 +080026+ u32 *ib2 = mtk_foe_entry_ib2(entry);
developere181c882023-03-03 17:15:06 +080027+
28+ *ib2 &= ~MTK_FOE_IB2_DSCP;
29+ *ib2 |= FIELD_PREP(MTK_FOE_IB2_DSCP, dscp);
30+
31+ return 0;
32+}
33+
developeree39bcf2023-06-16 08:03:30 +080034 static inline bool mtk_foe_entry_usable(struct mtk_foe_entry *entry)
developere181c882023-03-03 17:15:06 +080035 {
developeree39bcf2023-06-16 08:03:30 +080036 return !(entry->ib1 & MTK_FOE_IB1_STATIC) &&
developere181c882023-03-03 17:15:06 +080037diff --git a/drivers/net/ethernet/mediatek/mtk_ppe.h b/drivers/net/ethernet/mediatek/mtk_ppe.h
developer0aaf79d2023-08-21 14:10:16 +080038index 4abed85..57251d3 100644
developere181c882023-03-03 17:15:06 +080039--- a/drivers/net/ethernet/mediatek/mtk_ppe.h
40+++ b/drivers/net/ethernet/mediatek/mtk_ppe.h
developeree39bcf2023-06-16 08:03:30 +080041@@ -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);
developer0aaf79d2023-08-21 14:10:16 +080046 bool mtk_foe_entry_match(struct mtk_foe_entry *entry, struct mtk_foe_entry *data);
developere181c882023-03-03 17:15:06 +080047 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);
developere181c882023-03-03 17:15:06 +080049diff --git a/drivers/net/ethernet/mediatek/mtk_ppe_offload.c b/drivers/net/ethernet/mediatek/mtk_ppe_offload.c
developer0aaf79d2023-08-21 14:10:16 +080050index 989b412..f89875d 100644
developere181c882023-03-03 17:15:06 +080051--- a/drivers/net/ethernet/mediatek/mtk_ppe_offload.c
52+++ b/drivers/net/ethernet/mediatek/mtk_ppe_offload.c
developer0aaf79d2023-08-21 14:10:16 +080053@@ -262,6 +262,7 @@ mtk_flow_offload_replace(struct mtk_eth *eth, struct flow_cls_offload *f)
developere181c882023-03-03 17:15:06 +080054 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
developer0aaf79d2023-08-21 14:10:16 +080061@@ -298,6 +299,15 @@ mtk_flow_offload_replace(struct mtk_eth *eth, struct flow_cls_offload *f)
developere181c882023-03-03 17:15:06 +080062 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;
developer0aaf79d2023-08-21 14:10:16 +080077@@ -471,6 +481,8 @@ mtk_flow_offload_replace(struct mtk_eth *eth, struct flow_cls_offload *f)
developere181c882023-03-03 17:15:06 +080078 if (data.pppoe.num == 1)
developeree39bcf2023-06-16 08:03:30 +080079 mtk_foe_entry_set_pppoe(&foe, data.pppoe.sid);
developere181c882023-03-03 17:15:06 +080080
developeree39bcf2023-06-16 08:03:30 +080081+ mtk_foe_entry_set_dscp(&foe, dscp);
developere181c882023-03-03 17:15:06 +080082+
developer0aaf79d2023-08-21 14:10:16 +080083 mtk_foe_entry_set_sp(eth->ppe[ppe_index], &foe);
84
developere181c882023-03-03 17:15:06 +080085 err = mtk_flow_set_output_device(eth, &foe, odev, f->flow->ct, data.eth.h_dest,
developere181c882023-03-03 17:15:06 +080086diff --git a/include/net/netfilter/nf_flow_table.h b/include/net/netfilter/nf_flow_table.h
developer0aaf79d2023-08-21 14:10:16 +080087index feac793..97a277d 100644
developere181c882023-03-03 17:15:06 +080088--- 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 {
106diff --git a/net/netfilter/nf_flow_table_offload.c b/net/netfilter/nf_flow_table_offload.c
developer0aaf79d2023-08-21 14:10:16 +0800107index ba34572..b8b2fa6 100644
developere181c882023-03-03 17:15:06 +0800108--- 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
134diff --git a/net/netfilter/xt_FLOWOFFLOAD.c b/net/netfilter/xt_FLOWOFFLOAD.c
developer0aaf79d2023-08-21 14:10:16 +0800135index 1defb15..d4aecab 100644
developere181c882023-03-03 17:15:06 +0800136--- 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)
developer0aaf79d2023-08-21 14:10:16 +0800174@@ -617,6 +646,9 @@ flowoffload_tg(struct sk_buff *skb, const struct xt_action_param *par)
developere181c882023-03-03 17:15:06 +0800175 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;
developer0aaf79d2023-08-21 14:10:16 +0800184--
1852.18.0
186