Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next
Conflicts: net/netfilter/core.c net/netfilter/nf_tables_netdev.c Resolve two conflicts before pull request for David's net-next tree: 1) Betweenc73c248490("netfilter: nf_tables_netdev: remove redundant ip_hdr assignment") from the net tree and commitddc8b6027a("netfilter: introduce nft_set_pktinfo_{ipv4, ipv6}_validate()"). 2) Betweene8bffe0cf9("net: Add _nf_(un)register_hooks symbols") and Aaron Conole's patches to replace list_head with single linked list. Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
This commit is contained in:
@@ -231,19 +231,17 @@ EXPORT_SYMBOL(nf_unregister_net_hooks);
|
||||
|
||||
static LIST_HEAD(nf_hook_list);
|
||||
|
||||
int nf_register_hook(struct nf_hook_ops *reg)
|
||||
static int _nf_register_hook(struct nf_hook_ops *reg)
|
||||
{
|
||||
struct net *net, *last;
|
||||
int ret;
|
||||
|
||||
rtnl_lock();
|
||||
for_each_net(net) {
|
||||
ret = nf_register_net_hook(net, reg);
|
||||
if (ret && ret != -ENOENT)
|
||||
goto rollback;
|
||||
}
|
||||
list_add_tail(®->list, &nf_hook_list);
|
||||
rtnl_unlock();
|
||||
|
||||
return 0;
|
||||
rollback:
|
||||
@@ -253,19 +251,34 @@ rollback:
|
||||
break;
|
||||
nf_unregister_net_hook(net, reg);
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
int nf_register_hook(struct nf_hook_ops *reg)
|
||||
{
|
||||
int ret;
|
||||
|
||||
rtnl_lock();
|
||||
ret = _nf_register_hook(reg);
|
||||
rtnl_unlock();
|
||||
|
||||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL(nf_register_hook);
|
||||
|
||||
void nf_unregister_hook(struct nf_hook_ops *reg)
|
||||
static void _nf_unregister_hook(struct nf_hook_ops *reg)
|
||||
{
|
||||
struct net *net;
|
||||
|
||||
rtnl_lock();
|
||||
list_del(®->list);
|
||||
for_each_net(net)
|
||||
nf_unregister_net_hook(net, reg);
|
||||
}
|
||||
|
||||
void nf_unregister_hook(struct nf_hook_ops *reg)
|
||||
{
|
||||
rtnl_lock();
|
||||
_nf_unregister_hook(reg);
|
||||
rtnl_unlock();
|
||||
}
|
||||
EXPORT_SYMBOL(nf_unregister_hook);
|
||||
@@ -289,6 +302,26 @@ err:
|
||||
}
|
||||
EXPORT_SYMBOL(nf_register_hooks);
|
||||
|
||||
/* Caller MUST take rtnl_lock() */
|
||||
int _nf_register_hooks(struct nf_hook_ops *reg, unsigned int n)
|
||||
{
|
||||
unsigned int i;
|
||||
int err = 0;
|
||||
|
||||
for (i = 0; i < n; i++) {
|
||||
err = _nf_register_hook(®[i]);
|
||||
if (err)
|
||||
goto err;
|
||||
}
|
||||
return err;
|
||||
|
||||
err:
|
||||
if (i > 0)
|
||||
_nf_unregister_hooks(reg, i);
|
||||
return err;
|
||||
}
|
||||
EXPORT_SYMBOL(_nf_register_hooks);
|
||||
|
||||
void nf_unregister_hooks(struct nf_hook_ops *reg, unsigned int n)
|
||||
{
|
||||
while (n-- > 0)
|
||||
@@ -296,6 +329,14 @@ void nf_unregister_hooks(struct nf_hook_ops *reg, unsigned int n)
|
||||
}
|
||||
EXPORT_SYMBOL(nf_unregister_hooks);
|
||||
|
||||
/* Caller MUST take rtnl_lock */
|
||||
void _nf_unregister_hooks(struct nf_hook_ops *reg, unsigned int n)
|
||||
{
|
||||
while (n-- > 0)
|
||||
_nf_unregister_hook(®[n]);
|
||||
}
|
||||
EXPORT_SYMBOL(_nf_unregister_hooks);
|
||||
|
||||
unsigned int nf_iterate(struct sk_buff *skb,
|
||||
struct nf_hook_state *state,
|
||||
struct nf_hook_entry **entryp)
|
||||
|
||||
@@ -1108,9 +1108,9 @@ init_conntrack(struct net *net, struct nf_conn *tmpl,
|
||||
if (IS_ERR(ct))
|
||||
return (struct nf_conntrack_tuple_hash *)ct;
|
||||
|
||||
if (tmpl && nfct_synproxy(tmpl)) {
|
||||
nfct_seqadj_ext_add(ct);
|
||||
nfct_synproxy_ext_add(ct);
|
||||
if (!nf_ct_add_synproxy(ct, tmpl)) {
|
||||
nf_conntrack_free(ct);
|
||||
return ERR_PTR(-ENOMEM);
|
||||
}
|
||||
|
||||
timeout_ext = tmpl ? nf_ct_timeout_find(tmpl) : NULL;
|
||||
|
||||
@@ -441,7 +441,8 @@ nf_nat_setup_info(struct nf_conn *ct,
|
||||
ct->status |= IPS_DST_NAT;
|
||||
|
||||
if (nfct_help(ct))
|
||||
nfct_seqadj_ext_add(ct);
|
||||
if (!nfct_seqadj_ext_add(ct))
|
||||
return NF_DROP;
|
||||
}
|
||||
|
||||
if (maniptype == NF_NAT_MANIP_SRC) {
|
||||
@@ -801,7 +802,7 @@ nfnetlink_parse_nat_setup(struct nf_conn *ct,
|
||||
if (err < 0)
|
||||
return err;
|
||||
|
||||
return nf_nat_setup_info(ct, &range, manip);
|
||||
return nf_nat_setup_info(ct, &range, manip) == NF_DROP ? -ENOMEM : 0;
|
||||
}
|
||||
#else
|
||||
static int
|
||||
|
||||
@@ -239,7 +239,7 @@ void nft_trace_notify(struct nft_traceinfo *info)
|
||||
break;
|
||||
case NFT_TRACETYPE_POLICY:
|
||||
if (nla_put_be32(skb, NFTA_TRACE_POLICY,
|
||||
info->basechain->policy))
|
||||
htonl(info->basechain->policy)))
|
||||
goto nla_put_failure;
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -343,12 +343,12 @@ static int nfnl_acct_del(struct net *net, struct sock *nfnl,
|
||||
struct sk_buff *skb, const struct nlmsghdr *nlh,
|
||||
const struct nlattr * const tb[])
|
||||
{
|
||||
char *acct_name;
|
||||
struct nf_acct *cur;
|
||||
struct nf_acct *cur, *tmp;
|
||||
int ret = -ENOENT;
|
||||
char *acct_name;
|
||||
|
||||
if (!tb[NFACCT_NAME]) {
|
||||
list_for_each_entry(cur, &net->nfnl_acct_list, head)
|
||||
list_for_each_entry_safe(cur, tmp, &net->nfnl_acct_list, head)
|
||||
nfnl_acct_try_del(cur);
|
||||
|
||||
return 0;
|
||||
|
||||
@@ -98,31 +98,28 @@ static int cttimeout_new_timeout(struct net *net, struct sock *ctnl,
|
||||
break;
|
||||
}
|
||||
|
||||
l4proto = nf_ct_l4proto_find_get(l3num, l4num);
|
||||
|
||||
/* This protocol is not supportted, skip. */
|
||||
if (l4proto->l4proto != l4num) {
|
||||
ret = -EOPNOTSUPP;
|
||||
goto err_proto_put;
|
||||
}
|
||||
|
||||
if (matching) {
|
||||
if (nlh->nlmsg_flags & NLM_F_REPLACE) {
|
||||
/* You cannot replace one timeout policy by another of
|
||||
* different kind, sorry.
|
||||
*/
|
||||
if (matching->l3num != l3num ||
|
||||
matching->l4proto->l4proto != l4num) {
|
||||
ret = -EINVAL;
|
||||
goto err_proto_put;
|
||||
}
|
||||
matching->l4proto->l4proto != l4num)
|
||||
return -EINVAL;
|
||||
|
||||
ret = ctnl_timeout_parse_policy(&matching->data,
|
||||
l4proto, net,
|
||||
cda[CTA_TIMEOUT_DATA]);
|
||||
return ret;
|
||||
return ctnl_timeout_parse_policy(&matching->data,
|
||||
matching->l4proto, net,
|
||||
cda[CTA_TIMEOUT_DATA]);
|
||||
}
|
||||
ret = -EBUSY;
|
||||
|
||||
return -EBUSY;
|
||||
}
|
||||
|
||||
l4proto = nf_ct_l4proto_find_get(l3num, l4num);
|
||||
|
||||
/* This protocol is not supportted, skip. */
|
||||
if (l4proto->l4proto != l4num) {
|
||||
ret = -EOPNOTSUPP;
|
||||
goto err_proto_put;
|
||||
}
|
||||
|
||||
@@ -305,7 +302,16 @@ static void ctnl_untimeout(struct net *net, struct ctnl_timeout *timeout)
|
||||
const struct hlist_nulls_node *nn;
|
||||
unsigned int last_hsize;
|
||||
spinlock_t *lock;
|
||||
int i;
|
||||
int i, cpu;
|
||||
|
||||
for_each_possible_cpu(cpu) {
|
||||
struct ct_pcpu *pcpu = per_cpu_ptr(net->ct.pcpu_lists, cpu);
|
||||
|
||||
spin_lock_bh(&pcpu->lock);
|
||||
hlist_nulls_for_each_entry(h, nn, &pcpu->unconfirmed, hnnode)
|
||||
untimeout(h, timeout);
|
||||
spin_unlock_bh(&pcpu->lock);
|
||||
}
|
||||
|
||||
local_bh_disable();
|
||||
restart:
|
||||
@@ -350,12 +356,13 @@ static int cttimeout_del_timeout(struct net *net, struct sock *ctnl,
|
||||
const struct nlmsghdr *nlh,
|
||||
const struct nlattr * const cda[])
|
||||
{
|
||||
struct ctnl_timeout *cur;
|
||||
struct ctnl_timeout *cur, *tmp;
|
||||
int ret = -ENOENT;
|
||||
char *name;
|
||||
|
||||
if (!cda[CTA_TIMEOUT_NAME]) {
|
||||
list_for_each_entry(cur, &net->nfct_timeout_list, head)
|
||||
list_for_each_entry_safe(cur, tmp, &net->nfct_timeout_list,
|
||||
head)
|
||||
ctnl_timeout_try_del(net, cur);
|
||||
|
||||
return 0;
|
||||
|
||||
@@ -293,10 +293,16 @@ int nft_meta_get_init(const struct nft_ctx *ctx,
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(nft_meta_get_init);
|
||||
|
||||
static int nft_meta_set_init_pkttype(const struct nft_ctx *ctx)
|
||||
int nft_meta_set_validate(const struct nft_ctx *ctx,
|
||||
const struct nft_expr *expr,
|
||||
const struct nft_data **data)
|
||||
{
|
||||
struct nft_meta *priv = nft_expr_priv(expr);
|
||||
unsigned int hooks;
|
||||
|
||||
if (priv->key != NFT_META_PKTTYPE)
|
||||
return 0;
|
||||
|
||||
switch (ctx->afi->family) {
|
||||
case NFPROTO_BRIDGE:
|
||||
hooks = 1 << NF_BR_PRE_ROUTING;
|
||||
@@ -310,6 +316,7 @@ static int nft_meta_set_init_pkttype(const struct nft_ctx *ctx)
|
||||
|
||||
return nft_chain_validate_hooks(ctx->chain, hooks);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(nft_meta_set_validate);
|
||||
|
||||
int nft_meta_set_init(const struct nft_ctx *ctx,
|
||||
const struct nft_expr *expr,
|
||||
@@ -329,15 +336,16 @@ int nft_meta_set_init(const struct nft_ctx *ctx,
|
||||
len = sizeof(u8);
|
||||
break;
|
||||
case NFT_META_PKTTYPE:
|
||||
err = nft_meta_set_init_pkttype(ctx);
|
||||
if (err)
|
||||
return err;
|
||||
len = sizeof(u8);
|
||||
break;
|
||||
default:
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
|
||||
err = nft_meta_set_validate(ctx, expr, NULL);
|
||||
if (err < 0)
|
||||
return err;
|
||||
|
||||
priv->sreg = nft_parse_register(tb[NFTA_META_SREG]);
|
||||
err = nft_validate_register_load(priv->sreg, len);
|
||||
if (err < 0)
|
||||
@@ -409,6 +417,7 @@ static const struct nft_expr_ops nft_meta_set_ops = {
|
||||
.init = nft_meta_set_init,
|
||||
.destroy = nft_meta_set_destroy,
|
||||
.dump = nft_meta_set_dump,
|
||||
.validate = nft_meta_set_validate,
|
||||
};
|
||||
|
||||
static const struct nft_expr_ops *
|
||||
|
||||
@@ -26,11 +26,27 @@ const struct nla_policy nft_reject_policy[NFTA_REJECT_MAX + 1] = {
|
||||
};
|
||||
EXPORT_SYMBOL_GPL(nft_reject_policy);
|
||||
|
||||
int nft_reject_validate(const struct nft_ctx *ctx,
|
||||
const struct nft_expr *expr,
|
||||
const struct nft_data **data)
|
||||
{
|
||||
return nft_chain_validate_hooks(ctx->chain,
|
||||
(1 << NF_INET_LOCAL_IN) |
|
||||
(1 << NF_INET_FORWARD) |
|
||||
(1 << NF_INET_LOCAL_OUT));
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(nft_reject_validate);
|
||||
|
||||
int nft_reject_init(const struct nft_ctx *ctx,
|
||||
const struct nft_expr *expr,
|
||||
const struct nlattr * const tb[])
|
||||
{
|
||||
struct nft_reject *priv = nft_expr_priv(expr);
|
||||
int err;
|
||||
|
||||
err = nft_reject_validate(ctx, expr, NULL);
|
||||
if (err < 0)
|
||||
return err;
|
||||
|
||||
if (tb[NFTA_REJECT_TYPE] == NULL)
|
||||
return -EINVAL;
|
||||
|
||||
@@ -66,7 +66,11 @@ static int nft_reject_inet_init(const struct nft_ctx *ctx,
|
||||
const struct nlattr * const tb[])
|
||||
{
|
||||
struct nft_reject *priv = nft_expr_priv(expr);
|
||||
int icmp_code;
|
||||
int icmp_code, err;
|
||||
|
||||
err = nft_reject_validate(ctx, expr, NULL);
|
||||
if (err < 0)
|
||||
return err;
|
||||
|
||||
if (tb[NFTA_REJECT_TYPE] == NULL)
|
||||
return -EINVAL;
|
||||
@@ -124,6 +128,7 @@ static const struct nft_expr_ops nft_reject_inet_ops = {
|
||||
.eval = nft_reject_inet_eval,
|
||||
.init = nft_reject_inet_init,
|
||||
.dump = nft_reject_inet_dump,
|
||||
.validate = nft_reject_validate,
|
||||
};
|
||||
|
||||
static struct nft_expr_type nft_reject_inet_type __read_mostly = {
|
||||
|
||||
@@ -68,7 +68,7 @@ match_packet(const struct sk_buff *skb,
|
||||
++i, offset, sch->type, htons(sch->length),
|
||||
sch->flags);
|
||||
#endif
|
||||
offset += WORD_ROUND(ntohs(sch->length));
|
||||
offset += SCTP_PAD4(ntohs(sch->length));
|
||||
|
||||
pr_debug("skb->len: %d\toffset: %d\n", skb->len, offset);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user