This diff merges two "#ifdef MROUTING" blocks. It's one more step
towards splitting ip6_input() in two. Which is a requirement to
unlock the forwarding path without messing with the receiving path.
ok?
Index: netinet6/ip6_input.c
===================================================================
RCS file: /cvs/src/sys/netinet6/ip6_input.c,v
retrieving revision 1.169
diff -u -p -r1.169 ip6_input.c
--- netinet6/ip6_input.c 14 Nov 2016 10:32:46 -0000 1.169
+++ netinet6/ip6_input.c 22 Nov 2016 14:18:52 -0000
@@ -387,7 +387,6 @@ ip6_input(struct mbuf *m)
* Multicast check
*/
if (IN6_IS_ADDR_MULTICAST(&ip6->ip6_dst)) {
-
/*
* Make sure M_MCAST is set. It should theoretically
* already be there, but let's play safe because upper
@@ -401,12 +400,36 @@ ip6_input(struct mbuf *m)
*/
if (in6_hasmulti(&ip6->ip6_dst, ifp))
ours = 1;
+
#ifdef MROUTING
- else if (!ip6_mforwarding || !ip6_mrouter)
-#else
- else
+ if (ip6_mforwarding && ip6_mrouter) {
+ if (ip6_hbhchcheck(m, &off, &nxt, &ours)) {
+ rtfree(rt);
+ if_put(ifp);
+ return; /* m have already been freed */
+ }
+
+ ip6 = mtod(m, struct ip6_hdr *);
+
+ /*
+ * If we are acting as a multicast router, all
+ * incoming multicast packets are passed to the
+ * kernel-level multicast forwarding function.
+ * The packet is returned (relatively) intact; if
+ * ip6_mforward() returns a non-zero value, the packet
+ * must be discarded, else it may be accepted below.
+ */
+ if (ip6_mforward(ip6, ifp, m)) {
+ ip6stat.ip6s_cantforward++;
+ goto bad;
+ }
+
+ if (!ours)
+ goto bad;
+ goto ours;
+ }
#endif
- {
+ if (!ours) {
ip6stat.ip6s_notmember++;
if (!IN6_IS_ADDR_MC_LINKLOCAL(&ip6->ip6_dst))
ip6stat.ip6s_cantforward++;
@@ -485,30 +508,14 @@ ip6_input(struct mbuf *m)
/*
* Forward if desirable.
*/
- if (IN6_IS_ADDR_MULTICAST(&ip6->ip6_dst)) {
- /*
- * If we are acting as a multicast router, all
- * incoming multicast packets are passed to the
- * kernel-level multicast forwarding function.
- * The packet is returned (relatively) intact; if
- * ip6_mforward() returns a non-zero value, the packet
- * must be discarded, else it may be accepted below.
- */
-#ifdef MROUTING
- if (ip6_mforwarding && ip6_mrouter &&
- ip6_mforward(ip6, ifp, m)) {
- ip6stat.ip6s_cantforward++;
- goto bad;
- }
-#endif
- if (!ours)
- goto bad;
- } else if (!ours) {
+ if (!ours) {
ip6_forward(m, rt, srcrt);
if_put(ifp);
return;
}
-
+#ifdef MROUTING
+ ours:
+#endif
/* pf might have changed things */
in6_proto_cksum_out(m, NULL);