-diff -Naupr linux-4.7_orig/net/netfilter/core.c linux-4.7/net/netfilter/core.c
---- linux-4.7_orig/net/netfilter/core.c 2016-07-25 02:23:50.000000000 +0700
-+++ linux-4.7/net/netfilter/core.c 2016-07-26 20:58:55.645901708 +0700
-@@ -311,9 +311,11 @@ next_hook:
- ret = NF_DROP_GETERR(verdict);
- if (ret == 0)
- ret = -EPERM;
-- } else if ((verdict & NF_VERDICT_MASK) == NF_QUEUE) {
-+ } else if ((verdict & NF_VERDICT_MASK) == NF_QUEUE ||
-+ (verdict & NF_VERDICT_MASK) == NF_IMQ_QUEUE) {
- int err = nf_queue(skb, elem, state,
-- verdict >> NF_VERDICT_QBITS);
-+ verdict >> NF_VERDICT_QBITS,
-+ verdict & NF_VERDICT_MASK);
- if (err < 0) {
- if (err == -ESRCH &&
- (verdict & NF_VERDICT_FLAG_QUEUE_BYPASS))
-diff -Naupr linux-4.7_orig/net/netfilter/Kconfig linux-4.7/net/netfilter/Kconfig
---- linux-4.7_orig/net/netfilter/Kconfig 2016-07-25 02:23:50.000000000 +0700
-+++ linux-4.7/net/netfilter/Kconfig 2016-07-26 20:58:55.645901708 +0700
-@@ -807,6 +807,18 @@ config NETFILTER_XT_TARGET_LOG
+diff -Naupr linux-4.10_orig/net/netfilter/core.c linux-4.10/net/netfilter/core.c
+--- linux-4.10_orig/net/netfilter/core.c 2017-02-20 05:34:00.000000000 +0700
++++ linux-4.10/net/netfilter/core.c 2017-02-28 18:44:55.988280636 +0700
+@@ -318,6 +318,11 @@ int nf_hook_slow(struct sk_buff *skb, st
+ if (ret == 0)
+ ret = -EPERM;
+ return ret;
++ case NF_IMQ_QUEUE:
++ ret = nf_queue(skb, state, &entry, verdict);
++ if (ret == -ECANCELED)
++ continue;
++ return ret;
+ case NF_QUEUE:
+ ret = nf_queue(skb, state, &entry, verdict);
+ if (ret == 1 && entry)
+diff -Naupr linux-4.10_orig/net/netfilter/Kconfig linux-4.10/net/netfilter/Kconfig
+--- linux-4.10_orig/net/netfilter/Kconfig 2017-02-20 05:34:00.000000000 +0700
++++ linux-4.10/net/netfilter/Kconfig 2017-02-28 18:44:55.988280636 +0700
+@@ -852,6 +852,18 @@ config NETFILTER_XT_TARGET_LOG