Hi, I would like to make ip6_input() more like ipv4_input() and introduce ip6_ours().
ok? bluhm Index: netinet6/ip6_input.c =================================================================== RCS file: /data/mirror/openbsd/cvs/src/sys/netinet6/ip6_input.c,v retrieving revision 1.175 diff -u -p -r1.175 ip6_input.c --- netinet6/ip6_input.c 29 Jan 2017 19:58:47 -0000 1.175 +++ netinet6/ip6_input.c 1 Feb 2017 19:42:15 -0000 @@ -120,9 +120,9 @@ struct niqueue ip6intrq = NIQUEUE_INITIA struct ip6stat ip6stat; int ip6_check_rh0hdr(struct mbuf *, int *); - int ip6_hbhchcheck(struct mbuf *, int *, int *, int *); int ip6_hopopts_input(u_int32_t *, u_int32_t *, struct mbuf **, int *); +void ip6_ours(struct mbuf *, int, int); struct mbuf *ip6_pullexthdr(struct mbuf *, size_t, int); static struct mbuf_queue ip6send_mq; @@ -179,9 +179,8 @@ ip6_input(struct mbuf *m) struct ip6_hdr *ip6; struct sockaddr_in6 sin6; struct rtentry *rt = NULL; - int off, nest; + int off, nxt, ours = 0; u_int16_t src_scope, dst_scope; - int nxt, ours = 0; #if NPF > 0 struct in6_addr odst; #endif @@ -214,8 +213,7 @@ ip6_input(struct mbuf *m) if (m->m_len < sizeof(struct ip6_hdr)) { if ((m = m_pullup(m, sizeof(struct ip6_hdr))) == NULL) { ip6stat.ip6s_toosmall++; - if_put(ifp); - return; + goto out; } } @@ -353,9 +351,7 @@ ip6_input(struct mbuf *m) ip6_check_rh0hdr(m, &off)) { ip6stat.ip6s_badoptions++; icmp6_error(m, ICMP6_PARAM_PROB, ICMP6_PARAMPROB_HEADER, off); - /* m is already freed */ - if_put(ifp); - return; + goto out; } if (IN6_IS_ADDR_LOOPBACK(&ip6->ip6_src) || @@ -391,11 +387,8 @@ ip6_input(struct mbuf *m) #ifdef MROUTING if (ip6_mforwarding && ip6_mrouter) { - if (ip6_hbhchcheck(m, &off, &nxt, &ours)) { - rtfree(rt); - if_put(ifp); - return; /* m have already been freed */ - } + if (ip6_hbhchcheck(m, &off, &nxt, &ours)) + goto out; ip6 = mtod(m, struct ip6_hdr *); @@ -407,14 +400,15 @@ ip6_input(struct mbuf *m) * ip6_mforward() returns a non-zero value, the packet * must be discarded, else it may be accepted below. */ - if (ip6_mforward(ip6, ifp, m)) { + if (ip6_mforward(ip6, ifp, m)) { ip6stat.ip6s_cantforward++; goto bad; } if (!ours) goto bad; - goto ours; + ip6_ours(m, off, nxt); + goto out; } #endif if (!ours) { @@ -484,36 +478,39 @@ ip6_input(struct mbuf *m) hbhcheck: - if (ip6_hbhchcheck(m, &off, &nxt, &ours)) { - rtfree(rt); - if_put(ifp); - return; /* m have already been freed */ - } + if (ip6_hbhchcheck(m, &off, &nxt, &ours)) + goto out; - /* adjust pointer */ - ip6 = mtod(m, struct ip6_hdr *); + if (ours) { + ip6_ours(m, off, nxt); + goto out; + } /* * Forward if desirable. */ - if (!ours) { - ip6_forward(m, rt, srcrt); - if_put(ifp); - return; - } -#ifdef MROUTING - ours: -#endif + ip6_forward(m, rt, srcrt); + if_put(ifp); + return; + bad: + m_freem(m); + out: + rtfree(rt); + if_put(ifp); +} + +void +ip6_ours(struct mbuf *m, int off, int nxt) +{ + int nest = 0; + /* pf might have changed things */ in6_proto_cksum_out(m, NULL); - ip6 = mtod(m, struct ip6_hdr *); - /* * Tell launch routine the next header */ ip6stat.ip6s_delivered++; - nest = 0; while (nxt != IPPROTO_DONE) { if (ip6_hdrnestlimit && (++nest > ip6_hdrnestlimit)) { @@ -543,12 +540,8 @@ ip6_input(struct mbuf *m) nxt = (*inet6sw[ip6_protox[nxt]].pr_input)(&m, &off, nxt); } - rtfree(rt); - if_put(ifp); return; bad: - rtfree(rt); - if_put(ifp); m_freem(m); }