at v5.1-rc5 153 lines 4.5 kB view raw
1/* SPDX-License-Identifier: GPL-2.0 */ 2#include <linux/kernel.h> 3#include <linux/slab.h> 4#include <net/flow_offload.h> 5 6struct flow_rule *flow_rule_alloc(unsigned int num_actions) 7{ 8 struct flow_rule *rule; 9 10 rule = kzalloc(sizeof(struct flow_rule) + 11 sizeof(struct flow_action_entry) * num_actions, 12 GFP_KERNEL); 13 if (!rule) 14 return NULL; 15 16 rule->action.num_entries = num_actions; 17 18 return rule; 19} 20EXPORT_SYMBOL(flow_rule_alloc); 21 22#define FLOW_DISSECTOR_MATCH(__rule, __type, __out) \ 23 const struct flow_match *__m = &(__rule)->match; \ 24 struct flow_dissector *__d = (__m)->dissector; \ 25 \ 26 (__out)->key = skb_flow_dissector_target(__d, __type, (__m)->key); \ 27 (__out)->mask = skb_flow_dissector_target(__d, __type, (__m)->mask); \ 28 29void flow_rule_match_basic(const struct flow_rule *rule, 30 struct flow_match_basic *out) 31{ 32 FLOW_DISSECTOR_MATCH(rule, FLOW_DISSECTOR_KEY_BASIC, out); 33} 34EXPORT_SYMBOL(flow_rule_match_basic); 35 36void flow_rule_match_control(const struct flow_rule *rule, 37 struct flow_match_control *out) 38{ 39 FLOW_DISSECTOR_MATCH(rule, FLOW_DISSECTOR_KEY_CONTROL, out); 40} 41EXPORT_SYMBOL(flow_rule_match_control); 42 43void flow_rule_match_eth_addrs(const struct flow_rule *rule, 44 struct flow_match_eth_addrs *out) 45{ 46 FLOW_DISSECTOR_MATCH(rule, FLOW_DISSECTOR_KEY_ETH_ADDRS, out); 47} 48EXPORT_SYMBOL(flow_rule_match_eth_addrs); 49 50void flow_rule_match_vlan(const struct flow_rule *rule, 51 struct flow_match_vlan *out) 52{ 53 FLOW_DISSECTOR_MATCH(rule, FLOW_DISSECTOR_KEY_VLAN, out); 54} 55EXPORT_SYMBOL(flow_rule_match_vlan); 56 57void flow_rule_match_ipv4_addrs(const struct flow_rule *rule, 58 struct flow_match_ipv4_addrs *out) 59{ 60 FLOW_DISSECTOR_MATCH(rule, FLOW_DISSECTOR_KEY_IPV4_ADDRS, out); 61} 62EXPORT_SYMBOL(flow_rule_match_ipv4_addrs); 63 64void flow_rule_match_ipv6_addrs(const struct flow_rule *rule, 65 struct flow_match_ipv6_addrs *out) 66{ 67 FLOW_DISSECTOR_MATCH(rule, FLOW_DISSECTOR_KEY_IPV6_ADDRS, out); 68} 69EXPORT_SYMBOL(flow_rule_match_ipv6_addrs); 70 71void flow_rule_match_ip(const struct flow_rule *rule, 72 struct flow_match_ip *out) 73{ 74 FLOW_DISSECTOR_MATCH(rule, FLOW_DISSECTOR_KEY_IP, out); 75} 76EXPORT_SYMBOL(flow_rule_match_ip); 77 78void flow_rule_match_ports(const struct flow_rule *rule, 79 struct flow_match_ports *out) 80{ 81 FLOW_DISSECTOR_MATCH(rule, FLOW_DISSECTOR_KEY_PORTS, out); 82} 83EXPORT_SYMBOL(flow_rule_match_ports); 84 85void flow_rule_match_tcp(const struct flow_rule *rule, 86 struct flow_match_tcp *out) 87{ 88 FLOW_DISSECTOR_MATCH(rule, FLOW_DISSECTOR_KEY_TCP, out); 89} 90EXPORT_SYMBOL(flow_rule_match_tcp); 91 92void flow_rule_match_icmp(const struct flow_rule *rule, 93 struct flow_match_icmp *out) 94{ 95 FLOW_DISSECTOR_MATCH(rule, FLOW_DISSECTOR_KEY_ICMP, out); 96} 97EXPORT_SYMBOL(flow_rule_match_icmp); 98 99void flow_rule_match_mpls(const struct flow_rule *rule, 100 struct flow_match_mpls *out) 101{ 102 FLOW_DISSECTOR_MATCH(rule, FLOW_DISSECTOR_KEY_MPLS, out); 103} 104EXPORT_SYMBOL(flow_rule_match_mpls); 105 106void flow_rule_match_enc_control(const struct flow_rule *rule, 107 struct flow_match_control *out) 108{ 109 FLOW_DISSECTOR_MATCH(rule, FLOW_DISSECTOR_KEY_ENC_CONTROL, out); 110} 111EXPORT_SYMBOL(flow_rule_match_enc_control); 112 113void flow_rule_match_enc_ipv4_addrs(const struct flow_rule *rule, 114 struct flow_match_ipv4_addrs *out) 115{ 116 FLOW_DISSECTOR_MATCH(rule, FLOW_DISSECTOR_KEY_ENC_IPV4_ADDRS, out); 117} 118EXPORT_SYMBOL(flow_rule_match_enc_ipv4_addrs); 119 120void flow_rule_match_enc_ipv6_addrs(const struct flow_rule *rule, 121 struct flow_match_ipv6_addrs *out) 122{ 123 FLOW_DISSECTOR_MATCH(rule, FLOW_DISSECTOR_KEY_ENC_IPV6_ADDRS, out); 124} 125EXPORT_SYMBOL(flow_rule_match_enc_ipv6_addrs); 126 127void flow_rule_match_enc_ip(const struct flow_rule *rule, 128 struct flow_match_ip *out) 129{ 130 FLOW_DISSECTOR_MATCH(rule, FLOW_DISSECTOR_KEY_ENC_IP, out); 131} 132EXPORT_SYMBOL(flow_rule_match_enc_ip); 133 134void flow_rule_match_enc_ports(const struct flow_rule *rule, 135 struct flow_match_ports *out) 136{ 137 FLOW_DISSECTOR_MATCH(rule, FLOW_DISSECTOR_KEY_ENC_PORTS, out); 138} 139EXPORT_SYMBOL(flow_rule_match_enc_ports); 140 141void flow_rule_match_enc_keyid(const struct flow_rule *rule, 142 struct flow_match_enc_keyid *out) 143{ 144 FLOW_DISSECTOR_MATCH(rule, FLOW_DISSECTOR_KEY_ENC_KEYID, out); 145} 146EXPORT_SYMBOL(flow_rule_match_enc_keyid); 147 148void flow_rule_match_enc_opts(const struct flow_rule *rule, 149 struct flow_match_enc_opts *out) 150{ 151 FLOW_DISSECTOR_MATCH(rule, FLOW_DISSECTOR_KEY_ENC_OPTS, out); 152} 153EXPORT_SYMBOL(flow_rule_match_enc_opts);