return ip_output(m, NULL, NULL, IP_RAWOUTPUT, NULL, NULL);
return ip_output(m, (void *)NULL, (void *)NULL, IP_RAWOUTPUT, (void *)NULL, (void *)NULL);
ipsp_process_done(struct mbuf *m, struct tdb *tdb){#ifdef INET	struct ip *ip;#endif /* INET */#ifdef INET6	struct ip6_hdr *ip6;#endif /* INET6 */	struct tdb_ident *tdbi;	struct m_tag *mtag;	tdb->tdb_last_used = time.tv_sec;	switch (tdb->tdb_dst.sa.sa_family) {#ifdef INET	case AF_INET:		/* Fix the header length, for AH processing. */		ip = mtod(m, struct ip *);		ip->ip_len = htons(m->m_pkthdr.len);		break;#endif /* INET */#ifdef INET6	case AF_INET6:		/* Fix the header length, for AH processing. */		if (m->m_pkthdr.len < sizeof(*ip6)) {			m_freem(m);			return ENXIO;		}		if (m->m_pkthdr.len - sizeof(*ip6) > IPV6_MAXPACKET) {			/* No jumbogram support. */			m_freem(m);			return ENXIO;		}		ip6 = mtod(m, struct ip6_hdr *);		ip6->ip6_plen = htons(m->m_pkthdr.len - sizeof(*ip6));		break;#endif /* INET6 */	default:		m_freem(m);		DPRINTF(("ipsp_process_done(): unknown protocol family (%d)\n",		    tdb->tdb_dst.sa.sa_family));		return ENXIO;	}	/*	 * Add a record of what we've done or what needs to be done to the	 * packet.	 */	if ((tdb->tdb_flags & TDBF_SKIPCRYPTO) == 0)		mtag = m_tag_get(PACKET_TAG_IPSEC_OUT_DONE,		    sizeof(struct tdb_ident),		    M_NOWAIT);	else		mtag = m_tag_get(PACKET_TAG_IPSEC_OUT_CRYPTO_NEEDED,		    sizeof(struct tdb_ident), M_NOWAIT);	if (mtag == NULL) {		m_freem(m);		DPRINTF(("ipsp_process_done(): could not allocate packet "		    "tag\n"));		return ENOMEM;	}	tdbi = (struct tdb_ident *)(mtag + 1);	bcopy(&tdb->tdb_dst, &tdbi->dst, sizeof(union sockaddr_union));	tdbi->proto = tdb->tdb_sproto;	tdbi->spi = tdb->tdb_spi;	m_tag_prepend(m, mtag);	/* If there's another (bundled) TDB to apply, do so. */	if (tdb->tdb_onext)		return ipsp_process_packet(m, tdb->tdb_onext,		    tdb->tdb_dst.sa.sa_family, 0);	/*	 * We're done with IPsec processing, transmit the packet using the	 * appropriate network protocol (IP or IPv6). SPD lookup will be	 * performed again there.	 */	switch (tdb->tdb_dst.sa.sa_family) {#ifdef INET	case AF_INET:		NTOHS(ip->ip_len);		NTOHS(ip->ip_off);		return ip_output(m, NULL, NULL, IP_RAWOUTPUT, NULL, NULL);#endif /* INET */#ifdef INET6	case AF_INET6:		/*		 * We don't need massage, IPv6 header fields are always in		 * net endian.		 */		return ip6_output(m, NULL, NULL, 0, NULL, NULL);#endif /* INET6 */	}	return EINVAL; /* Not reached. */}