Merge tag 'arm64-upstream' of git://git.kernel.org/pub/scm/linux/kernel/git/arm64...
[deliverable/linux.git] / net / netfilter / nft_compat.c
index 65f3e2b6be44031448d85323ccf17cddaffd5557..7f29cfc76349f56d7408f4519213a98d564ab135 100644 (file)
@@ -20,6 +20,7 @@
 #include <linux/netfilter_ipv4/ip_tables.h>
 #include <linux/netfilter_ipv6/ip6_tables.h>
 #include <linux/netfilter_bridge/ebtables.h>
+#include <linux/netfilter_arp/arp_tables.h>
 #include <net/netfilter/nf_tables.h>
 
 static int nft_compat_chain_validate_dependency(const char *tablename,
@@ -42,6 +43,7 @@ union nft_entry {
        struct ipt_entry e4;
        struct ip6t_entry e6;
        struct ebt_entry ebt;
+       struct arpt_entry arp;
 };
 
 static inline void
@@ -53,7 +55,7 @@ nft_compat_set_par(struct xt_action_param *par, void *xt, const void *xt_info)
 }
 
 static void nft_target_eval_xt(const struct nft_expr *expr,
-                              struct nft_data data[NFT_REG_MAX + 1],
+                              struct nft_regs *regs,
                               const struct nft_pktinfo *pkt)
 {
        void *info = nft_expr_priv(expr);
@@ -70,16 +72,16 @@ static void nft_target_eval_xt(const struct nft_expr *expr,
 
        switch (ret) {
        case XT_CONTINUE:
-               data[NFT_REG_VERDICT].verdict = NFT_CONTINUE;
+               regs->verdict.code = NFT_CONTINUE;
                break;
        default:
-               data[NFT_REG_VERDICT].verdict = ret;
+               regs->verdict.code = ret;
                break;
        }
 }
 
 static void nft_target_eval_bridge(const struct nft_expr *expr,
-                                  struct nft_data data[NFT_REG_MAX + 1],
+                                  struct nft_regs *regs,
                                   const struct nft_pktinfo *pkt)
 {
        void *info = nft_expr_priv(expr);
@@ -96,19 +98,19 @@ static void nft_target_eval_bridge(const struct nft_expr *expr,
 
        switch (ret) {
        case EBT_ACCEPT:
-               data[NFT_REG_VERDICT].verdict = NF_ACCEPT;
+               regs->verdict.code = NF_ACCEPT;
                break;
        case EBT_DROP:
-               data[NFT_REG_VERDICT].verdict = NF_DROP;
+               regs->verdict.code = NF_DROP;
                break;
        case EBT_CONTINUE:
-               data[NFT_REG_VERDICT].verdict = NFT_CONTINUE;
+               regs->verdict.code = NFT_CONTINUE;
                break;
        case EBT_RETURN:
-               data[NFT_REG_VERDICT].verdict = NFT_RETURN;
+               regs->verdict.code = NFT_RETURN;
                break;
        default:
-               data[NFT_REG_VERDICT].verdict = ret;
+               regs->verdict.code = ret;
                break;
        }
 }
@@ -143,6 +145,8 @@ nft_target_set_tgchk_param(struct xt_tgchk_param *par,
                entry->ebt.ethproto = (__force __be16)proto;
                entry->ebt.invflags = inv ? EBT_IPROTO : 0;
                break;
+       case NFPROTO_ARP:
+               break;
        }
        par->entryinfo  = entry;
        par->target     = target;
@@ -300,7 +304,7 @@ static int nft_target_validate(const struct nft_ctx *ctx,
 }
 
 static void nft_match_eval(const struct nft_expr *expr,
-                          struct nft_data data[NFT_REG_MAX + 1],
+                          struct nft_regs *regs,
                           const struct nft_pktinfo *pkt)
 {
        void *info = nft_expr_priv(expr);
@@ -313,16 +317,16 @@ static void nft_match_eval(const struct nft_expr *expr,
        ret = match->match(skb, (struct xt_action_param *)&pkt->xt);
 
        if (pkt->xt.hotdrop) {
-               data[NFT_REG_VERDICT].verdict = NF_DROP;
+               regs->verdict.code = NF_DROP;
                return;
        }
 
-       switch(ret) {
-       case true:
-               data[NFT_REG_VERDICT].verdict = NFT_CONTINUE;
+       switch (ret ? 1 : 0) {
+       case 1:
+               regs->verdict.code = NFT_CONTINUE;
                break;
-       case false:
-               data[NFT_REG_VERDICT].verdict = NFT_BREAK;
+       case 0:
+               regs->verdict.code = NFT_BREAK;
                break;
        }
 }
@@ -357,6 +361,8 @@ nft_match_set_mtchk_param(struct xt_mtchk_param *par, const struct nft_ctx *ctx,
                entry->ebt.ethproto = (__force __be16)proto;
                entry->ebt.invflags = inv ? EBT_IPROTO : 0;
                break;
+       case NFPROTO_ARP:
+               break;
        }
        par->entryinfo  = entry;
        par->match      = match;
@@ -543,6 +549,9 @@ nfnl_compat_get(struct sock *nfnl, struct sk_buff *skb,
        case NFPROTO_BRIDGE:
                fmt = "ebt_%s";
                break;
+       case NFPROTO_ARP:
+               fmt = "arpt_%s";
+               break;
        default:
                pr_err("nft_compat: unsupported protocol %d\n",
                        nfmsg->nfgen_family);
This page took 0.036633 seconds and 5 git commands to generate.