#include <sys/thread.h>
#include <sys/thread2.h>
#include <sys/msgport2.h>
+#include <sys/mbuf.h>
#include <vm/pmap.h>
#include <net/netmsg2.h>
return (error);
}
+void
+so_pru_send_async(struct socket *so, int flags, struct mbuf *m,
+ struct sockaddr *addr, struct mbuf *control, struct thread *td)
+{
+ struct netmsg_pru_send *msg;
+
+ msg = &m->m_hdr.mh_sndmsg;
+ netmsg_init(&msg->base, so, &netisr_apanic_rport,
+ 0, so->so_proto->pr_usrreqs->pru_send);
+ msg->nm_flags = flags | PRUS_NOREPLY;
+ msg->nm_m = m;
+ msg->nm_addr = addr;
+ msg->nm_control = control;
+ msg->nm_td = td;
+ lwkt_sendmsg(so->so_port, &msg->base.lmsg);
+}
+
int
so_pru_sense(struct socket *so, struct stat *sb)
{
* here, but there are probably other places that this
* also happens. We must rethink this.
*/
- error = so_pru_send(so, pru_flags, top, NULL, NULL, td);
+ if ((pru_flags & PRUS_OOB) ||
+ (pru_flags & PRUS_MORETOCOME) == 0) {
+ error = so_pru_send(so, pru_flags, top,
+ NULL, NULL, td);
+ } else {
+ so_pru_send_async(so, pru_flags, top,
+ NULL, NULL, td);
+ error = 0;
+ }
top = NULL;
mp = ⊤
#define PRUS_EOF 0x2
#define PRUS_MORETOCOME 0x4
#define PRUS_NAMALLOC 0x8
+#define PRUS_NOREPLY 0x10
struct netmsg_pru_sense {
struct netmsg_base base;
TCPDEBUG1(); \
} while(0)
-#define COMMON_END(req) \
+#define COMMON_END1(req, noreply) \
out: do { \
TCPDEBUG2(req); \
- lwkt_replymsg(&msg->lmsg, error); \
+ if (!(noreply)) \
+ lwkt_replymsg(&msg->lmsg, error); \
return; \
} while(0)
+#define COMMON_END(req) COMMON_END1((req), 0)
+
/*
* Give the socket an address.
*/
tp->t_flags &= ~TF_MORETOCOME;
}
}
- COMMON_END((flags & PRUS_OOB) ? PRU_SENDOOB :
- ((flags & PRUS_EOF) ? PRU_SEND_EOF : PRU_SEND));
+ COMMON_END1((flags & PRUS_OOB) ? PRU_SENDOOB :
+ ((flags & PRUS_EOF) ? PRU_SEND_EOF : PRU_SEND),
+ (flags & PRUS_NOREPLY));
}
/*
#ifdef MBUF_DEBUG
const char *mh_lastfunc;
#endif
- struct netmsg_packet mh_netmsg; /* hardware->proto stack msg */
+ union {
+ struct netmsg_packet mhm_pkt; /* hardware->proto stack msg */
+ struct netmsg_pru_send mhm_snd; /* usrspace->proto stack msg */
+ } mh_msgu;
};
+#define mh_netmsg mh_msgu.mhm_pkt
+#define mh_sndmsg mh_msgu.mhm_snd
/* pf stuff */
struct pkthdr_pf {
int so_pru_send (struct socket *so, int flags, struct mbuf *m,
struct sockaddr *addr, struct mbuf *control,
struct thread *td);
+void so_pru_send_async (struct socket *so, int flags, struct mbuf *m,
+ struct sockaddr *addr, struct mbuf *control,
+ struct thread *td);
int so_pru_sense (struct socket *so, struct stat *sb);
int so_pru_shutdown (struct socket *so);
int so_pru_sockaddr (struct socket *so, struct sockaddr **nam);