sosendudp(struct socket *so, struct sockaddr *addr, struct uio *uio,
struct mbuf *top, struct mbuf *control, int flags, struct thread *td)
{
- boolean_t dontroute; /* temporary SO_DONTROUTE setting */
size_t resid;
- int error;
+ int error, pru_flags = 0;
int space;
if (td->td_lwp != NULL)
goto release;
}
- dontroute = (flags & MSG_DONTROUTE) && !(so->so_options & SO_DONTROUTE);
- if (dontroute)
- so->so_options |= SO_DONTROUTE;
+ if (flags & MSG_DONTROUTE)
+ pru_flags |= PRUS_DONTROUTE;
- error = so_pru_send(so, 0, top, addr, NULL, td);
+ error = so_pru_send(so, pru_flags, top, addr, NULL, td);
top = NULL; /* sent or freed in lower layer */
- if (dontroute)
- so->so_options &= ~SO_DONTROUTE;
-
release:
ssb_unlock(&so->so_snd);
out:
#define PRUS_MORETOCOME 0x4
#define PRUS_NAMALLOC 0x8
#define PRUS_NOREPLY 0x10
+#define PRUS_DONTROUTE 0x20
struct netmsg_pru_sense {
struct netmsg_base base;
static int udp_connect_oncpu(struct socket *so, struct thread *td,
struct sockaddr_in *sin, struct sockaddr_in *if_sin);
static int udp_output (struct inpcb *, struct mbuf *, struct sockaddr *,
- struct thread *);
+ struct thread *, int);
void
udp_init(void)
static int
udp_output(struct inpcb *inp, struct mbuf *m, struct sockaddr *dstaddr,
- struct thread *td)
+ struct thread *td, int flags)
{
struct udpiphdr *ui;
int len = m->m_pkthdr.len;
error = ip_output(m, inp->inp_options, &inp->inp_route,
(inp->inp_socket->so_options & (SO_DONTROUTE | SO_BROADCAST)) |
- IP_DEBUGROUTE,
+ flags | IP_DEBUGROUTE,
inp->inp_moptions, inp);
/*
{
struct socket *so = msg->send.base.nm_so;
struct mbuf *m = msg->send.nm_m;
+ int pru_flags = msg->send.nm_flags;
struct inpcb *inp;
int error;
if (inp) {
struct sockaddr *addr = msg->send.nm_addr;
struct thread *td = msg->send.nm_td;
+ int flags = 0;
- error = udp_output(inp, m, addr, td);
+ if (pru_flags & PRUS_DONTROUTE)
+ flags |= SO_DONTROUTE;
+ error = udp_output(inp, m, addr, td, flags);
} else {
m_freem(m);
error = EINVAL;