cls_flower.c (2ea352d5960ad469f5712cf3e293db97beac4e01) cls_flower.c (8ffb055beae58574d3e77b4bf9d4d15eace1ca27)
1// SPDX-License-Identifier: GPL-2.0-or-later
2/*
3 * net/sched/cls_flower.c Flower classifier
4 *
5 * Copyright (c) 2015 Jiri Pirko <jiri@resnulli.us>
6 */
7
8#include <linux/kernel.h>

--- 42 unchanged lines hidden (view full) ---

51 struct flow_dissector_key_ipv6_addrs enc_ipv6;
52 };
53 struct flow_dissector_key_ports enc_tp;
54 struct flow_dissector_key_mpls mpls;
55 struct flow_dissector_key_tcp tcp;
56 struct flow_dissector_key_ip ip;
57 struct flow_dissector_key_ip enc_ip;
58 struct flow_dissector_key_enc_opts enc_opts;
1// SPDX-License-Identifier: GPL-2.0-or-later
2/*
3 * net/sched/cls_flower.c Flower classifier
4 *
5 * Copyright (c) 2015 Jiri Pirko <jiri@resnulli.us>
6 */
7
8#include <linux/kernel.h>

--- 42 unchanged lines hidden (view full) ---

51 struct flow_dissector_key_ipv6_addrs enc_ipv6;
52 };
53 struct flow_dissector_key_ports enc_tp;
54 struct flow_dissector_key_mpls mpls;
55 struct flow_dissector_key_tcp tcp;
56 struct flow_dissector_key_ip ip;
57 struct flow_dissector_key_ip enc_ip;
58 struct flow_dissector_key_enc_opts enc_opts;
59 struct flow_dissector_key_ports tp_min;
60 struct flow_dissector_key_ports tp_max;
59 union {
60 struct flow_dissector_key_ports tp;
61 struct {
62 struct flow_dissector_key_ports tp_min;
63 struct flow_dissector_key_ports tp_max;
64 };
65 } tp_range;
61 struct flow_dissector_key_ct ct;
62} __aligned(BITS_PER_LONG / 8); /* Ensure that we can do comparisons as longs. */
63
64struct fl_flow_mask_range {
65 unsigned short int start;
66 unsigned short int end;
67};
68

--- 126 unchanged lines hidden (view full) ---

195}
196
197static bool fl_range_port_dst_cmp(struct cls_fl_filter *filter,
198 struct fl_flow_key *key,
199 struct fl_flow_key *mkey)
200{
201 __be16 min_mask, max_mask, min_val, max_val;
202
66 struct flow_dissector_key_ct ct;
67} __aligned(BITS_PER_LONG / 8); /* Ensure that we can do comparisons as longs. */
68
69struct fl_flow_mask_range {
70 unsigned short int start;
71 unsigned short int end;
72};
73

--- 126 unchanged lines hidden (view full) ---

