[Bug 280390] NPTv6 not working

[email protected]
Newsgroups gmane.os.freebsd.devel.net
Message-ID <[email protected]/bugzilla/>
https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=280390

--- Comment #21 from Tatsuki Makino <[email protected]> ---
(In reply to Tatsuki Makino from comment #20)

In the end, I came back to the method of using this :)
I wanted to keep one_pass enabled, so I used a strange method with dynamic
rules, but with the following patch, I tried to resolve the issue of icmpv6
being unable to pass.
The results of ipfw -D show indicated that more than 2 packets were captured
due to the ipv6-icmp rule, this patch may be meaningful :)

Below is the patch.
It has been applied to 14.3-PRERELEASE.

diff --git a/sys/netpfil/ipfw/ip_fw_dynamic.c
b/sys/netpfil/ipfw/ip_fw_dynamic.c
index d26e05e5d15..23902a52404 100644
--- a/sys/netpfil/ipfw/ip_fw_dynamic.c
+++ b/sys/netpfil/ipfw/ip_fw_dynamic.c
@@ -487,6 +487,15 @@ SYSCTL_U32(_net_inet_ip_fw, OID_AUTO, dyn_keep_states,
     CTLFLAG_VNET | CTLFLAG_RW, &VNET_NAME(dyn_keep_states), 0,
     "Do not flush dynamic states on rule deletion");

+#ifdef INET6
+VNET_DEFINE_STATIC(int, _dyn_auto_add_icmpv6) = 0;
+#define V_dyn_auto_add_icmpv6  VNET(_dyn_auto_add_icmpv6)
+SYSCTL_INT(_net_inet_ip_fw, OID_AUTO,
+       _dyn_auto_add_icmpv6, CTLFLAG_VNET | CTLFLAG_RW,
+       &VNET_NAME(_dyn_auto_add_icmpv6), 0,
+       "ipv6-icmp dynamic rule is also added at the same time when ip6 dynamic
rule is added");
+#endif /* INET6 */
+
 #ifdef IPFIREWALL_DYNDEBUG
 #define        DYN_DEBUG(fmt, ...)     do {                    \
        printf("%s: " fmt "\n", __func__, __VA_ARGS__); \
@@ -1930,8 +1939,22 @@ dyn_install_state(const struct ipfw_flow_id *pkt,
uint32_t zoneid,
                    ulp, pktlen, hashval, info, fibnum, kidx, type);
 #ifdef INET6
        else if (IS_IP6_FLOW_ID(pkt))
+       {
                ret = dyn_add_ipv6_state(rule, ruleid, rulenum, pkt,
                    zoneid, ulp, pktlen, hashval, info, fibnum, kidx, type);
+               if (V_dyn_auto_add_icmpv6 && ret == 0 &&
+                       (pkt->proto != 0 && pkt->proto != IPPROTO_ICMPV6)) {
+                       struct ipfw_flow_id id;
+                       id = *pkt;
+                       id.proto = IPPROTO_ICMPV6;
+                       id.src_port = 0;
+                       id.dst_port = 0;
+                       if (dyn_add_ipv6_state(rule, ruleid, rulenum, &id,
+                           zoneid, ulp, pktlen, hashval, info, fibnum, kidx,
type) != 0) {
+                               /* ignore failure */
+                       }
+               }
+       }
 #endif /* INET6 */
        else
                ret = EAFNOSUPPORT;

-- 
You are receiving this mail because:
You are on the CC list for the bug.
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.