Branch data Line data Source code
1 : : /* SPDX-License-Identifier: GPL-2.0-or-later */ 2 : : /* 3 : : * Copyright (c) 2016, Amir Vadai <amir@vadai.me> 4 : : * Copyright (c) 2016, Mellanox Technologies. All rights reserved. 5 : : */ 6 : : 7 : : #ifndef __NET_TC_TUNNEL_KEY_H 8 : : #define __NET_TC_TUNNEL_KEY_H 9 : : 10 : : #include <net/act_api.h> 11 : : #include <linux/tc_act/tc_tunnel_key.h> 12 : : #include <net/dst_metadata.h> 13 : : 14 : : struct tcf_tunnel_key_params { 15 : : struct rcu_head rcu; 16 : : int tcft_action; 17 : : struct metadata_dst *tcft_enc_metadata; 18 : : }; 19 : : 20 : : struct tcf_tunnel_key { 21 : : struct tc_action common; 22 : : struct tcf_tunnel_key_params __rcu *params; 23 : : }; 24 : : 25 : : #define to_tunnel_key(a) ((struct tcf_tunnel_key *)a) 26 : : 27 : : static inline bool is_tcf_tunnel_set(const struct tc_action *a) 28 : : { 29 : : #ifdef CONFIG_NET_CLS_ACT 30 : : struct tcf_tunnel_key *t = to_tunnel_key(a); 31 : 0 : struct tcf_tunnel_key_params *params = rtnl_dereference(t->params); 32 : : 33 : 0 : if (a->ops && a->ops->id == TCA_ID_TUNNEL_KEY) 34 : 0 : return params->tcft_action == TCA_TUNNEL_KEY_ACT_SET; 35 : : #endif 36 : : return false; 37 : : } 38 : : 39 : : static inline bool is_tcf_tunnel_release(const struct tc_action *a) 40 : : { 41 : : #ifdef CONFIG_NET_CLS_ACT 42 : : struct tcf_tunnel_key *t = to_tunnel_key(a); 43 : : struct tcf_tunnel_key_params *params = rtnl_dereference(t->params); 44 : : 45 : 0 : if (a->ops && a->ops->id == TCA_ID_TUNNEL_KEY) 46 : 0 : return params->tcft_action == TCA_TUNNEL_KEY_ACT_RELEASE; 47 : : #endif 48 : : return false; 49 : : } 50 : : 51 : : static inline struct ip_tunnel_info *tcf_tunnel_info(const struct tc_action *a) 52 : : { 53 : : #ifdef CONFIG_NET_CLS_ACT 54 : : struct tcf_tunnel_key *t = to_tunnel_key(a); 55 : 0 : struct tcf_tunnel_key_params *params = rtnl_dereference(t->params); 56 : : 57 : 0 : return ¶ms->tcft_enc_metadata->u.tun_info; 58 : : #else 59 : : return NULL; 60 : : #endif 61 : : } 62 : : 63 : : static inline struct ip_tunnel_info * 64 : 0 : tcf_tunnel_info_copy(const struct tc_action *a) 65 : : { 66 : : #ifdef CONFIG_NET_CLS_ACT 67 : : struct ip_tunnel_info *tun = tcf_tunnel_info(a); 68 : : 69 : 0 : if (tun) { 70 : 0 : size_t tun_size = sizeof(*tun) + tun->options_len; 71 : 0 : struct ip_tunnel_info *tun_copy = kmemdup(tun, tun_size, 72 : : GFP_KERNEL); 73 : : 74 : 0 : return tun_copy; 75 : : } 76 : : #endif 77 : : return NULL; 78 : : } 79 : : #endif /* __NET_TC_TUNNEL_KEY_H */