mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-08-21 16:29:59 +00:00
Merge git://git.kernel.org/pub/scm/linux/kernel/git/pablo/nf
Pablo Neira Ayuso says: ==================== Netfilter fixes for net The following patchset contains Netfilter fixes for you net tree: 1) Remove duplicated include at the end of UDP conntrack, from Yue Haibing. 2) Restore conntrack dependency on xt_cluster, from Martin Willi. 3) Fix splat with GSO skbs from the checksum target, from Florian Westphal. 4) Rework ct timeout support, the template strategy to attach custom timeouts is not correct since it will not work in conjunction with conntrack zones and we have a possible free after use when removing the rule due to missing refcounting. To fix these problems, do not use conntrack template at all and set custom timeout on the already valid conntrack object. This fix comes with a preparation patch to simplify timeout adjustment by initializating the first position of the timeout array for all of the existing trackers. Patchset from Florian Westphal. 5) Fix missing dependency on from IPv4 chain NAT type, from Florian. 6) Release chain reference counter from the flush path, from Taehee Yoo. 7) After flushing an iptables ruleset, conntrack hooks are unregistered and entries are left stale to be cleaned up by the timeout garbage collector. No TCP tracking is done on established flows by this time. If ruleset is reloaded, then hooks are registered again and TCP tracking is restored, which considers packets to be invalid. Clear window tracking to exercise TCP flow pickup from the middle given that history is lost for us. Again from Florian. 8) Fix crash from netlink interface with CONFIG_NF_CONNTRACK_TIMEOUT=y and CONFIG_NF_CT_NETLINK_TIMEOUT=n. 9) Broken CT target due to returning incorrect type from ctnl_timeout_find_get(). 10) Solve conntrack clash on NF_REPEAT verdicts too, from Michal Vaner. 11) Missing conversion of hashlimit sysctl interface to new API, from Cong Wang. ==================== Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
commit
4ecdf77091
19 changed files with 181 additions and 100 deletions
|
@ -30,7 +30,7 @@ struct nf_conn_timeout {
|
|||
};
|
||||
|
||||
static inline unsigned int *
|
||||
nf_ct_timeout_data(struct nf_conn_timeout *t)
|
||||
nf_ct_timeout_data(const struct nf_conn_timeout *t)
|
||||
{
|
||||
struct nf_ct_timeout *timeout;
|
||||
|
||||
|
|
|
@ -106,6 +106,10 @@ config NF_NAT_IPV4
|
|||
|
||||
if NF_NAT_IPV4
|
||||
|
||||
config NF_NAT_MASQUERADE_IPV4
|
||||
bool
|
||||
|
||||
if NF_TABLES
|
||||
config NFT_CHAIN_NAT_IPV4
|
||||
depends on NF_TABLES_IPV4
|
||||
tristate "IPv4 nf_tables nat chain support"
|
||||
|
@ -115,9 +119,6 @@ config NFT_CHAIN_NAT_IPV4
|
|||
packet transformations such as the source, destination address and
|
||||
source and destination ports.
|
||||
|
||||
config NF_NAT_MASQUERADE_IPV4
|
||||
bool
|
||||
|
||||
config NFT_MASQ_IPV4
|
||||
tristate "IPv4 masquerading support for nf_tables"
|
||||
depends on NF_TABLES_IPV4
|
||||
|
@ -135,6 +136,7 @@ config NFT_REDIR_IPV4
|
|||
help
|
||||
This is the expression that provides IPv4 redirect support for
|
||||
nf_tables.
|
||||
endif # NF_TABLES
|
||||
|
||||
config NF_NAT_SNMP_BASIC
|
||||
tristate "Basic SNMP-ALG support"
|
||||
|
|
|
@ -771,13 +771,13 @@ config NETFILTER_XT_TARGET_CHECKSUM
|
|||
depends on NETFILTER_ADVANCED
|
||||
---help---
|
||||
This option adds a `CHECKSUM' target, which can be used in the iptables mangle
|
||||
table.
|
||||
table to work around buggy DHCP clients in virtualized environments.
|
||||
|
||||
You can use this target to compute and fill in the checksum in
|
||||
a packet that lacks a checksum. This is particularly useful,
|
||||
if you need to work around old applications such as dhcp clients,
|
||||
that do not work well with checksum offloads, but don't want to disable
|
||||
checksum offload in your device.
|
||||
Some old DHCP clients drop packets because they are not aware
|
||||
that the checksum would normally be offloaded to hardware and
|
||||
thus should be considered valid.
|
||||
This target can be used to fill in the checksum using iptables
|
||||
when such packets are sent via a virtual network device.
|
||||
|
||||
To compile it as a module, choose M here. If unsure, say N.
|
||||
|
||||
|
|
|
@ -776,9 +776,26 @@ static const struct nf_hook_ops ipv6_conntrack_ops[] = {
|
|||
};
|
||||
#endif
|
||||
|
||||
static int nf_ct_tcp_fixup(struct nf_conn *ct, void *_nfproto)
|
||||
{
|
||||
u8 nfproto = (unsigned long)_nfproto;
|
||||
|
||||
if (nf_ct_l3num(ct) != nfproto)
|
||||
return 0;
|
||||
|
||||
if (nf_ct_protonum(ct) == IPPROTO_TCP &&
|
||||
ct->proto.tcp.state == TCP_CONNTRACK_ESTABLISHED) {
|
||||
ct->proto.tcp.seen[0].td_maxwin = 0;
|
||||
ct->proto.tcp.seen[1].td_maxwin = 0;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int nf_ct_netns_do_get(struct net *net, u8 nfproto)
|
||||
{
|
||||
struct nf_conntrack_net *cnet = net_generic(net, nf_conntrack_net_id);
|
||||
bool fixup_needed = false;
|
||||
int err = 0;
|
||||
|
||||
mutex_lock(&nf_ct_proto_mutex);
|
||||
|
@ -798,6 +815,8 @@ static int nf_ct_netns_do_get(struct net *net, u8 nfproto)
|
|||
ARRAY_SIZE(ipv4_conntrack_ops));
|
||||
if (err)
|
||||
cnet->users4 = 0;
|
||||
else
|
||||
fixup_needed = true;
|
||||
break;
|
||||
#if IS_ENABLED(CONFIG_IPV6)
|
||||
case NFPROTO_IPV6:
|
||||
|
@ -814,6 +833,8 @@ static int nf_ct_netns_do_get(struct net *net, u8 nfproto)
|
|||
ARRAY_SIZE(ipv6_conntrack_ops));
|
||||
if (err)
|
||||
cnet->users6 = 0;
|
||||
else
|
||||
fixup_needed = true;
|
||||
break;
|
||||
#endif
|
||||
default:
|
||||
|
@ -822,6 +843,11 @@ static int nf_ct_netns_do_get(struct net *net, u8 nfproto)
|
|||
}
|
||||
out_unlock:
|
||||
mutex_unlock(&nf_ct_proto_mutex);
|
||||
|
||||
if (fixup_needed)
|
||||
nf_ct_iterate_cleanup_net(net, nf_ct_tcp_fixup,
|
||||
(void *)(unsigned long)nfproto, 0, 0);
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
|
|
|
@ -675,7 +675,7 @@ static int nlattr_to_dccp(struct nlattr *cda[], struct nf_conn *ct)
|
|||
}
|
||||
#endif
|
||||
|
||||
#if IS_ENABLED(CONFIG_NF_CT_NETLINK_TIMEOUT)
|
||||
#ifdef CONFIG_NF_CONNTRACK_TIMEOUT
|
||||
|
||||
#include <linux/netfilter/nfnetlink.h>
|
||||
#include <linux/netfilter/nfnetlink_cttimeout.h>
|
||||
|
@ -697,6 +697,8 @@ static int dccp_timeout_nlattr_to_obj(struct nlattr *tb[],
|
|||
timeouts[i] = ntohl(nla_get_be32(tb[i])) * HZ;
|
||||
}
|
||||
}
|
||||
|
||||
timeouts[CTA_TIMEOUT_DCCP_UNSPEC] = timeouts[CTA_TIMEOUT_DCCP_REQUEST];
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -726,7 +728,7 @@ dccp_timeout_nla_policy[CTA_TIMEOUT_DCCP_MAX+1] = {
|
|||
[CTA_TIMEOUT_DCCP_CLOSING] = { .type = NLA_U32 },
|
||||
[CTA_TIMEOUT_DCCP_TIMEWAIT] = { .type = NLA_U32 },
|
||||
};
|
||||
#endif /* CONFIG_NF_CT_NETLINK_TIMEOUT */
|
||||
#endif /* CONFIG_NF_CONNTRACK_TIMEOUT */
|
||||
|
||||
#ifdef CONFIG_SYSCTL
|
||||
/* template, data assigned later */
|
||||
|
@ -827,6 +829,11 @@ static int dccp_init_net(struct net *net, u_int16_t proto)
|
|||
dn->dccp_timeout[CT_DCCP_CLOSEREQ] = 64 * HZ;
|
||||
dn->dccp_timeout[CT_DCCP_CLOSING] = 64 * HZ;
|
||||
dn->dccp_timeout[CT_DCCP_TIMEWAIT] = 2 * DCCP_MSL;
|
||||
|
||||
/* timeouts[0] is unused, make it same as SYN_SENT so
|
||||
* ->timeouts[0] contains 'new' timeout, like udp or icmp.
|
||||
*/
|
||||
dn->dccp_timeout[CT_DCCP_NONE] = dn->dccp_timeout[CT_DCCP_REQUEST];
|
||||
}
|
||||
|
||||
return dccp_kmemdup_sysctl_table(net, pn, dn);
|
||||
|
@ -856,7 +863,7 @@ const struct nf_conntrack_l4proto nf_conntrack_l4proto_dccp4 = {
|
|||
.nlattr_to_tuple = nf_ct_port_nlattr_to_tuple,
|
||||
.nla_policy = nf_ct_port_nla_policy,
|
||||
#endif
|
||||
#if IS_ENABLED(CONFIG_NF_CT_NETLINK_TIMEOUT)
|
||||
#ifdef CONFIG_NF_CONNTRACK_TIMEOUT
|
||||
.ctnl_timeout = {
|
||||
.nlattr_to_obj = dccp_timeout_nlattr_to_obj,
|
||||
.obj_to_nlattr = dccp_timeout_obj_to_nlattr,
|
||||
|
@ -864,7 +871,7 @@ const struct nf_conntrack_l4proto nf_conntrack_l4proto_dccp4 = {
|
|||
.obj_size = sizeof(unsigned int) * CT_DCCP_MAX,
|
||||
.nla_policy = dccp_timeout_nla_policy,
|
||||
},
|
||||
#endif /* CONFIG_NF_CT_NETLINK_TIMEOUT */
|
||||
#endif /* CONFIG_NF_CONNTRACK_TIMEOUT */
|
||||
.init_net = dccp_init_net,
|
||||
.get_net_proto = dccp_get_net_proto,
|
||||
};
|
||||
|
@ -889,7 +896,7 @@ const struct nf_conntrack_l4proto nf_conntrack_l4proto_dccp6 = {
|
|||
.nlattr_to_tuple = nf_ct_port_nlattr_to_tuple,
|
||||
.nla_policy = nf_ct_port_nla_policy,
|
||||
#endif
|
||||
#if IS_ENABLED(CONFIG_NF_CT_NETLINK_TIMEOUT)
|
||||
#ifdef CONFIG_NF_CONNTRACK_TIMEOUT
|
||||
.ctnl_timeout = {
|
||||
.nlattr_to_obj = dccp_timeout_nlattr_to_obj,
|
||||
.obj_to_nlattr = dccp_timeout_obj_to_nlattr,
|
||||
|
@ -897,7 +904,7 @@ const struct nf_conntrack_l4proto nf_conntrack_l4proto_dccp6 = {
|
|||
.obj_size = sizeof(unsigned int) * CT_DCCP_MAX,
|
||||
.nla_policy = dccp_timeout_nla_policy,
|
||||
},
|
||||
#endif /* CONFIG_NF_CT_NETLINK_TIMEOUT */
|
||||
#endif /* CONFIG_NF_CONNTRACK_TIMEOUT */
|
||||
.init_net = dccp_init_net,
|
||||
.get_net_proto = dccp_get_net_proto,
|
||||
};
|
||||
|
|
|
@ -70,7 +70,7 @@ static bool generic_new(struct nf_conn *ct, const struct sk_buff *skb,
|
|||
return ret;
|
||||
}
|
||||
|
||||
#if IS_ENABLED(CONFIG_NF_CT_NETLINK_TIMEOUT)
|
||||
#ifdef CONFIG_NF_CONNTRACK_TIMEOUT
|
||||
|
||||
#include <linux/netfilter/nfnetlink.h>
|
||||
#include <linux/netfilter/nfnetlink_cttimeout.h>
|
||||
|
@ -113,7 +113,7 @@ static const struct nla_policy
|
|||
generic_timeout_nla_policy[CTA_TIMEOUT_GENERIC_MAX+1] = {
|
||||
[CTA_TIMEOUT_GENERIC_TIMEOUT] = { .type = NLA_U32 },
|
||||
};
|
||||
#endif /* CONFIG_NF_CT_NETLINK_TIMEOUT */
|
||||
#endif /* CONFIG_NF_CONNTRACK_TIMEOUT */
|
||||
|
||||
#ifdef CONFIG_SYSCTL
|
||||
static struct ctl_table generic_sysctl_table[] = {
|
||||
|
@ -164,7 +164,7 @@ const struct nf_conntrack_l4proto nf_conntrack_l4proto_generic =
|
|||
.pkt_to_tuple = generic_pkt_to_tuple,
|
||||
.packet = generic_packet,
|
||||
.new = generic_new,
|
||||
#if IS_ENABLED(CONFIG_NF_CT_NETLINK_TIMEOUT)
|
||||
#ifdef CONFIG_NF_CONNTRACK_TIMEOUT
|
||||
.ctnl_timeout = {
|
||||
.nlattr_to_obj = generic_timeout_nlattr_to_obj,
|
||||
.obj_to_nlattr = generic_timeout_obj_to_nlattr,
|
||||
|
@ -172,7 +172,7 @@ const struct nf_conntrack_l4proto nf_conntrack_l4proto_generic =
|
|||
.obj_size = sizeof(unsigned int),
|
||||
.nla_policy = generic_timeout_nla_policy,
|
||||
},
|
||||
#endif /* CONFIG_NF_CT_NETLINK_TIMEOUT */
|
||||
#endif /* CONFIG_NF_CONNTRACK_TIMEOUT */
|
||||
.init_net = generic_init_net,
|
||||
.get_net_proto = generic_get_net_proto,
|
||||
};
|
||||
|
|
|
@ -285,7 +285,7 @@ static void gre_destroy(struct nf_conn *ct)
|
|||
nf_ct_gre_keymap_destroy(master);
|
||||
}
|
||||
|
||||
#if IS_ENABLED(CONFIG_NF_CT_NETLINK_TIMEOUT)
|
||||
#ifdef CONFIG_NF_CONNTRACK_TIMEOUT
|
||||
|
||||
#include <linux/netfilter/nfnetlink.h>
|
||||
#include <linux/netfilter/nfnetlink_cttimeout.h>
|
||||
|
@ -334,7 +334,7 @@ gre_timeout_nla_policy[CTA_TIMEOUT_GRE_MAX+1] = {
|
|||
[CTA_TIMEOUT_GRE_UNREPLIED] = { .type = NLA_U32 },
|
||||
[CTA_TIMEOUT_GRE_REPLIED] = { .type = NLA_U32 },
|
||||
};
|
||||
#endif /* CONFIG_NF_CT_NETLINK_TIMEOUT */
|
||||
#endif /* CONFIG_NF_CONNTRACK_TIMEOUT */
|
||||
|
||||
static int gre_init_net(struct net *net, u_int16_t proto)
|
||||
{
|
||||
|
@ -367,7 +367,7 @@ static const struct nf_conntrack_l4proto nf_conntrack_l4proto_gre4 = {
|
|||
.nlattr_to_tuple = nf_ct_port_nlattr_to_tuple,
|
||||
.nla_policy = nf_ct_port_nla_policy,
|
||||
#endif
|
||||
#if IS_ENABLED(CONFIG_NF_CT_NETLINK_TIMEOUT)
|
||||
#ifdef CONFIG_NF_CONNTRACK_TIMEOUT
|
||||
.ctnl_timeout = {
|
||||
.nlattr_to_obj = gre_timeout_nlattr_to_obj,
|
||||
.obj_to_nlattr = gre_timeout_obj_to_nlattr,
|
||||
|
@ -375,7 +375,7 @@ static const struct nf_conntrack_l4proto nf_conntrack_l4proto_gre4 = {
|
|||
.obj_size = sizeof(unsigned int) * GRE_CT_MAX,
|
||||
.nla_policy = gre_timeout_nla_policy,
|
||||
},
|
||||
#endif /* CONFIG_NF_CT_NETLINK_TIMEOUT */
|
||||
#endif /* CONFIG_NF_CONNTRACK_TIMEOUT */
|
||||
.net_id = &proto_gre_net_id,
|
||||
.init_net = gre_init_net,
|
||||
};
|
||||
|
|
|
@ -273,7 +273,7 @@ static unsigned int icmp_nlattr_tuple_size(void)
|
|||
}
|
||||
#endif
|
||||
|
||||
#if IS_ENABLED(CONFIG_NF_CT_NETLINK_TIMEOUT)
|
||||
#ifdef CONFIG_NF_CONNTRACK_TIMEOUT
|
||||
|
||||
#include <linux/netfilter/nfnetlink.h>
|
||||
#include <linux/netfilter/nfnetlink_cttimeout.h>
|
||||
|
@ -313,7 +313,7 @@ static const struct nla_policy
|
|||
icmp_timeout_nla_policy[CTA_TIMEOUT_ICMP_MAX+1] = {
|
||||
[CTA_TIMEOUT_ICMP_TIMEOUT] = { .type = NLA_U32 },
|
||||
};
|
||||
#endif /* CONFIG_NF_CT_NETLINK_TIMEOUT */
|
||||
#endif /* CONFIG_NF_CONNTRACK_TIMEOUT */
|
||||
|
||||
#ifdef CONFIG_SYSCTL
|
||||
static struct ctl_table icmp_sysctl_table[] = {
|
||||
|
@ -374,7 +374,7 @@ const struct nf_conntrack_l4proto nf_conntrack_l4proto_icmp =
|
|||
.nlattr_to_tuple = icmp_nlattr_to_tuple,
|
||||
.nla_policy = icmp_nla_policy,
|
||||
#endif
|
||||
#if IS_ENABLED(CONFIG_NF_CT_NETLINK_TIMEOUT)
|
||||
#ifdef CONFIG_NF_CONNTRACK_TIMEOUT
|
||||
.ctnl_timeout = {
|
||||
.nlattr_to_obj = icmp_timeout_nlattr_to_obj,
|
||||
.obj_to_nlattr = icmp_timeout_obj_to_nlattr,
|
||||
|
@ -382,7 +382,7 @@ const struct nf_conntrack_l4proto nf_conntrack_l4proto_icmp =
|
|||
.obj_size = sizeof(unsigned int),
|
||||
.nla_policy = icmp_timeout_nla_policy,
|
||||
},
|
||||
#endif /* CONFIG_NF_CT_NETLINK_TIMEOUT */
|
||||
#endif /* CONFIG_NF_CONNTRACK_TIMEOUT */
|
||||
.init_net = icmp_init_net,
|
||||
.get_net_proto = icmp_get_net_proto,
|
||||
};
|
||||
|
|
|
@ -274,7 +274,7 @@ static unsigned int icmpv6_nlattr_tuple_size(void)
|
|||
}
|
||||
#endif
|
||||
|
||||
#if IS_ENABLED(CONFIG_NF_CT_NETLINK_TIMEOUT)
|
||||
#ifdef CONFIG_NF_CONNTRACK_TIMEOUT
|
||||
|
||||
#include <linux/netfilter/nfnetlink.h>
|
||||
#include <linux/netfilter/nfnetlink_cttimeout.h>
|
||||
|
@ -314,7 +314,7 @@ static const struct nla_policy
|
|||
icmpv6_timeout_nla_policy[CTA_TIMEOUT_ICMPV6_MAX+1] = {
|
||||
[CTA_TIMEOUT_ICMPV6_TIMEOUT] = { .type = NLA_U32 },
|
||||
};
|
||||
#endif /* CONFIG_NF_CT_NETLINK_TIMEOUT */
|
||||
#endif /* CONFIG_NF_CONNTRACK_TIMEOUT */
|
||||
|
||||
#ifdef CONFIG_SYSCTL
|
||||
static struct ctl_table icmpv6_sysctl_table[] = {
|
||||
|
@ -373,7 +373,7 @@ const struct nf_conntrack_l4proto nf_conntrack_l4proto_icmpv6 =
|
|||
.nlattr_to_tuple = icmpv6_nlattr_to_tuple,
|
||||
.nla_policy = icmpv6_nla_policy,
|
||||
#endif
|
||||
#if IS_ENABLED(CONFIG_NF_CT_NETLINK_TIMEOUT)
|
||||
#ifdef CONFIG_NF_CONNTRACK_TIMEOUT
|
||||
.ctnl_timeout = {
|
||||
.nlattr_to_obj = icmpv6_timeout_nlattr_to_obj,
|
||||
.obj_to_nlattr = icmpv6_timeout_obj_to_nlattr,
|
||||
|
@ -381,7 +381,7 @@ const struct nf_conntrack_l4proto nf_conntrack_l4proto_icmpv6 =
|
|||
.obj_size = sizeof(unsigned int),
|
||||
.nla_policy = icmpv6_timeout_nla_policy,
|
||||
},
|
||||
#endif /* CONFIG_NF_CT_NETLINK_TIMEOUT */
|
||||
#endif /* CONFIG_NF_CONNTRACK_TIMEOUT */
|
||||
.init_net = icmpv6_init_net,
|
||||
.get_net_proto = icmpv6_get_net_proto,
|
||||
};
|
||||
|
|
|
@ -591,7 +591,7 @@ static int nlattr_to_sctp(struct nlattr *cda[], struct nf_conn *ct)
|
|||
}
|
||||
#endif
|
||||
|
||||
#if IS_ENABLED(CONFIG_NF_CT_NETLINK_TIMEOUT)
|
||||
#ifdef CONFIG_NF_CONNTRACK_TIMEOUT
|
||||
|
||||
#include <linux/netfilter/nfnetlink.h>
|
||||
#include <linux/netfilter/nfnetlink_cttimeout.h>
|
||||
|
@ -613,6 +613,8 @@ static int sctp_timeout_nlattr_to_obj(struct nlattr *tb[],
|
|||
timeouts[i] = ntohl(nla_get_be32(tb[i])) * HZ;
|
||||
}
|
||||
}
|
||||
|
||||
timeouts[CTA_TIMEOUT_SCTP_UNSPEC] = timeouts[CTA_TIMEOUT_SCTP_CLOSED];
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -644,7 +646,7 @@ sctp_timeout_nla_policy[CTA_TIMEOUT_SCTP_MAX+1] = {
|
|||
[CTA_TIMEOUT_SCTP_HEARTBEAT_SENT] = { .type = NLA_U32 },
|
||||
[CTA_TIMEOUT_SCTP_HEARTBEAT_ACKED] = { .type = NLA_U32 },
|
||||
};
|
||||
#endif /* CONFIG_NF_CT_NETLINK_TIMEOUT */
|
||||
#endif /* CONFIG_NF_CONNTRACK_TIMEOUT */
|
||||
|
||||
|
||||
#ifdef CONFIG_SYSCTL
|
||||
|
@ -743,6 +745,11 @@ static int sctp_init_net(struct net *net, u_int16_t proto)
|
|||
|
||||
for (i = 0; i < SCTP_CONNTRACK_MAX; i++)
|
||||
sn->timeouts[i] = sctp_timeouts[i];
|
||||
|
||||
/* timeouts[0] is unused, init it so ->timeouts[0] contains
|
||||
* 'new' timeout, like udp or icmp.
|
||||
*/
|
||||
sn->timeouts[0] = sctp_timeouts[SCTP_CONNTRACK_CLOSED];
|
||||
}
|
||||
|
||||
return sctp_kmemdup_sysctl_table(pn, sn);
|
||||
|
@ -773,7 +780,7 @@ const struct nf_conntrack_l4proto nf_conntrack_l4proto_sctp4 = {
|
|||
.nlattr_to_tuple = nf_ct_port_nlattr_to_tuple,
|
||||
.nla_policy = nf_ct_port_nla_policy,
|
||||
#endif
|
||||
#if IS_ENABLED(CONFIG_NF_CT_NETLINK_TIMEOUT)
|
||||
#ifdef CONFIG_NF_CONNTRACK_TIMEOUT
|
||||
.ctnl_timeout = {
|
||||
.nlattr_to_obj = sctp_timeout_nlattr_to_obj,
|
||||
.obj_to_nlattr = sctp_timeout_obj_to_nlattr,
|
||||
|
@ -781,7 +788,7 @@ const struct nf_conntrack_l4proto nf_conntrack_l4proto_sctp4 = {
|
|||
.obj_size = sizeof(unsigned int) * SCTP_CONNTRACK_MAX,
|
||||
.nla_policy = sctp_timeout_nla_policy,
|
||||
},
|
||||
#endif /* CONFIG_NF_CT_NETLINK_TIMEOUT */
|
||||
#endif /* CONFIG_NF_CONNTRACK_TIMEOUT */
|
||||
.init_net = sctp_init_net,
|
||||
.get_net_proto = sctp_get_net_proto,
|
||||
};
|
||||
|
@ -806,7 +813,8 @@ const struct nf_conntrack_l4proto nf_conntrack_l4proto_sctp6 = {
|
|||
.nlattr_tuple_size = nf_ct_port_nlattr_tuple_size,
|
||||
.nlattr_to_tuple = nf_ct_port_nlattr_to_tuple,
|
||||
.nla_policy = nf_ct_port_nla_policy,
|
||||
#if IS_ENABLED(CONFIG_NF_CT_NETLINK_TIMEOUT)
|
||||
#endif
|
||||
#ifdef CONFIG_NF_CONNTRACK_TIMEOUT
|
||||
.ctnl_timeout = {
|
||||
.nlattr_to_obj = sctp_timeout_nlattr_to_obj,
|
||||
.obj_to_nlattr = sctp_timeout_obj_to_nlattr,
|
||||
|
@ -814,8 +822,7 @@ const struct nf_conntrack_l4proto nf_conntrack_l4proto_sctp6 = {
|
|||
.obj_size = sizeof(unsigned int) * SCTP_CONNTRACK_MAX,
|
||||
.nla_policy = sctp_timeout_nla_policy,
|
||||
},
|
||||
#endif /* CONFIG_NF_CT_NETLINK_TIMEOUT */
|
||||
#endif
|
||||
#endif /* CONFIG_NF_CONNTRACK_TIMEOUT */
|
||||
.init_net = sctp_init_net,
|
||||
.get_net_proto = sctp_get_net_proto,
|
||||
};
|
||||
|
|
|
@ -1279,7 +1279,7 @@ static unsigned int tcp_nlattr_tuple_size(void)
|
|||
}
|
||||
#endif
|
||||
|
||||
#if IS_ENABLED(CONFIG_NF_CT_NETLINK_TIMEOUT)
|
||||
#ifdef CONFIG_NF_CONNTRACK_TIMEOUT
|
||||
|
||||
#include <linux/netfilter/nfnetlink.h>
|
||||
#include <linux/netfilter/nfnetlink_cttimeout.h>
|
||||
|
@ -1301,6 +1301,7 @@ static int tcp_timeout_nlattr_to_obj(struct nlattr *tb[],
|
|||
timeouts[TCP_CONNTRACK_SYN_SENT] =
|
||||
ntohl(nla_get_be32(tb[CTA_TIMEOUT_TCP_SYN_SENT]))*HZ;
|
||||
}
|
||||
|
||||
if (tb[CTA_TIMEOUT_TCP_SYN_RECV]) {
|
||||
timeouts[TCP_CONNTRACK_SYN_RECV] =
|
||||
ntohl(nla_get_be32(tb[CTA_TIMEOUT_TCP_SYN_RECV]))*HZ;
|
||||
|
@ -1341,6 +1342,8 @@ static int tcp_timeout_nlattr_to_obj(struct nlattr *tb[],
|
|||
timeouts[TCP_CONNTRACK_UNACK] =
|
||||
ntohl(nla_get_be32(tb[CTA_TIMEOUT_TCP_UNACK]))*HZ;
|
||||
}
|
||||
|
||||
timeouts[CTA_TIMEOUT_TCP_UNSPEC] = timeouts[CTA_TIMEOUT_TCP_SYN_SENT];
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -1391,7 +1394,7 @@ static const struct nla_policy tcp_timeout_nla_policy[CTA_TIMEOUT_TCP_MAX+1] = {
|
|||
[CTA_TIMEOUT_TCP_RETRANS] = { .type = NLA_U32 },
|
||||
[CTA_TIMEOUT_TCP_UNACK] = { .type = NLA_U32 },
|
||||
};
|
||||
#endif /* CONFIG_NF_CT_NETLINK_TIMEOUT */
|
||||
#endif /* CONFIG_NF_CONNTRACK_TIMEOUT */
|
||||
|
||||
#ifdef CONFIG_SYSCTL
|
||||
static struct ctl_table tcp_sysctl_table[] = {
|
||||
|
@ -1518,6 +1521,10 @@ static int tcp_init_net(struct net *net, u_int16_t proto)
|
|||
for (i = 0; i < TCP_CONNTRACK_TIMEOUT_MAX; i++)
|
||||
tn->timeouts[i] = tcp_timeouts[i];
|
||||
|
||||
/* timeouts[0] is unused, make it same as SYN_SENT so
|
||||
* ->timeouts[0] contains 'new' timeout, like udp or icmp.
|
||||
*/
|
||||
tn->timeouts[0] = tcp_timeouts[TCP_CONNTRACK_SYN_SENT];
|
||||
tn->tcp_loose = nf_ct_tcp_loose;
|
||||
tn->tcp_be_liberal = nf_ct_tcp_be_liberal;
|
||||
tn->tcp_max_retrans = nf_ct_tcp_max_retrans;
|
||||
|
@ -1551,7 +1558,7 @@ const struct nf_conntrack_l4proto nf_conntrack_l4proto_tcp4 =
|
|||
.nlattr_size = TCP_NLATTR_SIZE,
|
||||
.nla_policy = nf_ct_port_nla_policy,
|
||||
#endif
|
||||
#if IS_ENABLED(CONFIG_NF_CT_NETLINK_TIMEOUT)
|
||||
#ifdef CONFIG_NF_CONNTRACK_TIMEOUT
|
||||
.ctnl_timeout = {
|
||||
.nlattr_to_obj = tcp_timeout_nlattr_to_obj,
|
||||
.obj_to_nlattr = tcp_timeout_obj_to_nlattr,
|
||||
|
@ -1560,7 +1567,7 @@ const struct nf_conntrack_l4proto nf_conntrack_l4proto_tcp4 =
|
|||
TCP_CONNTRACK_TIMEOUT_MAX,
|
||||
.nla_policy = tcp_timeout_nla_policy,
|
||||
},
|
||||
#endif /* CONFIG_NF_CT_NETLINK_TIMEOUT */
|
||||
#endif /* CONFIG_NF_CONNTRACK_TIMEOUT */
|
||||
.init_net = tcp_init_net,
|
||||
.get_net_proto = tcp_get_net_proto,
|
||||
};
|
||||
|
@ -1586,7 +1593,7 @@ const struct nf_conntrack_l4proto nf_conntrack_l4proto_tcp6 =
|
|||
.nlattr_tuple_size = tcp_nlattr_tuple_size,
|
||||
.nla_policy = nf_ct_port_nla_policy,
|
||||
#endif
|
||||
#if IS_ENABLED(CONFIG_NF_CT_NETLINK_TIMEOUT)
|
||||
#ifdef CONFIG_NF_CONNTRACK_TIMEOUT
|
||||
.ctnl_timeout = {
|
||||
.nlattr_to_obj = tcp_timeout_nlattr_to_obj,
|
||||
.obj_to_nlattr = tcp_timeout_obj_to_nlattr,
|
||||
|
@ -1595,7 +1602,7 @@ const struct nf_conntrack_l4proto nf_conntrack_l4proto_tcp6 =
|
|||
TCP_CONNTRACK_TIMEOUT_MAX,
|
||||
.nla_policy = tcp_timeout_nla_policy,
|
||||
},
|
||||
#endif /* CONFIG_NF_CT_NETLINK_TIMEOUT */
|
||||
#endif /* CONFIG_NF_CONNTRACK_TIMEOUT */
|
||||
.init_net = tcp_init_net,
|
||||
.get_net_proto = tcp_get_net_proto,
|
||||
};
|
||||
|
|
|
@ -171,7 +171,7 @@ static int udp_error(struct net *net, struct nf_conn *tmpl, struct sk_buff *skb,
|
|||
return NF_ACCEPT;
|
||||
}
|
||||
|
||||
#if IS_ENABLED(CONFIG_NF_CT_NETLINK_TIMEOUT)
|
||||
#ifdef CONFIG_NF_CONNTRACK_TIMEOUT
|
||||
|
||||
#include <linux/netfilter/nfnetlink.h>
|
||||
#include <linux/netfilter/nfnetlink_cttimeout.h>
|
||||
|
@ -221,7 +221,7 @@ udp_timeout_nla_policy[CTA_TIMEOUT_UDP_MAX+1] = {
|
|||
[CTA_TIMEOUT_UDP_UNREPLIED] = { .type = NLA_U32 },
|
||||
[CTA_TIMEOUT_UDP_REPLIED] = { .type = NLA_U32 },
|
||||
};
|
||||
#endif /* CONFIG_NF_CT_NETLINK_TIMEOUT */
|
||||
#endif /* CONFIG_NF_CONNTRACK_TIMEOUT */
|
||||
|
||||
#ifdef CONFIG_SYSCTL
|
||||
static struct ctl_table udp_sysctl_table[] = {
|
||||
|
@ -292,7 +292,7 @@ const struct nf_conntrack_l4proto nf_conntrack_l4proto_udp4 =
|
|||
.nlattr_tuple_size = nf_ct_port_nlattr_tuple_size,
|
||||
.nla_policy = nf_ct_port_nla_policy,
|
||||
#endif
|
||||
#if IS_ENABLED(CONFIG_NF_CT_NETLINK_TIMEOUT)
|
||||
#ifdef CONFIG_NF_CONNTRACK_TIMEOUT
|
||||
.ctnl_timeout = {
|
||||
.nlattr_to_obj = udp_timeout_nlattr_to_obj,
|
||||
.obj_to_nlattr = udp_timeout_obj_to_nlattr,
|
||||
|
@ -300,7 +300,7 @@ const struct nf_conntrack_l4proto nf_conntrack_l4proto_udp4 =
|
|||
.obj_size = sizeof(unsigned int) * CTA_TIMEOUT_UDP_MAX,
|
||||
.nla_policy = udp_timeout_nla_policy,
|
||||
},
|
||||
#endif /* CONFIG_NF_CT_NETLINK_TIMEOUT */
|
||||
#endif /* CONFIG_NF_CONNTRACK_TIMEOUT */
|
||||
.init_net = udp_init_net,
|
||||
.get_net_proto = udp_get_net_proto,
|
||||
};
|
||||
|
@ -321,7 +321,7 @@ const struct nf_conntrack_l4proto nf_conntrack_l4proto_udplite4 =
|
|||
.nlattr_tuple_size = nf_ct_port_nlattr_tuple_size,
|
||||
.nla_policy = nf_ct_port_nla_policy,
|
||||
#endif
|
||||
#if IS_ENABLED(CONFIG_NF_CT_NETLINK_TIMEOUT)
|
||||
#ifdef CONFIG_NF_CONNTRACK_TIMEOUT
|
||||
.ctnl_timeout = {
|
||||
.nlattr_to_obj = udp_timeout_nlattr_to_obj,
|
||||
.obj_to_nlattr = udp_timeout_obj_to_nlattr,
|
||||
|
@ -329,7 +329,7 @@ const struct nf_conntrack_l4proto nf_conntrack_l4proto_udplite4 =
|
|||
.obj_size = sizeof(unsigned int) * CTA_TIMEOUT_UDP_MAX,
|
||||
.nla_policy = udp_timeout_nla_policy,
|
||||
},
|
||||
#endif /* CONFIG_NF_CT_NETLINK_TIMEOUT */
|
||||
#endif /* CONFIG_NF_CONNTRACK_TIMEOUT */
|
||||
.init_net = udp_init_net,
|
||||
.get_net_proto = udp_get_net_proto,
|
||||
};
|
||||
|
@ -350,7 +350,7 @@ const struct nf_conntrack_l4proto nf_conntrack_l4proto_udp6 =
|
|||
.nlattr_tuple_size = nf_ct_port_nlattr_tuple_size,
|
||||
.nla_policy = nf_ct_port_nla_policy,
|
||||
#endif
|
||||
#if IS_ENABLED(CONFIG_NF_CT_NETLINK_TIMEOUT)
|
||||
#ifdef CONFIG_NF_CONNTRACK_TIMEOUT
|
||||
.ctnl_timeout = {
|
||||
.nlattr_to_obj = udp_timeout_nlattr_to_obj,
|
||||
.obj_to_nlattr = udp_timeout_obj_to_nlattr,
|
||||
|
@ -358,7 +358,7 @@ const struct nf_conntrack_l4proto nf_conntrack_l4proto_udp6 =
|
|||
.obj_size = sizeof(unsigned int) * CTA_TIMEOUT_UDP_MAX,
|
||||
.nla_policy = udp_timeout_nla_policy,
|
||||
},
|
||||
#endif /* CONFIG_NF_CT_NETLINK_TIMEOUT */
|
||||
#endif /* CONFIG_NF_CONNTRACK_TIMEOUT */
|
||||
.init_net = udp_init_net,
|
||||
.get_net_proto = udp_get_net_proto,
|
||||
};
|
||||
|
@ -379,7 +379,7 @@ const struct nf_conntrack_l4proto nf_conntrack_l4proto_udplite6 =
|
|||
.nlattr_tuple_size = nf_ct_port_nlattr_tuple_size,
|
||||
.nla_policy = nf_ct_port_nla_policy,
|
||||
#endif
|
||||
#if IS_ENABLED(CONFIG_NF_CT_NETLINK_TIMEOUT)
|
||||
#ifdef CONFIG_NF_CONNTRACK_TIMEOUT
|
||||
.ctnl_timeout = {
|
||||
.nlattr_to_obj = udp_timeout_nlattr_to_obj,
|
||||
.obj_to_nlattr = udp_timeout_obj_to_nlattr,
|
||||
|
@ -387,10 +387,9 @@ const struct nf_conntrack_l4proto nf_conntrack_l4proto_udplite6 =
|
|||
.obj_size = sizeof(unsigned int) * CTA_TIMEOUT_UDP_MAX,
|
||||
.nla_policy = udp_timeout_nla_policy,
|
||||
},
|
||||
#endif /* CONFIG_NF_CT_NETLINK_TIMEOUT */
|
||||
#endif /* CONFIG_NF_CONNTRACK_TIMEOUT */
|
||||
.init_net = udp_init_net,
|
||||
.get_net_proto = udp_get_net_proto,
|
||||
};
|
||||
EXPORT_SYMBOL_GPL(nf_conntrack_l4proto_udplite6);
|
||||
#endif
|
||||
#include <net/netfilter/nf_conntrack_timeout.h>
|
||||
|
|
|
@ -4637,6 +4637,7 @@ static int nft_flush_set(const struct nft_ctx *ctx,
|
|||
}
|
||||
set->ndeact++;
|
||||
|
||||
nft_set_elem_deactivate(ctx->net, set, elem);
|
||||
nft_trans_elem_set(trans) = set;
|
||||
nft_trans_elem(trans) = *elem;
|
||||
list_add_tail(&trans->list, &ctx->net->nft.commit_list);
|
||||
|
|
|
@ -489,8 +489,8 @@ static int cttimeout_default_get(struct net *net, struct sock *ctnl,
|
|||
return err;
|
||||
}
|
||||
|
||||
static struct ctnl_timeout *
|
||||
ctnl_timeout_find_get(struct net *net, const char *name)
|
||||
static struct nf_ct_timeout *ctnl_timeout_find_get(struct net *net,
|
||||
const char *name)
|
||||
{
|
||||
struct ctnl_timeout *timeout, *matching = NULL;
|
||||
|
||||
|
@ -509,7 +509,7 @@ ctnl_timeout_find_get(struct net *net, const char *name)
|
|||
break;
|
||||
}
|
||||
err:
|
||||
return matching;
|
||||
return matching ? &matching->timeout : NULL;
|
||||
}
|
||||
|
||||
static void ctnl_timeout_put(struct nf_ct_timeout *t)
|
||||
|
|
|
@ -233,6 +233,7 @@ static void nfqnl_reinject(struct nf_queue_entry *entry, unsigned int verdict)
|
|||
int err;
|
||||
|
||||
if (verdict == NF_ACCEPT ||
|
||||
verdict == NF_REPEAT ||
|
||||
verdict == NF_STOP) {
|
||||
rcu_read_lock();
|
||||
ct_hook = rcu_dereference(nf_ct_hook);
|
||||
|
|
|
@ -799,7 +799,7 @@ nft_ct_timeout_parse_policy(void *timeouts,
|
|||
}
|
||||
|
||||
struct nft_ct_timeout_obj {
|
||||
struct nf_conn *tmpl;
|
||||
struct nf_ct_timeout *timeout;
|
||||
u8 l4proto;
|
||||
};
|
||||
|
||||
|
@ -809,26 +809,42 @@ static void nft_ct_timeout_obj_eval(struct nft_object *obj,
|
|||
{
|
||||
const struct nft_ct_timeout_obj *priv = nft_obj_data(obj);
|
||||
struct nf_conn *ct = (struct nf_conn *)skb_nfct(pkt->skb);
|
||||
struct sk_buff *skb = pkt->skb;
|
||||
struct nf_conn_timeout *timeout;
|
||||
const unsigned int *values;
|
||||
|
||||
if (ct ||
|
||||
priv->l4proto != pkt->tprot)
|
||||
if (priv->l4proto != pkt->tprot)
|
||||
return;
|
||||
|
||||
nf_ct_set(skb, priv->tmpl, IP_CT_NEW);
|
||||
if (!ct || nf_ct_is_template(ct) || nf_ct_is_confirmed(ct))
|
||||
return;
|
||||
|
||||
timeout = nf_ct_timeout_find(ct);
|
||||
if (!timeout) {
|
||||
timeout = nf_ct_timeout_ext_add(ct, priv->timeout, GFP_ATOMIC);
|
||||
if (!timeout) {
|
||||
regs->verdict.code = NF_DROP;
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
rcu_assign_pointer(timeout->timeout, priv->timeout);
|
||||
|
||||
/* adjust the timeout as per 'new' state. ct is unconfirmed,
|
||||
* so the current timestamp must not be added.
|
||||
*/
|
||||
values = nf_ct_timeout_data(timeout);
|
||||
if (values)
|
||||
nf_ct_refresh(ct, pkt->skb, values[0]);
|
||||
}
|
||||
|
||||
static int nft_ct_timeout_obj_init(const struct nft_ctx *ctx,
|
||||
const struct nlattr * const tb[],
|
||||
struct nft_object *obj)
|
||||
{
|
||||
const struct nf_conntrack_zone *zone = &nf_ct_zone_dflt;
|
||||
struct nft_ct_timeout_obj *priv = nft_obj_data(obj);
|
||||
const struct nf_conntrack_l4proto *l4proto;
|
||||
struct nf_conn_timeout *timeout_ext;
|
||||
struct nf_ct_timeout *timeout;
|
||||
int l3num = ctx->family;
|
||||
struct nf_conn *tmpl;
|
||||
__u8 l4num;
|
||||
int ret;
|
||||
|
||||
|
@ -863,28 +879,14 @@ static int nft_ct_timeout_obj_init(const struct nft_ctx *ctx,
|
|||
|
||||
timeout->l3num = l3num;
|
||||
timeout->l4proto = l4proto;
|
||||
tmpl = nf_ct_tmpl_alloc(ctx->net, zone, GFP_ATOMIC);
|
||||
if (!tmpl) {
|
||||
ret = -ENOMEM;
|
||||
goto err_free_timeout;
|
||||
}
|
||||
|
||||
timeout_ext = nf_ct_timeout_ext_add(tmpl, timeout, GFP_ATOMIC);
|
||||
if (!timeout_ext) {
|
||||
ret = -ENOMEM;
|
||||
goto err_free_tmpl;
|
||||
}
|
||||
|
||||
ret = nf_ct_netns_get(ctx->net, ctx->family);
|
||||
if (ret < 0)
|
||||
goto err_free_tmpl;
|
||||
|
||||
priv->tmpl = tmpl;
|
||||
goto err_free_timeout;
|
||||
|
||||
priv->timeout = timeout;
|
||||
return 0;
|
||||
|
||||
err_free_tmpl:
|
||||
nf_ct_tmpl_free(tmpl);
|
||||
err_free_timeout:
|
||||
kfree(timeout);
|
||||
err_proto_put:
|
||||
|
@ -896,22 +898,19 @@ static void nft_ct_timeout_obj_destroy(const struct nft_ctx *ctx,
|
|||
struct nft_object *obj)
|
||||
{
|
||||
struct nft_ct_timeout_obj *priv = nft_obj_data(obj);
|
||||
struct nf_conn_timeout *t = nf_ct_timeout_find(priv->tmpl);
|
||||
struct nf_ct_timeout *timeout;
|
||||
struct nf_ct_timeout *timeout = priv->timeout;
|
||||
|
||||
timeout = rcu_dereference_raw(t->timeout);
|
||||
nf_ct_untimeout(ctx->net, timeout);
|
||||
nf_ct_l4proto_put(timeout->l4proto);
|
||||
nf_ct_netns_put(ctx->net, ctx->family);
|
||||
nf_ct_tmpl_free(priv->tmpl);
|
||||
kfree(priv->timeout);
|
||||
}
|
||||
|
||||
static int nft_ct_timeout_obj_dump(struct sk_buff *skb,
|
||||
struct nft_object *obj, bool reset)
|
||||
{
|
||||
const struct nft_ct_timeout_obj *priv = nft_obj_data(obj);
|
||||
const struct nf_conn_timeout *t = nf_ct_timeout_find(priv->tmpl);
|
||||
const struct nf_ct_timeout *timeout = rcu_dereference_raw(t->timeout);
|
||||
const struct nf_ct_timeout *timeout = priv->timeout;
|
||||
struct nlattr *nest_params;
|
||||
int ret;
|
||||
|
||||
|
|
|
@ -16,6 +16,9 @@
|
|||
#include <linux/netfilter/x_tables.h>
|
||||
#include <linux/netfilter/xt_CHECKSUM.h>
|
||||
|
||||
#include <linux/netfilter_ipv4/ip_tables.h>
|
||||
#include <linux/netfilter_ipv6/ip6_tables.h>
|
||||
|
||||
MODULE_LICENSE("GPL");
|
||||
MODULE_AUTHOR("Michael S. Tsirkin <mst@redhat.com>");
|
||||
MODULE_DESCRIPTION("Xtables: checksum modification");
|
||||
|
@ -25,7 +28,7 @@ MODULE_ALIAS("ip6t_CHECKSUM");
|
|||
static unsigned int
|
||||
checksum_tg(struct sk_buff *skb, const struct xt_action_param *par)
|
||||
{
|
||||
if (skb->ip_summed == CHECKSUM_PARTIAL)
|
||||
if (skb->ip_summed == CHECKSUM_PARTIAL && !skb_is_gso(skb))
|
||||
skb_checksum_help(skb);
|
||||
|
||||
return XT_CONTINUE;
|
||||
|
@ -34,6 +37,8 @@ checksum_tg(struct sk_buff *skb, const struct xt_action_param *par)
|
|||
static int checksum_tg_check(const struct xt_tgchk_param *par)
|
||||
{
|
||||
const struct xt_CHECKSUM_info *einfo = par->targinfo;
|
||||
const struct ip6t_ip6 *i6 = par->entryinfo;
|
||||
const struct ipt_ip *i4 = par->entryinfo;
|
||||
|
||||
if (einfo->operation & ~XT_CHECKSUM_OP_FILL) {
|
||||
pr_info_ratelimited("unsupported CHECKSUM operation %x\n",
|
||||
|
@ -43,6 +48,21 @@ static int checksum_tg_check(const struct xt_tgchk_param *par)
|
|||
if (!einfo->operation)
|
||||
return -EINVAL;
|
||||
|
||||
switch (par->family) {
|
||||
case NFPROTO_IPV4:
|
||||
if (i4->proto == IPPROTO_UDP &&
|
||||
(i4->invflags & XT_INV_PROTO) == 0)
|
||||
return 0;
|
||||
break;
|
||||
case NFPROTO_IPV6:
|
||||
if ((i6->flags & IP6T_F_PROTO) &&
|
||||
i6->proto == IPPROTO_UDP &&
|
||||
(i6->invflags & XT_INV_PROTO) == 0)
|
||||
return 0;
|
||||
break;
|
||||
}
|
||||
|
||||
pr_warn_once("CHECKSUM should be avoided. If really needed, restrict with \"-p udp\" and only use in OUTPUT\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -125,6 +125,7 @@ xt_cluster_mt(const struct sk_buff *skb, struct xt_action_param *par)
|
|||
static int xt_cluster_mt_checkentry(const struct xt_mtchk_param *par)
|
||||
{
|
||||
struct xt_cluster_match_info *info = par->matchinfo;
|
||||
int ret;
|
||||
|
||||
if (info->total_nodes > XT_CLUSTER_NODES_MAX) {
|
||||
pr_info_ratelimited("you have exceeded the maximum number of cluster nodes (%u > %u)\n",
|
||||
|
@ -135,7 +136,17 @@ static int xt_cluster_mt_checkentry(const struct xt_mtchk_param *par)
|
|||
pr_info_ratelimited("node mask cannot exceed total number of nodes\n");
|
||||
return -EDOM;
|
||||
}
|
||||
return 0;
|
||||
|
||||
ret = nf_ct_netns_get(par->net, par->family);
|
||||
if (ret < 0)
|
||||
pr_info_ratelimited("cannot load conntrack support for proto=%u\n",
|
||||
par->family);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void xt_cluster_mt_destroy(const struct xt_mtdtor_param *par)
|
||||
{
|
||||
nf_ct_netns_put(par->net, par->family);
|
||||
}
|
||||
|
||||
static struct xt_match xt_cluster_match __read_mostly = {
|
||||
|
@ -144,6 +155,7 @@ static struct xt_match xt_cluster_match __read_mostly = {
|
|||
.match = xt_cluster_mt,
|
||||
.checkentry = xt_cluster_mt_checkentry,
|
||||
.matchsize = sizeof(struct xt_cluster_match_info),
|
||||
.destroy = xt_cluster_mt_destroy,
|
||||
.me = THIS_MODULE,
|
||||
};
|
||||
|
||||
|
|
|
@ -1057,7 +1057,7 @@ static struct xt_match hashlimit_mt_reg[] __read_mostly = {
|
|||
static void *dl_seq_start(struct seq_file *s, loff_t *pos)
|
||||
__acquires(htable->lock)
|
||||
{
|
||||
struct xt_hashlimit_htable *htable = PDE_DATA(file_inode(s->private));
|
||||
struct xt_hashlimit_htable *htable = PDE_DATA(file_inode(s->file));
|
||||
unsigned int *bucket;
|
||||
|
||||
spin_lock_bh(&htable->lock);
|
||||
|
@ -1074,7 +1074,7 @@ static void *dl_seq_start(struct seq_file *s, loff_t *pos)
|
|||
|
||||
static void *dl_seq_next(struct seq_file *s, void *v, loff_t *pos)
|
||||
{
|
||||
struct xt_hashlimit_htable *htable = PDE_DATA(file_inode(s->private));
|
||||
struct xt_hashlimit_htable *htable = PDE_DATA(file_inode(s->file));
|
||||
unsigned int *bucket = v;
|
||||
|
||||
*pos = ++(*bucket);
|
||||
|
@ -1088,7 +1088,7 @@ static void *dl_seq_next(struct seq_file *s, void *v, loff_t *pos)
|
|||
static void dl_seq_stop(struct seq_file *s, void *v)
|
||||
__releases(htable->lock)
|
||||
{
|
||||
struct xt_hashlimit_htable *htable = PDE_DATA(file_inode(s->private));
|
||||
struct xt_hashlimit_htable *htable = PDE_DATA(file_inode(s->file));
|
||||
unsigned int *bucket = v;
|
||||
|
||||
if (!IS_ERR(bucket))
|
||||
|
@ -1130,7 +1130,7 @@ static void dl_seq_print(struct dsthash_ent *ent, u_int8_t family,
|
|||
static int dl_seq_real_show_v2(struct dsthash_ent *ent, u_int8_t family,
|
||||
struct seq_file *s)
|
||||
{
|
||||
struct xt_hashlimit_htable *ht = PDE_DATA(file_inode(s->private));
|
||||
struct xt_hashlimit_htable *ht = PDE_DATA(file_inode(s->file));
|
||||
|
||||
spin_lock(&ent->lock);
|
||||
/* recalculate to show accurate numbers */
|
||||
|
@ -1145,7 +1145,7 @@ static int dl_seq_real_show_v2(struct dsthash_ent *ent, u_int8_t family,
|
|||
static int dl_seq_real_show_v1(struct dsthash_ent *ent, u_int8_t family,
|
||||
struct seq_file *s)
|
||||
{
|
||||
struct xt_hashlimit_htable *ht = PDE_DATA(file_inode(s->private));
|
||||
struct xt_hashlimit_htable *ht = PDE_DATA(file_inode(s->file));
|
||||
|
||||
spin_lock(&ent->lock);
|
||||
/* recalculate to show accurate numbers */
|
||||
|
@ -1160,7 +1160,7 @@ static int dl_seq_real_show_v1(struct dsthash_ent *ent, u_int8_t family,
|
|||
static int dl_seq_real_show(struct dsthash_ent *ent, u_int8_t family,
|
||||
struct seq_file *s)
|
||||
{
|
||||
struct xt_hashlimit_htable *ht = PDE_DATA(file_inode(s->private));
|
||||
struct xt_hashlimit_htable *ht = PDE_DATA(file_inode(s->file));
|
||||
|
||||
spin_lock(&ent->lock);
|
||||
/* recalculate to show accurate numbers */
|
||||
|
@ -1174,7 +1174,7 @@ static int dl_seq_real_show(struct dsthash_ent *ent, u_int8_t family,
|
|||
|
||||
static int dl_seq_show_v2(struct seq_file *s, void *v)
|
||||
{
|
||||
struct xt_hashlimit_htable *htable = PDE_DATA(file_inode(s->private));
|
||||
struct xt_hashlimit_htable *htable = PDE_DATA(file_inode(s->file));
|
||||
unsigned int *bucket = (unsigned int *)v;
|
||||
struct dsthash_ent *ent;
|
||||
|
||||
|
@ -1188,7 +1188,7 @@ static int dl_seq_show_v2(struct seq_file *s, void *v)
|
|||
|
||||
static int dl_seq_show_v1(struct seq_file *s, void *v)
|
||||
{
|
||||
struct xt_hashlimit_htable *htable = PDE_DATA(file_inode(s->private));
|
||||
struct xt_hashlimit_htable *htable = PDE_DATA(file_inode(s->file));
|
||||
unsigned int *bucket = v;
|
||||
struct dsthash_ent *ent;
|
||||
|
||||
|
@ -1202,7 +1202,7 @@ static int dl_seq_show_v1(struct seq_file *s, void *v)
|
|||
|
||||
static int dl_seq_show(struct seq_file *s, void *v)
|
||||
{
|
||||
struct xt_hashlimit_htable *htable = PDE_DATA(file_inode(s->private));
|
||||
struct xt_hashlimit_htable *htable = PDE_DATA(file_inode(s->file));
|
||||
unsigned int *bucket = v;
|
||||
struct dsthash_ent *ent;
|
||||
|
||||
|
|
Loading…
Reference in a new issue