| /* SPDX-License-Identifier: BSD-3-Clause */ | |
| /* | |
| * Copyright (c) 2013 | |
| * Guillaume Subiron, Yann Bordenave, Serigne Modou Wagne. | |
| */ | |
| #include "slirp.h" | |
| /* Number of packets queued before we start sending | |
| * (to prevent allocing too many mbufs) */ | |
| #define IF6_THRESH 10 | |
| /* | |
| * IPv6 output. The packet in mbuf chain m contains a IP header | |
| */ | |
| int ip6_output(struct socket *so, struct mbuf *m, int fast) | |
| { | |
| Slirp *slirp = m->slirp; | |
| M_DUP_DEBUG(slirp, m, 0, 0); | |
| struct ip6 *ip = mtod(m, struct ip6 *); | |
| DEBUG_CALL("ip6_output"); | |
| DEBUG_ARG("so = %p", so); | |
| DEBUG_ARG("m = %p", m); | |
| /* Fill IPv6 header */ | |
| ip->ip_v = IP6VERSION; | |
| ip->ip_hl = IP6_HOP_LIMIT; | |
| ip->ip_tc_hi = 0; | |
| ip->ip_tc_lo = 0; | |
| ip->ip_fl_hi = 0; | |
| ip->ip_fl_lo = 0; | |
| if (fast) { | |
| /* We cannot fast-send non-multicast, we'd need a NDP NS */ | |
| assert(IN6_IS_ADDR_MULTICAST(&ip->ip_dst)); | |
| if_encap(m->slirp, m); | |
| m_free(m); | |
| } else { | |
| if_output(so, m); | |
| } | |
| return 0; | |
| } |