|
@@ -147,9 +147,28 @@ socket_mt6_v1_v2_v3(const struct sk_buff *skb, struct xt_action_param *par)
|
|
|
}
|
|
|
#endif
|
|
|
|
|
|
+static int socket_mt_enable_defrag(struct net *net, int family)
|
|
|
+{
|
|
|
+ switch (family) {
|
|
|
+ case NFPROTO_IPV4:
|
|
|
+ return nf_defrag_ipv4_enable(net);
|
|
|
+#ifdef XT_SOCKET_HAVE_IPV6
|
|
|
+ case NFPROTO_IPV6:
|
|
|
+ return nf_defrag_ipv6_enable(net);
|
|
|
+#endif
|
|
|
+ }
|
|
|
+ WARN_ONCE(1, "Unknown family %d\n", family);
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
static int socket_mt_v1_check(const struct xt_mtchk_param *par)
|
|
|
{
|
|
|
const struct xt_socket_mtinfo1 *info = (struct xt_socket_mtinfo1 *) par->matchinfo;
|
|
|
+ int err;
|
|
|
+
|
|
|
+ err = socket_mt_enable_defrag(par->net, par->family);
|
|
|
+ if (err)
|
|
|
+ return err;
|
|
|
|
|
|
if (info->flags & ~XT_SOCKET_FLAGS_V1) {
|
|
|
pr_info("unknown flags 0x%x\n", info->flags & ~XT_SOCKET_FLAGS_V1);
|
|
@@ -161,6 +180,11 @@ static int socket_mt_v1_check(const struct xt_mtchk_param *par)
|
|
|
static int socket_mt_v2_check(const struct xt_mtchk_param *par)
|
|
|
{
|
|
|
const struct xt_socket_mtinfo2 *info = (struct xt_socket_mtinfo2 *) par->matchinfo;
|
|
|
+ int err;
|
|
|
+
|
|
|
+ err = socket_mt_enable_defrag(par->net, par->family);
|
|
|
+ if (err)
|
|
|
+ return err;
|
|
|
|
|
|
if (info->flags & ~XT_SOCKET_FLAGS_V2) {
|
|
|
pr_info("unknown flags 0x%x\n", info->flags & ~XT_SOCKET_FLAGS_V2);
|
|
@@ -173,7 +197,11 @@ static int socket_mt_v3_check(const struct xt_mtchk_param *par)
|
|
|
{
|
|
|
const struct xt_socket_mtinfo3 *info =
|
|
|
(struct xt_socket_mtinfo3 *)par->matchinfo;
|
|
|
+ int err;
|
|
|
|
|
|
+ err = socket_mt_enable_defrag(par->net, par->family);
|
|
|
+ if (err)
|
|
|
+ return err;
|
|
|
if (info->flags & ~XT_SOCKET_FLAGS_V3) {
|
|
|
pr_info("unknown flags 0x%x\n",
|
|
|
info->flags & ~XT_SOCKET_FLAGS_V3);
|
|
@@ -268,11 +296,6 @@ static struct xt_match socket_mt_reg[] __read_mostly = {
|
|
|
|
|
|
static int __init socket_mt_init(void)
|
|
|
{
|
|
|
- nf_defrag_ipv4_enable();
|
|
|
-#if IS_ENABLED(CONFIG_IP6_NF_IPTABLES)
|
|
|
- nf_defrag_ipv6_enable();
|
|
|
-#endif
|
|
|
-
|
|
|
return xt_register_matches(socket_mt_reg, ARRAY_SIZE(socket_mt_reg));
|
|
|
}
|
|
|
|