linux/include/net/tc_act/tc_ct.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0 */
   2#ifndef __NET_TC_CT_H
   3#define __NET_TC_CT_H
   4
   5#include <net/act_api.h>
   6#include <uapi/linux/tc_act/tc_ct.h>
   7
   8#if IS_ENABLED(CONFIG_NF_CONNTRACK)
   9#include <net/netfilter/nf_nat.h>
  10#include <net/netfilter/nf_conntrack_labels.h>
  11
  12struct tcf_ct_params {
  13        struct nf_conn *tmpl;
  14        u16 zone;
  15
  16        u32 mark;
  17        u32 mark_mask;
  18
  19        u32 labels[NF_CT_LABELS_MAX_SIZE / sizeof(u32)];
  20        u32 labels_mask[NF_CT_LABELS_MAX_SIZE / sizeof(u32)];
  21
  22        struct nf_nat_range2 range;
  23        bool ipv4_range;
  24
  25        u16 ct_action;
  26
  27        struct rcu_head rcu;
  28
  29        struct tcf_ct_flow_table *ct_ft;
  30        struct nf_flowtable *nf_ft;
  31};
  32
  33struct tcf_ct {
  34        struct tc_action common;
  35        struct tcf_ct_params __rcu *params;
  36};
  37
  38#define to_ct(a) ((struct tcf_ct *)a)
  39#define to_ct_params(a)                                                 \
  40        ((struct tcf_ct_params *)                                       \
  41         rcu_dereference_protected(to_ct(a)->params,                    \
  42                                   lockdep_is_held(&a->tcfa_lock)))
  43
  44static inline uint16_t tcf_ct_zone(const struct tc_action *a)
  45{
  46        return to_ct_params(a)->zone;
  47}
  48
  49static inline int tcf_ct_action(const struct tc_action *a)
  50{
  51        return to_ct_params(a)->ct_action;
  52}
  53
  54static inline struct nf_flowtable *tcf_ct_ft(const struct tc_action *a)
  55{
  56        return to_ct_params(a)->nf_ft;
  57}
  58
  59#else
  60static inline uint16_t tcf_ct_zone(const struct tc_action *a) { return 0; }
  61static inline int tcf_ct_action(const struct tc_action *a) { return 0; }
  62static inline struct nf_flowtable *tcf_ct_ft(const struct tc_action *a)
  63{
  64        return NULL;
  65}
  66#endif /* CONFIG_NF_CONNTRACK */
  67
  68#if IS_ENABLED(CONFIG_NET_ACT_CT)
  69static inline void
  70tcf_ct_flow_table_restore_skb(struct sk_buff *skb, unsigned long cookie)
  71{
  72        enum ip_conntrack_info ctinfo = cookie & NFCT_INFOMASK;
  73        struct nf_conn *ct;
  74
  75        ct = (struct nf_conn *)(cookie & NFCT_PTRMASK);
  76        nf_conntrack_get(&ct->ct_general);
  77        nf_ct_set(skb, ct, ctinfo);
  78}
  79#else
  80static inline void
  81tcf_ct_flow_table_restore_skb(struct sk_buff *skb, unsigned long cookie) { }
  82#endif
  83
  84static inline bool is_tcf_ct(const struct tc_action *a)
  85{
  86#if defined(CONFIG_NET_CLS_ACT) && IS_ENABLED(CONFIG_NF_CONNTRACK)
  87        if (a->ops && a->ops->id == TCA_ID_CT)
  88                return true;
  89#endif
  90        return false;
  91}
  92
  93#endif /* __NET_TC_CT_H */
  94