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 --- |