提交 fad136ea 编写于 作者: P Patrick McHardy 提交者: Pablo Neira Ayuso

netfilter: nf_tables: convert expressions to u32 register pointers

Simple conversion to use u32 pointers to the beginning of the registers
to keep follow up patches smaller.
Signed-off-by: NPatrick McHardy <kaber@trash.net>
Signed-off-by: NPablo Neira Ayuso <pablo@netfilter.org>
上级 1ca2e170
...@@ -24,7 +24,7 @@ static void nft_meta_bridge_get_eval(const struct nft_expr *expr, ...@@ -24,7 +24,7 @@ static void nft_meta_bridge_get_eval(const struct nft_expr *expr,
{ {
const struct nft_meta *priv = nft_expr_priv(expr); const struct nft_meta *priv = nft_expr_priv(expr);
const struct net_device *in = pkt->in, *out = pkt->out; const struct net_device *in = pkt->in, *out = pkt->out;
struct nft_data *dest = &regs->data[priv->dreg]; u32 *dest = &regs->data[priv->dreg].data[0];
const struct net_bridge_port *p; const struct net_bridge_port *p;
switch (priv->key) { switch (priv->key) {
...@@ -40,7 +40,7 @@ static void nft_meta_bridge_get_eval(const struct nft_expr *expr, ...@@ -40,7 +40,7 @@ static void nft_meta_bridge_get_eval(const struct nft_expr *expr,
goto out; goto out;
} }
strncpy((char *)dest->data, p->br->dev->name, sizeof(dest->data)); strncpy((char *)dest, p->br->dev->name, IFNAMSIZ);
return; return;
out: out:
return nft_meta_get_eval(expr, regs, pkt); return nft_meta_get_eval(expr, regs, pkt);
......
...@@ -81,7 +81,7 @@ static bool nft_payload_fast_eval(const struct nft_expr *expr, ...@@ -81,7 +81,7 @@ static bool nft_payload_fast_eval(const struct nft_expr *expr,
{ {
const struct nft_payload *priv = nft_expr_priv(expr); const struct nft_payload *priv = nft_expr_priv(expr);
const struct sk_buff *skb = pkt->skb; const struct sk_buff *skb = pkt->skb;
struct nft_data *dest = &regs->data[priv->dreg]; u32 *dest = &regs->data[priv->dreg].data[0];
unsigned char *ptr; unsigned char *ptr;
if (priv->base == NFT_PAYLOAD_NETWORK_HEADER) if (priv->base == NFT_PAYLOAD_NETWORK_HEADER)
...@@ -95,11 +95,11 @@ static bool nft_payload_fast_eval(const struct nft_expr *expr, ...@@ -95,11 +95,11 @@ static bool nft_payload_fast_eval(const struct nft_expr *expr,
return false; return false;
if (priv->len == 2) if (priv->len == 2)
*(u16 *)dest->data = *(u16 *)ptr; *(u16 *)dest = *(u16 *)ptr;
else if (priv->len == 4) else if (priv->len == 4)
*(u32 *)dest->data = *(u32 *)ptr; *(u32 *)dest = *(u32 *)ptr;
else else
*(u8 *)dest->data = *(u8 *)ptr; *(u8 *)dest = *(u8 *)ptr;
return true; return true;
} }
......
...@@ -30,14 +30,12 @@ static void nft_bitwise_eval(const struct nft_expr *expr, ...@@ -30,14 +30,12 @@ static void nft_bitwise_eval(const struct nft_expr *expr,
const struct nft_pktinfo *pkt) const struct nft_pktinfo *pkt)
{ {
const struct nft_bitwise *priv = nft_expr_priv(expr); const struct nft_bitwise *priv = nft_expr_priv(expr);
const struct nft_data *src = &regs->data[priv->sreg]; const u32 *src = &regs->data[priv->sreg].data[0];
struct nft_data *dst = &regs->data[priv->dreg]; u32 *dst = &regs->data[priv->dreg].data[0];
unsigned int i; unsigned int i;
for (i = 0; i < DIV_ROUND_UP(priv->len, 4); i++) { for (i = 0; i < DIV_ROUND_UP(priv->len, 4); i++)
dst->data[i] = (src->data[i] & priv->mask.data[i]) ^ dst[i] = (src[i] & priv->mask.data[i]) ^ priv->xor.data[i];
priv->xor.data[i];
}
} }
static const struct nla_policy nft_bitwise_policy[NFTA_BITWISE_MAX + 1] = { static const struct nla_policy nft_bitwise_policy[NFTA_BITWISE_MAX + 1] = {
......
...@@ -30,13 +30,13 @@ static void nft_byteorder_eval(const struct nft_expr *expr, ...@@ -30,13 +30,13 @@ static void nft_byteorder_eval(const struct nft_expr *expr,
const struct nft_pktinfo *pkt) const struct nft_pktinfo *pkt)
{ {
const struct nft_byteorder *priv = nft_expr_priv(expr); const struct nft_byteorder *priv = nft_expr_priv(expr);
struct nft_data *src = &regs->data[priv->sreg]; u32 *src = &regs->data[priv->sreg].data[0];
struct nft_data *dst = &regs->data[priv->dreg]; u32 *dst = &regs->data[priv->dreg].data[0];
union { u32 u32; u16 u16; } *s, *d; union { u32 u32; u16 u16; } *s, *d;
unsigned int i; unsigned int i;
s = (void *)src->data; s = (void *)src;
d = (void *)dst->data; d = (void *)dst;
switch (priv->size) { switch (priv->size) {
case 4: case 4:
......
...@@ -35,7 +35,7 @@ static void nft_ct_get_eval(const struct nft_expr *expr, ...@@ -35,7 +35,7 @@ static void nft_ct_get_eval(const struct nft_expr *expr,
const struct nft_pktinfo *pkt) const struct nft_pktinfo *pkt)
{ {
const struct nft_ct *priv = nft_expr_priv(expr); const struct nft_ct *priv = nft_expr_priv(expr);
struct nft_data *dest = &regs->data[priv->dreg]; u32 *dest = &regs->data[priv->dreg].data[0];
enum ip_conntrack_info ctinfo; enum ip_conntrack_info ctinfo;
const struct nf_conn *ct; const struct nf_conn *ct;
const struct nf_conn_help *help; const struct nf_conn_help *help;
...@@ -54,7 +54,7 @@ static void nft_ct_get_eval(const struct nft_expr *expr, ...@@ -54,7 +54,7 @@ static void nft_ct_get_eval(const struct nft_expr *expr,
state = NF_CT_STATE_UNTRACKED_BIT; state = NF_CT_STATE_UNTRACKED_BIT;
else else
state = NF_CT_STATE_BIT(ctinfo); state = NF_CT_STATE_BIT(ctinfo);
dest->data[0] = state; *dest = state;
return; return;
default: default:
break; break;
...@@ -65,26 +65,26 @@ static void nft_ct_get_eval(const struct nft_expr *expr, ...@@ -65,26 +65,26 @@ static void nft_ct_get_eval(const struct nft_expr *expr,
switch (priv->key) { switch (priv->key) {
case NFT_CT_DIRECTION: case NFT_CT_DIRECTION:
dest->data[0] = CTINFO2DIR(ctinfo); *dest = CTINFO2DIR(ctinfo);
return; return;
case NFT_CT_STATUS: case NFT_CT_STATUS:
dest->data[0] = ct->status; *dest = ct->status;
return; return;
#ifdef CONFIG_NF_CONNTRACK_MARK #ifdef CONFIG_NF_CONNTRACK_MARK
case NFT_CT_MARK: case NFT_CT_MARK:
dest->data[0] = ct->mark; *dest = ct->mark;
return; return;
#endif #endif
#ifdef CONFIG_NF_CONNTRACK_SECMARK #ifdef CONFIG_NF_CONNTRACK_SECMARK
case NFT_CT_SECMARK: case NFT_CT_SECMARK:
dest->data[0] = ct->secmark; *dest = ct->secmark;
return; return;
#endif #endif
case NFT_CT_EXPIRATION: case NFT_CT_EXPIRATION:
diff = (long)jiffies - (long)ct->timeout.expires; diff = (long)jiffies - (long)ct->timeout.expires;
if (diff < 0) if (diff < 0)
diff = 0; diff = 0;
dest->data[0] = jiffies_to_msecs(diff); *dest = jiffies_to_msecs(diff);
return; return;
case NFT_CT_HELPER: case NFT_CT_HELPER:
if (ct->master == NULL) if (ct->master == NULL)
...@@ -95,7 +95,7 @@ static void nft_ct_get_eval(const struct nft_expr *expr, ...@@ -95,7 +95,7 @@ static void nft_ct_get_eval(const struct nft_expr *expr,
helper = rcu_dereference(help->helper); helper = rcu_dereference(help->helper);
if (helper == NULL) if (helper == NULL)
goto err; goto err;
strncpy((char *)dest->data, helper->name, sizeof(dest->data)); strncpy((char *)dest, helper->name, NF_CT_HELPER_NAME_LEN);
return; return;
#ifdef CONFIG_NF_CONNTRACK_LABELS #ifdef CONFIG_NF_CONNTRACK_LABELS
case NFT_CT_LABELS: { case NFT_CT_LABELS: {
...@@ -103,15 +103,15 @@ static void nft_ct_get_eval(const struct nft_expr *expr, ...@@ -103,15 +103,15 @@ static void nft_ct_get_eval(const struct nft_expr *expr,
unsigned int size; unsigned int size;
if (!labels) { if (!labels) {
memset(dest->data, 0, sizeof(dest->data)); memset(dest, 0, NF_CT_LABELS_MAX_SIZE);
return; return;
} }
size = labels->words * sizeof(long); size = labels->words * sizeof(long);
memcpy(dest->data, labels->bits, size); memcpy(dest, labels->bits, size);
if (size < sizeof(dest->data)) if (size < NF_CT_LABELS_MAX_SIZE)
memset(((char *) dest->data) + size, 0, memset(((char *) dest) + size, 0,
sizeof(dest->data) - size); NF_CT_LABELS_MAX_SIZE - size);
return; return;
} }
#endif #endif
...@@ -122,24 +122,24 @@ static void nft_ct_get_eval(const struct nft_expr *expr, ...@@ -122,24 +122,24 @@ static void nft_ct_get_eval(const struct nft_expr *expr,
tuple = &ct->tuplehash[priv->dir].tuple; tuple = &ct->tuplehash[priv->dir].tuple;
switch (priv->key) { switch (priv->key) {
case NFT_CT_L3PROTOCOL: case NFT_CT_L3PROTOCOL:
dest->data[0] = nf_ct_l3num(ct); *dest = nf_ct_l3num(ct);
return; return;
case NFT_CT_SRC: case NFT_CT_SRC:
memcpy(dest->data, tuple->src.u3.all, memcpy(dest, tuple->src.u3.all,
nf_ct_l3num(ct) == NFPROTO_IPV4 ? 4 : 16); nf_ct_l3num(ct) == NFPROTO_IPV4 ? 4 : 16);
return; return;
case NFT_CT_DST: case NFT_CT_DST:
memcpy(dest->data, tuple->dst.u3.all, memcpy(dest, tuple->dst.u3.all,
nf_ct_l3num(ct) == NFPROTO_IPV4 ? 4 : 16); nf_ct_l3num(ct) == NFPROTO_IPV4 ? 4 : 16);
return; return;
case NFT_CT_PROTOCOL: case NFT_CT_PROTOCOL:
dest->data[0] = nf_ct_protonum(ct); *dest = nf_ct_protonum(ct);
return; return;
case NFT_CT_PROTO_SRC: case NFT_CT_PROTO_SRC:
dest->data[0] = (__force __u16)tuple->src.u.all; *dest = (__force __u16)tuple->src.u.all;
return; return;
case NFT_CT_PROTO_DST: case NFT_CT_PROTO_DST:
dest->data[0] = (__force __u16)tuple->dst.u.all; *dest = (__force __u16)tuple->dst.u.all;
return; return;
default: default:
break; break;
......
...@@ -30,7 +30,7 @@ static void nft_exthdr_eval(const struct nft_expr *expr, ...@@ -30,7 +30,7 @@ static void nft_exthdr_eval(const struct nft_expr *expr,
const struct nft_pktinfo *pkt) const struct nft_pktinfo *pkt)
{ {
struct nft_exthdr *priv = nft_expr_priv(expr); struct nft_exthdr *priv = nft_expr_priv(expr);
struct nft_data *dest = &regs->data[priv->dreg]; u32 *dest = &regs->data[priv->dreg].data[0];
unsigned int offset = 0; unsigned int offset = 0;
int err; int err;
...@@ -39,7 +39,7 @@ static void nft_exthdr_eval(const struct nft_expr *expr, ...@@ -39,7 +39,7 @@ static void nft_exthdr_eval(const struct nft_expr *expr,
goto err; goto err;
offset += priv->offset; offset += priv->offset;
if (skb_copy_bits(pkt->skb, offset, dest->data, priv->len) < 0) if (skb_copy_bits(pkt->skb, offset, dest, priv->len) < 0)
goto err; goto err;
return; return;
err: err:
......
...@@ -31,56 +31,56 @@ void nft_meta_get_eval(const struct nft_expr *expr, ...@@ -31,56 +31,56 @@ void nft_meta_get_eval(const struct nft_expr *expr,
const struct nft_meta *priv = nft_expr_priv(expr); const struct nft_meta *priv = nft_expr_priv(expr);
const struct sk_buff *skb = pkt->skb; const struct sk_buff *skb = pkt->skb;
const struct net_device *in = pkt->in, *out = pkt->out; const struct net_device *in = pkt->in, *out = pkt->out;
struct nft_data *dest = &regs->data[priv->dreg]; u32 *dest = &regs->data[priv->dreg].data[0];
switch (priv->key) { switch (priv->key) {
case NFT_META_LEN: case NFT_META_LEN:
dest->data[0] = skb->len; *dest = skb->len;
break; break;
case NFT_META_PROTOCOL: case NFT_META_PROTOCOL:
*(__be16 *)dest->data = skb->protocol; *(__be16 *)dest = skb->protocol;
break; break;
case NFT_META_NFPROTO: case NFT_META_NFPROTO:
dest->data[0] = pkt->ops->pf; *dest = pkt->ops->pf;
break; break;
case NFT_META_L4PROTO: case NFT_META_L4PROTO:
dest->data[0] = pkt->tprot; *dest = pkt->tprot;
break; break;
case NFT_META_PRIORITY: case NFT_META_PRIORITY:
dest->data[0] = skb->priority; *dest = skb->priority;
break; break;
case NFT_META_MARK: case NFT_META_MARK:
dest->data[0] = skb->mark; *dest = skb->mark;
break; break;
case NFT_META_IIF: case NFT_META_IIF:
if (in == NULL) if (in == NULL)
goto err; goto err;
dest->data[0] = in->ifindex; *dest = in->ifindex;
break; break;
case NFT_META_OIF: case NFT_META_OIF:
if (out == NULL) if (out == NULL)
goto err; goto err;
dest->data[0] = out->ifindex; *dest = out->ifindex;
break; break;
case NFT_META_IIFNAME: case NFT_META_IIFNAME:
if (in == NULL) if (in == NULL)
goto err; goto err;
strncpy((char *)dest->data, in->name, sizeof(dest->data)); strncpy((char *)dest, in->name, IFNAMSIZ);
break; break;
case NFT_META_OIFNAME: case NFT_META_OIFNAME:
if (out == NULL) if (out == NULL)
goto err; goto err;
strncpy((char *)dest->data, out->name, sizeof(dest->data)); strncpy((char *)dest, out->name, IFNAMSIZ);
break; break;
case NFT_META_IIFTYPE: case NFT_META_IIFTYPE:
if (in == NULL) if (in == NULL)
goto err; goto err;
*(u16 *)dest->data = in->type; *(u16 *)dest = in->type;
break; break;
case NFT_META_OIFTYPE: case NFT_META_OIFTYPE:
if (out == NULL) if (out == NULL)
goto err; goto err;
*(u16 *)dest->data = out->type; *(u16 *)dest = out->type;
break; break;
case NFT_META_SKUID: case NFT_META_SKUID:
if (skb->sk == NULL || !sk_fullsock(skb->sk)) if (skb->sk == NULL || !sk_fullsock(skb->sk))
...@@ -93,8 +93,7 @@ void nft_meta_get_eval(const struct nft_expr *expr, ...@@ -93,8 +93,7 @@ void nft_meta_get_eval(const struct nft_expr *expr,
goto err; goto err;
} }
dest->data[0] = *dest = from_kuid_munged(&init_user_ns,
from_kuid_munged(&init_user_ns,
skb->sk->sk_socket->file->f_cred->fsuid); skb->sk->sk_socket->file->f_cred->fsuid);
read_unlock_bh(&skb->sk->sk_callback_lock); read_unlock_bh(&skb->sk->sk_callback_lock);
break; break;
...@@ -108,8 +107,7 @@ void nft_meta_get_eval(const struct nft_expr *expr, ...@@ -108,8 +107,7 @@ void nft_meta_get_eval(const struct nft_expr *expr,
read_unlock_bh(&skb->sk->sk_callback_lock); read_unlock_bh(&skb->sk->sk_callback_lock);
goto err; goto err;
} }
dest->data[0] = *dest = from_kgid_munged(&init_user_ns,
from_kgid_munged(&init_user_ns,
skb->sk->sk_socket->file->f_cred->fsgid); skb->sk->sk_socket->file->f_cred->fsgid);
read_unlock_bh(&skb->sk->sk_callback_lock); read_unlock_bh(&skb->sk->sk_callback_lock);
break; break;
...@@ -119,33 +117,33 @@ void nft_meta_get_eval(const struct nft_expr *expr, ...@@ -119,33 +117,33 @@ void nft_meta_get_eval(const struct nft_expr *expr,
if (dst == NULL) if (dst == NULL)
goto err; goto err;
dest->data[0] = dst->tclassid; *dest = dst->tclassid;
break; break;
} }
#endif #endif
#ifdef CONFIG_NETWORK_SECMARK #ifdef CONFIG_NETWORK_SECMARK
case NFT_META_SECMARK: case NFT_META_SECMARK:
dest->data[0] = skb->secmark; *dest = skb->secmark;
break; break;
#endif #endif
case NFT_META_PKTTYPE: case NFT_META_PKTTYPE:
if (skb->pkt_type != PACKET_LOOPBACK) { if (skb->pkt_type != PACKET_LOOPBACK) {
dest->data[0] = skb->pkt_type; *dest = skb->pkt_type;
break; break;
} }
switch (pkt->ops->pf) { switch (pkt->ops->pf) {
case NFPROTO_IPV4: case NFPROTO_IPV4:
if (ipv4_is_multicast(ip_hdr(skb)->daddr)) if (ipv4_is_multicast(ip_hdr(skb)->daddr))
dest->data[0] = PACKET_MULTICAST; *dest = PACKET_MULTICAST;
else else
dest->data[0] = PACKET_BROADCAST; *dest = PACKET_BROADCAST;
break; break;
case NFPROTO_IPV6: case NFPROTO_IPV6:
if (ipv6_hdr(skb)->daddr.s6_addr[0] == 0xFF) if (ipv6_hdr(skb)->daddr.s6_addr[0] == 0xFF)
dest->data[0] = PACKET_MULTICAST; *dest = PACKET_MULTICAST;
else else
dest->data[0] = PACKET_BROADCAST; *dest = PACKET_BROADCAST;
break; break;
default: default:
WARN_ON(1); WARN_ON(1);
...@@ -153,22 +151,22 @@ void nft_meta_get_eval(const struct nft_expr *expr, ...@@ -153,22 +151,22 @@ void nft_meta_get_eval(const struct nft_expr *expr,
} }
break; break;
case NFT_META_CPU: case NFT_META_CPU:
dest->data[0] = raw_smp_processor_id(); *dest = raw_smp_processor_id();
break; break;
case NFT_META_IIFGROUP: case NFT_META_IIFGROUP:
if (in == NULL) if (in == NULL)
goto err; goto err;
dest->data[0] = in->group; *dest = in->group;
break; break;
case NFT_META_OIFGROUP: case NFT_META_OIFGROUP:
if (out == NULL) if (out == NULL)
goto err; goto err;
dest->data[0] = out->group; *dest = out->group;
break; break;
case NFT_META_CGROUP: case NFT_META_CGROUP:
if (skb->sk == NULL || !sk_fullsock(skb->sk)) if (skb->sk == NULL || !sk_fullsock(skb->sk))
goto err; goto err;
dest->data[0] = skb->sk->sk_classid; *dest = skb->sk->sk_classid;
break; break;
default: default:
WARN_ON(1); WARN_ON(1);
......
...@@ -23,7 +23,7 @@ static void nft_payload_eval(const struct nft_expr *expr, ...@@ -23,7 +23,7 @@ static void nft_payload_eval(const struct nft_expr *expr,
{ {
const struct nft_payload *priv = nft_expr_priv(expr); const struct nft_payload *priv = nft_expr_priv(expr);
const struct sk_buff *skb = pkt->skb; const struct sk_buff *skb = pkt->skb;
struct nft_data *dest = &regs->data[priv->dreg]; u32 *dest = &regs->data[priv->dreg].data[0];
int offset; int offset;
switch (priv->base) { switch (priv->base) {
...@@ -43,7 +43,7 @@ static void nft_payload_eval(const struct nft_expr *expr, ...@@ -43,7 +43,7 @@ static void nft_payload_eval(const struct nft_expr *expr,
} }
offset += priv->offset; offset += priv->offset;
if (skb_copy_bits(skb, offset, dest->data, priv->len) < 0) if (skb_copy_bits(skb, offset, dest, priv->len) < 0)
goto err; goto err;
return; return;
err: err:
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册