200}
201
202static bool fl_range_port_dst_cmp(struct cls_fl_filter *filter,
203 struct fl_flow_key *key,
204 struct fl_flow_key *mkey)
205{
206 __be16 min_mask, max_mask, min_val, max_val;
207
203 min_mask = htons(filter->mask->key.tp_min.dst);
204 max_mask = htons(filter->mask->key.tp_max.dst);
205 min_val = htons(filter->key.tp_min.dst);
206 max_val = htons(filter->key.tp_max.dst);
208 min_mask = htons(filter->mask->key.tp_range.tp_min.dst);
209 max_mask = htons(filter->mask->key.tp_range.tp_max.dst);
210 min_val = htons(filter->key.tp_range.tp_min.dst);
211 max_val = htons(filter->key.tp_range.tp_max.dst);
207
208 if (min_mask && max_mask) {
212
213 if (min_mask && max_mask) {
209 if (htons(key->tp.dst) < min_val ||
210 htons(key->tp.dst) > max_val)
214 if (htons(key->tp_range.tp.dst) < min_val ||
215 htons(key->tp_range.tp.dst) > max_val)
211 return false;
212
213 /* skb does not have min and max values */
216 return false;
217
218 /* skb does not have min and max values */
214 mkey->tp_min.dst = filter->mkey.tp_min.dst;
215 mkey->tp_max.dst = filter->mkey.tp_max.dst;
219 mkey->tp_range.tp_min.dst = filter->mkey.tp_range.tp_min.dst;
220 mkey->tp_range.tp_max.dst = filter->mkey.tp_range.tp_max.dst;
216 }
217 return true;
218}
219
220static bool fl_range_port_src_cmp(struct cls_fl_filter *filter,
221 struct fl_flow_key *key,
222 struct fl_flow_key *mkey)
223{
224 __be16 min_mask, max_mask, min_val, max_val;
225
221 }
222 return true;
223}
224
225static bool fl_range_port_src_cmp(struct cls_fl_filter *filter,
226 struct fl_flow_key *key,
227 struct fl_flow_key *mkey)
228{
229 __be16 min_mask, max_mask, min_val, max_val;
230
226 min_mask = htons(filter->mask->key.tp_min.src);
227 max_mask = htons(filter->mask->key.tp_max.src);
228 min_val = htons(filter->key.tp_min.src);
229 max_val = htons(filter->key.tp_max.src);
231 min_mask = htons(filter->mask->key.tp_range.tp_min.src);
232 max_mask = htons(filter->mask->key.tp_range.tp_max.src);
233 min_val = htons(filter->key.tp_range.tp_min.src);
234 max_val = htons(filter->key.tp_range.tp_max.src);
230
231 if (min_mask && max_mask) {
235
236 if (min_mask && max_mask) {
232 if (htons(key->tp.src) < min_val ||
233 htons(key->tp.src) > max_val)
237 if (htons(key->tp_range.tp.src) < min_val ||
238 htons(key->tp_range.tp.src) > max_val)
234 return false;
235
236 /* skb does not have min and max values */
239 return false;
240
241 /* skb does not have min and max values */
237 mkey->tp_min.src = filter->mkey.tp_min.src;
238 mkey->tp_max.src = filter->mkey.tp_max.src;
242 mkey->tp_range.tp_min.src = filter->mkey.tp_range.tp_min.src;
243 mkey->tp_range.tp_max.src = filter->mkey.tp_range.tp_max.src;
239 }
240 return true;
241}
242
243static struct cls_fl_filter *__fl_lookup(struct fl_flow_mask *mask,
244 struct fl_flow_key *mkey)
245{
246 return rhashtable_lookup_fast(&mask->ht, fl_key_get_start(mkey, mask),

--- 482 unchanged lines hidden (view full) ---

729 memset(mask, 0xff, len);
730 else
731 nla_memcpy(mask, tb[mask_type], len);
732}
733
734static int fl_set_key_port_range(struct nlattr **tb, struct fl_flow_key *key,
735 struct fl_flow_key *mask)
736{
244 }
245 return true;
246}
247
248static struct cls_fl_filter *__fl_lookup(struct fl_flow_mask *mask,
249 struct fl_flow_key *mkey)
250{
251 return rhashtable_lookup_fast(&mask->ht, fl_key_get_start(mkey, mask),

--- 482 unchanged lines hidden (view full) ---

734 memset(mask, 0xff, len);
735 else
736 nla_memcpy(mask, tb[mask_type], len);
737}
738
739static int fl_set_key_port_range(struct nlattr **tb, struct fl_flow_key *key,
740 struct fl_flow_key *mask)
741{
737 fl_set_key_val(tb, &key->tp_min.dst,
738 TCA_FLOWER_KEY_PORT_DST_MIN, &mask->tp_min.dst,
739 TCA_FLOWER_UNSPEC, sizeof(key->tp_min.dst));
740 fl_set_key_val(tb, &key->tp_max.dst,
741 TCA_FLOWER_KEY_PORT_DST_MAX, &mask->tp_max.dst,
742 TCA_FLOWER_UNSPEC, sizeof(key->tp_max.dst));
743 fl_set_key_val(tb, &key->tp_min.src,
744 TCA_FLOWER_KEY_PORT_SRC_MIN, &mask->tp_min.src,
745 TCA_FLOWER_UNSPEC, sizeof(key->tp_min.src));
746 fl_set_key_val(tb, &key->tp_max.src,
747 TCA_FLOWER_KEY_PORT_SRC_MAX, &mask->tp_max.src,
748 TCA_FLOWER_UNSPEC, sizeof(key->tp_max.src));
742 fl_set_key_val(tb, &key->tp_range.tp_min.dst,
743 TCA_FLOWER_KEY_PORT_DST_MIN, &mask->tp_range.tp_min.dst,
744 TCA_FLOWER_UNSPEC, sizeof(key->tp_range.tp_min.dst));
745 fl_set_key_val(tb, &key->tp_range.tp_max.dst,
746 TCA_FLOWER_KEY_PORT_DST_MAX, &mask->tp_range.tp_max.dst,
747 TCA_FLOWER_UNSPEC, sizeof(key->tp_range.tp_max.dst));
748 fl_set_key_val(tb, &key->tp_range.tp_min.src,
749 TCA_FLOWER_KEY_PORT_SRC_MIN, &mask->tp_range.tp_min.src,
750 TCA_FLOWER_UNSPEC, sizeof(key->tp_range.tp_min.src));
751 fl_set_key_val(tb, &key->tp_range.tp_max.src,
752 TCA_FLOWER_KEY_PORT_SRC_MAX, &mask->tp_range.tp_max.src,
753 TCA_FLOWER_UNSPEC, sizeof(key->tp_range.tp_max.src));
749
754
750 if ((mask->tp_min.dst && mask->tp_max.dst &&
751 htons(key->tp_max.dst) <= htons(key->tp_min.dst)) ||
752 (mask->tp_min.src && mask->tp_max.src &&
753 htons(key->tp_max.src) <= htons(key->tp_min.src)))
755 if ((mask->tp_range.tp_min.dst && mask->tp_range.tp_max.dst &&
756 htons(key->tp_range.tp_max.dst) <=
757 htons(key->tp_range.tp_min.dst)) ||
758 (mask->tp_range.tp_min.src && mask->tp_range.tp_max.src &&
759 htons(key->tp_range.tp_max.src) <=
760 htons(key->tp_range.tp_min.src)))
754 return -EINVAL;
755
756 return 0;
757}
758
759static int fl_set_key_mpls(struct nlattr **tb,
760 struct flow_dissector_key_mpls *key_val,
761 struct flow_dissector_key_mpls *key_mask)

--- 742 unchanged lines hidden (view full) ---

1504 FL_KEY_SET(keys, cnt, FLOW_DISSECTOR_KEY_CONTROL, control);
1505 FL_KEY_SET(keys, cnt, FLOW_DISSECTOR_KEY_BASIC, basic);
1506 FL_KEY_SET_IF_MASKED(mask, keys, cnt,
1507 FLOW_DISSECTOR_KEY_ETH_ADDRS, eth);
1508 FL_KEY_SET_IF_MASKED(mask, keys, cnt,
1509 FLOW_DISSECTOR_KEY_IPV4_ADDRS, ipv4);
1510 FL_KEY_SET_IF_MASKED(mask, keys, cnt,
1511 FLOW_DISSECTOR_KEY_IPV6_ADDRS, ipv6);
761 return -EINVAL;
762
763 return 0;
764}
765
766static int fl_set_key_mpls(struct nlattr **tb,
767 struct flow_dissector_key_mpls *key_val,
768 struct flow_dissector_key_mpls *key_mask)

--- 742 unchanged lines hidden (view full) ---

1511 FL_KEY_SET(keys, cnt, FLOW_DISSECTOR_KEY_CONTROL, control);
1512 FL_KEY_SET(keys, cnt, FLOW_DISSECTOR_KEY_BASIC, basic);
1513 FL_KEY_SET_IF_MASKED(mask, keys, cnt,
1514 FLOW_DISSECTOR_KEY_ETH_ADDRS, eth);
1515 FL_KEY_SET_IF_MASKED(mask, keys, cnt,
1516 FLOW_DISSECTOR_KEY_IPV4_ADDRS, ipv4);
1517 FL_KEY_SET_IF_MASKED(mask, keys, cnt,
1518 FLOW_DISSECTOR_KEY_IPV6_ADDRS, ipv6);
1512 if (FL_KEY_IS_MASKED(mask, tp) ||
1513 FL_KEY_IS_MASKED(mask, tp_min) || FL_KEY_IS_MASKED(mask, tp_max))
1514 FL_KEY_SET(keys, cnt, FLOW_DISSECTOR_KEY_PORTS, tp);
1515 FL_KEY_SET_IF_MASKED(mask, keys, cnt,
1519 FL_KEY_SET_IF_MASKED(mask, keys, cnt,
1520 FLOW_DISSECTOR_KEY_PORTS, tp);
1521 FL_KEY_SET_IF_MASKED(mask, keys, cnt,
1522 FLOW_DISSECTOR_KEY_PORTS_RANGE, tp_range);
1523 FL_KEY_SET_IF_MASKED(mask, keys, cnt,
1516 FLOW_DISSECTOR_KEY_IP, ip);
1517 FL_KEY_SET_IF_MASKED(mask, keys, cnt,
1518 FLOW_DISSECTOR_KEY_TCP, tcp);
1519 FL_KEY_SET_IF_MASKED(mask, keys, cnt,
1520 FLOW_DISSECTOR_KEY_ICMP, icmp);
1521 FL_KEY_SET_IF_MASKED(mask, keys, cnt,
1522 FLOW_DISSECTOR_KEY_ARP, arp);
1523 FL_KEY_SET_IF_MASKED(mask, keys, cnt,

--- 31 unchanged lines hidden (view full) ---

1555 int err;
1556
1557 newmask = kzalloc(sizeof(*newmask), GFP_KERNEL);
1558 if (!newmask)
1559 return ERR_PTR(-ENOMEM);
1560
1561 fl_mask_copy(newmask, mask);
1562
1524 FLOW_DISSECTOR_KEY_IP, ip);
1525 FL_KEY_SET_IF_MASKED(mask, keys, cnt,
1526 FLOW_DISSECTOR_KEY_TCP, tcp);
1527 FL_KEY_SET_IF_MASKED(mask, keys, cnt,
1528 FLOW_DISSECTOR_KEY_ICMP, icmp);
1529 FL_KEY_SET_IF_MASKED(mask, keys, cnt,
1530 FLOW_DISSECTOR_KEY_ARP, arp);
1531 FL_KEY_SET_IF_MASKED(mask, keys, cnt,

--- 31 unchanged lines hidden (view full) ---

1563 int err;
1564
1565 newmask = kzalloc(sizeof(*newmask), GFP_KERNEL);
1566 if (!newmask)
1567 return ERR_PTR(-ENOMEM);
1568
1569 fl_mask_copy(newmask, mask);
1570
1563 if ((newmask->key.tp_min.dst && newmask->key.tp_max.dst) ||
1564 (newmask->key.tp_min.src && newmask->key.tp_max.src))
1571 if ((newmask->key.tp_range.tp_min.dst &&
1572 newmask->key.tp_range.tp_max.dst) ||
1573 (newmask->key.tp_range.tp_min.src &&
1574 newmask->key.tp_range.tp_max.src))
1565 newmask->flags |= TCA_FLOWER_MASK_FLAGS_RANGE;
1566
1567 err = fl_init_mask_hashtable(newmask);
1568 if (err)
1569 goto errout_free;
1570
1571 fl_init_dissector(&newmask->dissector, &newmask->key);
1572

--- 581 unchanged lines hidden (view full) ---

2154 return err;
2155 }
2156 return 0;
2157}
2158
2159static int fl_dump_key_port_range(struct sk_buff *skb, struct fl_flow_key *key,
2160 struct fl_flow_key *mask)
2161{
1575 newmask->flags |= TCA_FLOWER_MASK_FLAGS_RANGE;
1576
1577 err = fl_init_mask_hashtable(newmask);
1578 if (err)
1579 goto errout_free;
1580
1581 fl_init_dissector(&newmask->dissector, &newmask->key);
1582

--- 581 unchanged lines hidden (view full) ---

2164 return err;
2165 }
2166 return 0;
2167}
2168
2169static int fl_dump_key_port_range(struct sk_buff *skb, struct fl_flow_key *key,
2170 struct fl_flow_key *mask)
2171{
2162 if (fl_dump_key_val(skb, &key->tp_min.dst, TCA_FLOWER_KEY_PORT_DST_MIN,
2163 &mask->tp_min.dst, TCA_FLOWER_UNSPEC,
2164 sizeof(key->tp_min.dst)) ||
2165 fl_dump_key_val(skb, &key->tp_max.dst, TCA_FLOWER_KEY_PORT_DST_MAX,
2166 &mask->tp_max.dst, TCA_FLOWER_UNSPEC,
2167 sizeof(key->tp_max.dst)) ||
2168 fl_dump_key_val(skb, &key->tp_min.src, TCA_FLOWER_KEY_PORT_SRC_MIN,
2169 &mask->tp_min.src, TCA_FLOWER_UNSPEC,
2170 sizeof(key->tp_min.src)) ||
2171 fl_dump_key_val(skb, &key->tp_max.src, TCA_FLOWER_KEY_PORT_SRC_MAX,
2172 &mask->tp_max.src, TCA_FLOWER_UNSPEC,
2173 sizeof(key->tp_max.src)))
2172 if (fl_dump_key_val(skb, &key->tp_range.tp_min.dst,
2173 TCA_FLOWER_KEY_PORT_DST_MIN,
2174 &mask->tp_range.tp_min.dst, TCA_FLOWER_UNSPEC,
2175 sizeof(key->tp_range.tp_min.dst)) ||
2176 fl_dump_key_val(skb, &key->tp_range.tp_max.dst,
2177 TCA_FLOWER_KEY_PORT_DST_MAX,
2178 &mask->tp_range.tp_max.dst, TCA_FLOWER_UNSPEC,
2179 sizeof(key->tp_range.tp_max.dst)) ||
2180 fl_dump_key_val(skb, &key->tp_range.tp_min.src,
2181 TCA_FLOWER_KEY_PORT_SRC_MIN,
2182 &mask->tp_range.tp_min.src, TCA_FLOWER_UNSPEC,
2183 sizeof(key->tp_range.tp_min.src)) ||
2184 fl_dump_key_val(skb, &key->tp_range.tp_max.src,
2185 TCA_FLOWER_KEY_PORT_SRC_MAX,
2186 &mask->tp_range.tp_max.src, TCA_FLOWER_UNSPEC,
2187 sizeof(key->tp_range.tp_max.src)))
2174 return -1;
2175
2176 return 0;
2177}
2178
2179static int fl_dump_key_mpls(struct sk_buff *skb,
2180 struct flow_dissector_key_mpls *mpls_key,
2181 struct flow_dissector_key_mpls *mpls_mask)

--- 618 unchanged lines hidden ---
2188 return -1;
2189
2190 return 0;
2191}
2192
2193static int fl_dump_key_mpls(struct sk_buff *skb,
2194 struct flow_dissector_key_mpls *mpls_key,
2195 struct flow_dissector_key_mpls *mpls_mask)

--- 618 unchanged lines hidden ---