diff --git a/sys/dev/kttcp.c b/sys/dev/kttcp.c index 8d0cfaedcc17..79a11bd368f8 100644 --- a/sys/dev/kttcp.c +++ b/sys/dev/kttcp.c @@ -1,4 +1,4 @@ -/* $NetBSD: kttcp.c,v 1.36 2014/08/05 07:55:31 rtr Exp $ */ +/* $NetBSD: kttcp.c,v 1.37 2014/08/08 03:05:44 rtr Exp $ */ /* * Copyright (c) 2002 Wasabi Systems, Inc. @@ -42,7 +42,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: kttcp.c,v 1.36 2014/08/05 07:55:31 rtr Exp $"); +__KERNEL_RCSID(0, "$NetBSD: kttcp.c,v 1.37 2014/08/08 03:05:44 rtr Exp $"); #include #include @@ -635,8 +635,7 @@ kttcp_soreceive(struct socket *so, unsigned long long slen, * get it filled again. */ if ((pr->pr_flags & PR_WANTRCVD) && so->so_pcb) { - (*pr->pr_usrreqs->pr_generic)(so, PRU_RCVD, NULL, - (struct mbuf *)(long)flags, NULL, NULL); + (*pr->pr_usrreqs->pr_rcvd)(so, flags, l); } SBLASTRECORDCHK(&so->so_rcv, "kttcp_soreceive sbwait 2"); @@ -675,8 +674,7 @@ kttcp_soreceive(struct socket *so, unsigned long long slen, SBLASTRECORDCHK(&so->so_rcv, "kttcp_soreceive 4"); SBLASTMBUFCHK(&so->so_rcv, "kttcp_soreceive 4"); if (pr->pr_flags & PR_WANTRCVD && so->so_pcb) { - (*pr->pr_usrreqs->pr_generic)(so, PRU_RCVD, NULL, - (struct mbuf *)(long)flags, NULL, NULL); + (*pr->pr_usrreqs->pr_rcvd)(so, flags, l); } } if (orig_resid == resid && orig_resid && diff --git a/sys/kern/uipc_socket.c b/sys/kern/uipc_socket.c index c5087da53d01..3946c1408f2a 100644 --- a/sys/kern/uipc_socket.c +++ b/sys/kern/uipc_socket.c @@ -1,4 +1,4 @@ -/* $NetBSD: uipc_socket.c,v 1.232 2014/08/05 07:55:31 rtr Exp $ */ +/* $NetBSD: uipc_socket.c,v 1.233 2014/08/08 03:05:45 rtr Exp $ */ /*- * Copyright (c) 2002, 2007, 2008, 2009 The NetBSD Foundation, Inc. @@ -71,7 +71,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: uipc_socket.c,v 1.232 2014/08/05 07:55:31 rtr Exp $"); +__KERNEL_RCSID(0, "$NetBSD: uipc_socket.c,v 1.233 2014/08/08 03:05:45 rtr Exp $"); #include "opt_compat_netbsd.h" #include "opt_sock_counters.h" @@ -1532,8 +1532,7 @@ soreceive(struct socket *so, struct mbuf **paddr, struct uio *uio, * get it filled again. */ if ((pr->pr_flags & PR_WANTRCVD) && so->so_pcb) - (*pr->pr_usrreqs->pr_generic)(so, PRU_RCVD, - NULL, (struct mbuf *)(long)flags, NULL, l); + (*pr->pr_usrreqs->pr_rcvd)(so, flags, l); SBLASTRECORDCHK(&so->so_rcv, "soreceive sbwait 2"); SBLASTMBUFCHK(&so->so_rcv, "soreceive sbwait 2"); if (wakeup_state & SS_RESTARTSYS) @@ -1574,8 +1573,7 @@ soreceive(struct socket *so, struct mbuf **paddr, struct uio *uio, SBLASTRECORDCHK(&so->so_rcv, "soreceive 4"); SBLASTMBUFCHK(&so->so_rcv, "soreceive 4"); if (pr->pr_flags & PR_WANTRCVD && so->so_pcb) - (*pr->pr_usrreqs->pr_generic)(so, PRU_RCVD, NULL, - (struct mbuf *)(long)flags, NULL, l); + (*pr->pr_usrreqs->pr_rcvd)(so, flags, l); } if (orig_resid == uio->uio_resid && orig_resid && (flags & MSG_EOR) == 0 && (so->so_state & SS_CANTRCVMORE) == 0) { diff --git a/sys/kern/uipc_usrreq.c b/sys/kern/uipc_usrreq.c index fc2e4a9a9c4c..086cd8769b15 100644 --- a/sys/kern/uipc_usrreq.c +++ b/sys/kern/uipc_usrreq.c @@ -1,4 +1,4 @@ -/* $NetBSD: uipc_usrreq.c,v 1.167 2014/08/05 08:52:10 rtr Exp $ */ +/* $NetBSD: uipc_usrreq.c,v 1.168 2014/08/08 03:05:45 rtr Exp $ */ /*- * Copyright (c) 1998, 2000, 2004, 2008, 2009 The NetBSD Foundation, Inc. @@ -96,7 +96,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: uipc_usrreq.c,v 1.167 2014/08/05 08:52:10 rtr Exp $"); +__KERNEL_RCSID(0, "$NetBSD: uipc_usrreq.c,v 1.168 2014/08/08 03:05:45 rtr Exp $"); #include #include @@ -368,6 +368,52 @@ unp_setaddr(struct socket *so, struct mbuf *nam, bool peeraddr) } } +static int +unp_rcvd(struct socket *so, int flags, struct lwp *l) +{ + struct unpcb *unp = sotounpcb(so); + struct socket *so2; + u_int newhiwat; + + KASSERT(solocked(so)); + KASSERT(unp != NULL); + + switch (so->so_type) { + + case SOCK_DGRAM: + panic("uipc 1"); + /*NOTREACHED*/ + + case SOCK_SEQPACKET: /* FALLTHROUGH */ + case SOCK_STREAM: +#define rcv (&so->so_rcv) +#define snd (&so2->so_snd) + if (unp->unp_conn == 0) + break; + so2 = unp->unp_conn->unp_socket; + KASSERT(solocked2(so, so2)); + /* + * Adjust backpressure on sender + * and wakeup any waiting to write. + */ + snd->sb_mbmax += unp->unp_mbcnt - rcv->sb_mbcnt; + unp->unp_mbcnt = rcv->sb_mbcnt; + newhiwat = snd->sb_hiwat + unp->unp_cc - rcv->sb_cc; + (void)chgsbsize(so2->so_uidinfo, + &snd->sb_hiwat, newhiwat, RLIM_INFINITY); + unp->unp_cc = rcv->sb_cc; + sowwakeup(so2); +#undef snd +#undef rcv + break; + + default: + panic("uipc 2"); + } + + return 0; +} + static int unp_recvoob(struct socket *so, struct mbuf *m, int flags) { @@ -520,8 +566,6 @@ unp_usrreq(struct socket *so, int req, struct mbuf *m, struct mbuf *nam, struct mbuf *control, struct lwp *l) { struct unpcb *unp; - struct socket *so2; - u_int newhiwat; int error = 0; KASSERT(req != PRU_ATTACH); @@ -537,6 +581,7 @@ unp_usrreq(struct socket *so, int req, struct mbuf *m, struct mbuf *nam, KASSERT(req != PRU_SENSE); KASSERT(req != PRU_PEERADDR); KASSERT(req != PRU_SOCKADDR); + KASSERT(req != PRU_RCVD); KASSERT(req != PRU_RCVOOB); KASSERT(req != PRU_SEND); KASSERT(req != PRU_SENDOOB); @@ -555,41 +600,6 @@ unp_usrreq(struct socket *so, int req, struct mbuf *m, struct mbuf *nam, error = unp_connect2(so, (struct socket *)nam, PRU_CONNECT2); break; - case PRU_RCVD: - switch (so->so_type) { - - case SOCK_DGRAM: - panic("uipc 1"); - /*NOTREACHED*/ - - case SOCK_SEQPACKET: /* FALLTHROUGH */ - case SOCK_STREAM: -#define rcv (&so->so_rcv) -#define snd (&so2->so_snd) - if (unp->unp_conn == 0) - break; - so2 = unp->unp_conn->unp_socket; - KASSERT(solocked2(so, so2)); - /* - * Adjust backpressure on sender - * and wakeup any waiting to write. - */ - snd->sb_mbmax += unp->unp_mbcnt - rcv->sb_mbcnt; - unp->unp_mbcnt = rcv->sb_mbcnt; - newhiwat = snd->sb_hiwat + unp->unp_cc - rcv->sb_cc; - (void)chgsbsize(so2->so_uidinfo, - &snd->sb_hiwat, newhiwat, RLIM_INFINITY); - unp->unp_cc = rcv->sb_cc; - sowwakeup(so2); -#undef snd -#undef rcv - break; - - default: - panic("uipc 2"); - } - break; - default: panic("piusrreq"); } @@ -1925,6 +1935,7 @@ const struct pr_usrreqs unp_usrreqs = { .pr_stat = unp_stat, .pr_peeraddr = unp_peeraddr, .pr_sockaddr = unp_sockaddr, + .pr_rcvd = unp_rcvd, .pr_recvoob = unp_recvoob, .pr_send = unp_send, .pr_sendoob = unp_sendoob, diff --git a/sys/net/if_gre.c b/sys/net/if_gre.c index 1d062944b133..d728f71da3aa 100644 --- a/sys/net/if_gre.c +++ b/sys/net/if_gre.c @@ -1,4 +1,4 @@ -/* $NetBSD: if_gre.c,v 1.158 2014/08/05 07:55:31 rtr Exp $ */ +/* $NetBSD: if_gre.c,v 1.159 2014/08/08 03:05:45 rtr Exp $ */ /* * Copyright (c) 1998, 2008 The NetBSD Foundation, Inc. @@ -45,7 +45,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: if_gre.c,v 1.158 2014/08/05 07:55:31 rtr Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_gre.c,v 1.159 2014/08/08 03:05:45 rtr Exp $"); #include "opt_atalk.h" #include "opt_gre.h" @@ -724,8 +724,7 @@ gre_soreceive(struct socket *so, struct mbuf **mp0) SBLASTRECORDCHK(&so->so_rcv, "soreceive 4"); SBLASTMBUFCHK(&so->so_rcv, "soreceive 4"); if (pr->pr_flags & PR_WANTRCVD && so->so_pcb) - (*pr->pr_usrreqs->pr_generic)(so, PRU_RCVD, NULL, - (struct mbuf *)(long)flags, NULL, curlwp); + (*pr->pr_usrreqs->pr_rcvd)(so, flags, curlwp); if (*mp0 == NULL && (flags & MSG_EOR) == 0 && (so->so_state & SS_CANTRCVMORE) == 0) { sbunlock(&so->so_rcv); diff --git a/sys/net/link_proto.c b/sys/net/link_proto.c index b532ca0d5d64..3833254f373d 100644 --- a/sys/net/link_proto.c +++ b/sys/net/link_proto.c @@ -1,4 +1,4 @@ -/* $NetBSD: link_proto.c,v 1.22 2014/08/05 07:55:31 rtr Exp $ */ +/* $NetBSD: link_proto.c,v 1.23 2014/08/08 03:05:45 rtr Exp $ */ /*- * Copyright (c) 1982, 1986, 1993 @@ -32,7 +32,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: link_proto.c,v 1.22 2014/08/05 07:55:31 rtr Exp $"); +__KERNEL_RCSID(0, "$NetBSD: link_proto.c,v 1.23 2014/08/08 03:05:45 rtr Exp $"); #include #include @@ -61,6 +61,7 @@ static int link_ioctl(struct socket *, u_long, void *, struct ifnet *); static int link_stat(struct socket *, struct stat *); static int link_peeraddr(struct socket *, struct mbuf *); static int link_sockaddr(struct socket *, struct mbuf *); +static int link_rcvd(struct socket *, int, struct lwp *); static int link_recvoob(struct socket *, struct mbuf *, int); static int link_send(struct socket *, struct mbuf *, struct mbuf *, struct mbuf *, struct lwp *); @@ -89,6 +90,7 @@ static const struct pr_usrreqs link_usrreqs = { .pr_stat = link_stat, .pr_peeraddr = link_peeraddr, .pr_sockaddr = link_sockaddr, + .pr_rcvd = link_rcvd, .pr_recvoob = link_recvoob, .pr_send = link_send, .pr_sendoob = link_sendoob, @@ -345,6 +347,14 @@ link_sockaddr(struct socket *so, struct mbuf *nam) return EOPNOTSUPP; } +static int +link_rcvd(struct socket *so, int flags, struct lwp *l) +{ + KASSERT(solocked(so)); + + return EOPNOTSUPP; +} + static int link_recvoob(struct socket *so, struct mbuf *m, int flags) { @@ -387,6 +397,7 @@ link_usrreq(struct socket *so, int req, struct mbuf *m, struct mbuf *nam, KASSERT(req != PRU_SENSE); KASSERT(req != PRU_PEERADDR); KASSERT(req != PRU_SOCKADDR); + KASSERT(req != PRU_RCVD); KASSERT(req != PRU_RCVOOB); KASSERT(req != PRU_SEND); KASSERT(req != PRU_SENDOOB); diff --git a/sys/net/raw_usrreq.c b/sys/net/raw_usrreq.c index 15299ef11e82..9554fa73ba85 100644 --- a/sys/net/raw_usrreq.c +++ b/sys/net/raw_usrreq.c @@ -1,4 +1,4 @@ -/* $NetBSD: raw_usrreq.c,v 1.50 2014/08/05 07:55:31 rtr Exp $ */ +/* $NetBSD: raw_usrreq.c,v 1.51 2014/08/08 03:05:45 rtr Exp $ */ /* * Copyright (c) 1980, 1986, 1993 @@ -36,7 +36,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: raw_usrreq.c,v 1.50 2014/08/05 07:55:31 rtr Exp $"); +__KERNEL_RCSID(0, "$NetBSD: raw_usrreq.c,v 1.51 2014/08/08 03:05:45 rtr Exp $"); #include #include @@ -215,6 +215,7 @@ raw_usrreq(struct socket *so, int req, struct mbuf *m, struct mbuf *nam, KASSERT(req != PRU_SENSE); KASSERT(req != PRU_PEERADDR); KASSERT(req != PRU_SOCKADDR); + KASSERT(req != PRU_RCVD); KASSERT(req != PRU_RCVOOB); KASSERT(req != PRU_SEND); KASSERT(req != PRU_SENDOOB); @@ -239,10 +240,6 @@ raw_usrreq(struct socket *so, int req, struct mbuf *m, struct mbuf *nam, error = EOPNOTSUPP; break; - case PRU_RCVD: - error = EOPNOTSUPP; - break; - default: panic("raw_usrreq"); } diff --git a/sys/net/rtsock.c b/sys/net/rtsock.c index dc772caffacf..e9c2fcd7219c 100644 --- a/sys/net/rtsock.c +++ b/sys/net/rtsock.c @@ -1,4 +1,4 @@ -/* $NetBSD: rtsock.c,v 1.161 2014/08/05 07:55:31 rtr Exp $ */ +/* $NetBSD: rtsock.c,v 1.162 2014/08/08 03:05:45 rtr Exp $ */ /* * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project. @@ -61,7 +61,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: rtsock.c,v 1.161 2014/08/05 07:55:31 rtr Exp $"); +__KERNEL_RCSID(0, "$NetBSD: rtsock.c,v 1.162 2014/08/08 03:05:45 rtr Exp $"); #ifdef _KERNEL_OPT #include "opt_inet.h" @@ -347,6 +347,14 @@ COMPATNAME(route_sockaddr)(struct socket *so, struct mbuf *nam) return 0; } +static int +COMPATNAME(route_rcvd)(struct socket *so, int flags, struct lwp *l) +{ + KASSERT(solocked(so)); + + return EOPNOTSUPP; +} + static int COMPATNAME(route_recvoob)(struct socket *so, struct mbuf *m, int flags) { @@ -402,6 +410,7 @@ COMPATNAME(route_usrreq)(struct socket *so, int req, struct mbuf *m, KASSERT(req != PRU_SENSE); KASSERT(req != PRU_PEERADDR); KASSERT(req != PRU_SOCKADDR); + KASSERT(req != PRU_RCVD); KASSERT(req != PRU_RCVOOB); KASSERT(req != PRU_SEND); KASSERT(req != PRU_SENDOOB); @@ -1512,6 +1521,7 @@ static const struct pr_usrreqs route_usrreqs = { .pr_stat = COMPATNAME(route_stat_wrapper), .pr_peeraddr = COMPATNAME(route_peeraddr_wrapper), .pr_sockaddr = COMPATNAME(route_sockaddr_wrapper), + .pr_rcvd = COMPATNAME(route_rcvd_wrapper), .pr_recvoob = COMPATNAME(route_recvoob_wrapper), .pr_send = COMPATNAME(route_send_wrapper), .pr_sendoob = COMPATNAME(route_sendoob_wrapper), diff --git a/sys/netatalk/ddp_usrreq.c b/sys/netatalk/ddp_usrreq.c index ea650ea77247..869f04a49c73 100644 --- a/sys/netatalk/ddp_usrreq.c +++ b/sys/netatalk/ddp_usrreq.c @@ -1,4 +1,4 @@ -/* $NetBSD: ddp_usrreq.c,v 1.61 2014/08/07 07:51:28 rtr Exp $ */ +/* $NetBSD: ddp_usrreq.c,v 1.62 2014/08/08 03:05:45 rtr Exp $ */ /* * Copyright (c) 1990,1991 Regents of The University of Michigan. @@ -27,7 +27,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: ddp_usrreq.c,v 1.61 2014/08/07 07:51:28 rtr Exp $"); +__KERNEL_RCSID(0, "$NetBSD: ddp_usrreq.c,v 1.62 2014/08/08 03:05:45 rtr Exp $"); #include "opt_mbuftrace.h" @@ -95,6 +95,7 @@ ddp_usrreq(struct socket *so, int req, struct mbuf *m, struct mbuf *addr, KASSERT(req != PRU_SENSE); KASSERT(req != PRU_PEERADDR); KASSERT(req != PRU_SOCKADDR); + KASSERT(req != PRU_RCVD); KASSERT(req != PRU_RCVOOB); KASSERT(req != PRU_SEND); KASSERT(req != PRU_SENDOOB); @@ -124,12 +125,6 @@ ddp_usrreq(struct socket *so, int req, struct mbuf *m, struct mbuf *addr, error = EOPNOTSUPP; break; - case PRU_RCVD: - /* - * Don't mfree. Good architecture... - */ - return (EOPNOTSUPP); - default: error = EOPNOTSUPP; } @@ -527,6 +522,14 @@ ddp_sockaddr(struct socket *so, struct mbuf *nam) return 0; } +static int +ddp_rcvd(struct socket *so, int flags, struct lwp *l) +{ + KASSERT(solocked(so)); + + return EOPNOTSUPP; +} + static int ddp_recvoob(struct socket *so, struct mbuf *m, int flags) { @@ -665,6 +668,7 @@ PR_WRAP_USRREQS(ddp) #define ddp_stat ddp_stat_wrapper #define ddp_peeraddr ddp_peeraddr_wrapper #define ddp_sockaddr ddp_sockaddr_wrapper +#define ddp_rcvd ddp_rcvd_wrapper #define ddp_recvoob ddp_recvoob_wrapper #define ddp_send ddp_send_wrapper #define ddp_sendoob ddp_sendoob_wrapper @@ -684,6 +688,7 @@ const struct pr_usrreqs ddp_usrreqs = { .pr_stat = ddp_stat, .pr_peeraddr = ddp_peeraddr, .pr_sockaddr = ddp_sockaddr, + .pr_rcvd = ddp_rcvd, .pr_recvoob = ddp_recvoob, .pr_send = ddp_send, .pr_sendoob = ddp_sendoob, diff --git a/sys/netbt/hci_socket.c b/sys/netbt/hci_socket.c index 27ee21981031..3c9a36015b1d 100644 --- a/sys/netbt/hci_socket.c +++ b/sys/netbt/hci_socket.c @@ -1,4 +1,4 @@ -/* $NetBSD: hci_socket.c,v 1.38 2014/08/05 07:55:31 rtr Exp $ */ +/* $NetBSD: hci_socket.c,v 1.39 2014/08/08 03:05:45 rtr Exp $ */ /*- * Copyright (c) 2005 Iain Hibbert. @@ -31,7 +31,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: hci_socket.c,v 1.38 2014/08/05 07:55:31 rtr Exp $"); +__KERNEL_RCSID(0, "$NetBSD: hci_socket.c,v 1.39 2014/08/08 03:05:45 rtr Exp $"); /* load symbolic names */ #ifdef BLUETOOTH_DEBUG @@ -646,6 +646,14 @@ hci_sockaddr(struct socket *so, struct mbuf *nam) return 0; } +static int +hci_rcvd(struct socket *so, int flags, struct lwp *l) +{ + KASSERT(solocked(so)); + + return EOPNOTSUPP; +} + static int hci_recvoob(struct socket *so, struct mbuf *m, int flags) { @@ -735,6 +743,7 @@ hci_usrreq(struct socket *up, int req, struct mbuf *m, KASSERT(req != PRU_SENSE); KASSERT(req != PRU_PEERADDR); KASSERT(req != PRU_SOCKADDR); + KASSERT(req != PRU_RCVD); KASSERT(req != PRU_RCVOOB); KASSERT(req != PRU_SEND); KASSERT(req != PRU_SENDOOB); @@ -751,9 +760,6 @@ hci_usrreq(struct socket *up, int req, struct mbuf *m, } switch(req) { - case PRU_RCVD: - return EOPNOTSUPP; /* (no release) */ - case PRU_CONNECT2: case PRU_FASTTIMO: case PRU_SLOWTIMO: @@ -995,6 +1001,7 @@ PR_WRAP_USRREQS(hci) #define hci_stat hci_stat_wrapper #define hci_peeraddr hci_peeraddr_wrapper #define hci_sockaddr hci_sockaddr_wrapper +#define hci_rcvd hci_rcvd_wrapper #define hci_recvoob hci_recvoob_wrapper #define hci_send hci_send_wrapper #define hci_sendoob hci_sendoob_wrapper @@ -1014,6 +1021,7 @@ const struct pr_usrreqs hci_usrreqs = { .pr_stat = hci_stat, .pr_peeraddr = hci_peeraddr, .pr_sockaddr = hci_sockaddr, + .pr_rcvd = hci_rcvd, .pr_recvoob = hci_recvoob, .pr_send = hci_send, .pr_sendoob = hci_sendoob, diff --git a/sys/netbt/l2cap_socket.c b/sys/netbt/l2cap_socket.c index 5a2e5138a6ee..bf247a3f9394 100644 --- a/sys/netbt/l2cap_socket.c +++ b/sys/netbt/l2cap_socket.c @@ -1,4 +1,4 @@ -/* $NetBSD: l2cap_socket.c,v 1.29 2014/08/05 07:55:31 rtr Exp $ */ +/* $NetBSD: l2cap_socket.c,v 1.30 2014/08/08 03:05:45 rtr Exp $ */ /*- * Copyright (c) 2005 Iain Hibbert. @@ -31,7 +31,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: l2cap_socket.c,v 1.29 2014/08/05 07:55:31 rtr Exp $"); +__KERNEL_RCSID(0, "$NetBSD: l2cap_socket.c,v 1.30 2014/08/08 03:05:45 rtr Exp $"); /* load symbolic names */ #ifdef BLUETOOTH_DEBUG @@ -274,6 +274,14 @@ l2cap_sockaddr(struct socket *so, struct mbuf *nam) return l2cap_sockaddr_pcb(pcb, sa); } +static int +l2cap_rcvd(struct socket *so, int flags, struct lwp *l) +{ + KASSERT(solocked(so)); + + return EOPNOTSUPP; +} + static int l2cap_recvoob(struct socket *so, struct mbuf *m, int flags) { @@ -342,9 +350,6 @@ l2cap_sendoob(struct socket *so, struct mbuf *m, struct mbuf *control) * User Request. * up is socket * m is optional mbuf chain containing message - * nam is either - * optional mbuf chain containing an address - * message flags (PRU_RCVD) * ctl is either * optional mbuf chain containing socket options * optional interface pointer PRU_PURGEIF @@ -374,6 +379,7 @@ l2cap_usrreq(struct socket *up, int req, struct mbuf *m, KASSERT(req != PRU_SENSE); KASSERT(req != PRU_PEERADDR); KASSERT(req != PRU_SOCKADDR); + KASSERT(req != PRU_RCVD); KASSERT(req != PRU_RCVOOB); KASSERT(req != PRU_SEND); KASSERT(req != PRU_SENDOOB); @@ -389,9 +395,6 @@ l2cap_usrreq(struct socket *up, int req, struct mbuf *m, } switch(req) { - case PRU_RCVD: - return EOPNOTSUPP; /* (no release) */ - case PRU_CONNECT2: case PRU_FASTTIMO: case PRU_SLOWTIMO: @@ -567,6 +570,7 @@ PR_WRAP_USRREQS(l2cap) #define l2cap_stat l2cap_stat_wrapper #define l2cap_peeraddr l2cap_peeraddr_wrapper #define l2cap_sockaddr l2cap_sockaddr_wrapper +#define l2cap_rcvd l2cap_rcvd_wrapper #define l2cap_recvoob l2cap_recvoob_wrapper #define l2cap_send l2cap_send_wrapper #define l2cap_sendoob l2cap_sendoob_wrapper @@ -586,6 +590,7 @@ const struct pr_usrreqs l2cap_usrreqs = { .pr_stat = l2cap_stat, .pr_peeraddr = l2cap_peeraddr, .pr_sockaddr = l2cap_sockaddr, + .pr_rcvd = l2cap_rcvd, .pr_recvoob = l2cap_recvoob, .pr_send = l2cap_send, .pr_sendoob = l2cap_sendoob, diff --git a/sys/netbt/rfcomm.h b/sys/netbt/rfcomm.h index b21f1f00caeb..778360a417e6 100644 --- a/sys/netbt/rfcomm.h +++ b/sys/netbt/rfcomm.h @@ -1,4 +1,4 @@ -/* $NetBSD: rfcomm.h,v 1.17 2014/08/05 07:55:32 rtr Exp $ */ +/* $NetBSD: rfcomm.h,v 1.18 2014/08/08 03:05:45 rtr Exp $ */ /*- * Copyright (c) 2006 Itronix Inc. @@ -55,7 +55,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $Id: rfcomm.h,v 1.17 2014/08/05 07:55:32 rtr Exp $ + * $Id: rfcomm.h,v 1.18 2014/08/08 03:05:45 rtr Exp $ * $FreeBSD: src/sys/netgraph/bluetooth/include/ng_btsocket_rfcomm.h,v 1.4 2005/01/11 01:39:53 emax Exp $ */ @@ -416,7 +416,7 @@ int rfcomm_disconnect_pcb(struct rfcomm_dlc *, int); void rfcomm_detach_pcb(struct rfcomm_dlc **); int rfcomm_listen_pcb(struct rfcomm_dlc *); int rfcomm_send_pcb(struct rfcomm_dlc *, struct mbuf *); -int rfcomm_rcvd(struct rfcomm_dlc *, size_t); +int rfcomm_rcvd_pcb(struct rfcomm_dlc *, size_t); int rfcomm_setopt(struct rfcomm_dlc *, const struct sockopt *); int rfcomm_getopt(struct rfcomm_dlc *, struct sockopt *); diff --git a/sys/netbt/rfcomm_socket.c b/sys/netbt/rfcomm_socket.c index c1020723c85e..122d5a385d4b 100644 --- a/sys/netbt/rfcomm_socket.c +++ b/sys/netbt/rfcomm_socket.c @@ -1,4 +1,4 @@ -/* $NetBSD: rfcomm_socket.c,v 1.31 2014/08/05 07:55:32 rtr Exp $ */ +/* $NetBSD: rfcomm_socket.c,v 1.32 2014/08/08 03:05:45 rtr Exp $ */ /*- * Copyright (c) 2006 Itronix Inc. @@ -32,7 +32,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: rfcomm_socket.c,v 1.31 2014/08/05 07:55:32 rtr Exp $"); +__KERNEL_RCSID(0, "$NetBSD: rfcomm_socket.c,v 1.32 2014/08/08 03:05:45 rtr Exp $"); /* load symbolic names */ #ifdef BLUETOOTH_DEBUG @@ -108,7 +108,7 @@ rfcomm_attach(struct socket *so, int proto) if (error) return error; - error = rfcomm_rcvd(so->so_pcb, sbspace(&so->so_rcv)); + error = rfcomm_rcvd_pcb(so->so_pcb, sbspace(&so->so_rcv)); if (error) { rfcomm_detach_pcb((struct rfcomm_dlc **)&so->so_pcb); return error; @@ -282,6 +282,19 @@ rfcomm_sockaddr(struct socket *so, struct mbuf *nam) return rfcomm_sockaddr_pcb(pcb, sa); } +static int +rfcomm_rcvd(struct socket *so, int flags, struct lwp *l) +{ + struct rfcomm_dlc *pcb = so->so_pcb; + + KASSERT(solocked(so)); + + if (pcb == NULL) + return EINVAL; + + return rfcomm_rcvd_pcb(pcb, sbspace(&so->so_rcv)); +} + static int rfcomm_recvoob(struct socket *so, struct mbuf *m, int flags) { @@ -340,9 +353,6 @@ rfcomm_sendoob(struct socket *so, struct mbuf *m, struct mbuf *control) * User Request. * up is socket * m is optional mbuf chain containing message - * nam is either - * optional mbuf chain containing an address - * message flags (PRU_RCVD) * ctl is either * optional mbuf chain containing socket options * optional interface pointer PRU_PURGEIF @@ -372,6 +382,7 @@ rfcomm_usrreq(struct socket *up, int req, struct mbuf *m, KASSERT(req != PRU_SENSE); KASSERT(req != PRU_PEERADDR); KASSERT(req != PRU_SOCKADDR); + KASSERT(req != PRU_RCVD); KASSERT(req != PRU_RCVOOB); KASSERT(req != PRU_SEND); KASSERT(req != PRU_SENDOOB); @@ -386,9 +397,6 @@ rfcomm_usrreq(struct socket *up, int req, struct mbuf *m, } switch(req) { - case PRU_RCVD: - return rfcomm_rcvd(pcb, sbspace(&up->so_rcv)); - case PRU_CONNECT2: case PRU_FASTTIMO: case PRU_SLOWTIMO: @@ -576,6 +584,7 @@ PR_WRAP_USRREQS(rfcomm) #define rfcomm_stat rfcomm_stat_wrapper #define rfcomm_peeraddr rfcomm_peeraddr_wrapper #define rfcomm_sockaddr rfcomm_sockaddr_wrapper +#define rfcomm_rcvd rfcomm_rcvd_wrapper #define rfcomm_recvoob rfcomm_recvoob_wrapper #define rfcomm_send rfcomm_send_wrapper #define rfcomm_sendoob rfcomm_sendoob_wrapper @@ -595,6 +604,7 @@ const struct pr_usrreqs rfcomm_usrreqs = { .pr_stat = rfcomm_stat, .pr_peeraddr = rfcomm_peeraddr, .pr_sockaddr = rfcomm_sockaddr, + .pr_rcvd = rfcomm_rcvd, .pr_recvoob = rfcomm_recvoob, .pr_send = rfcomm_send, .pr_sendoob = rfcomm_sendoob, diff --git a/sys/netbt/rfcomm_upper.c b/sys/netbt/rfcomm_upper.c index 4d366aaf49aa..249a78c7c65d 100644 --- a/sys/netbt/rfcomm_upper.c +++ b/sys/netbt/rfcomm_upper.c @@ -1,4 +1,4 @@ -/* $NetBSD: rfcomm_upper.c,v 1.20 2014/08/05 07:55:32 rtr Exp $ */ +/* $NetBSD: rfcomm_upper.c,v 1.21 2014/08/08 03:05:45 rtr Exp $ */ /*- * Copyright (c) 2006 Itronix Inc. @@ -32,7 +32,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: rfcomm_upper.c,v 1.20 2014/08/05 07:55:32 rtr Exp $"); +__KERNEL_RCSID(0, "$NetBSD: rfcomm_upper.c,v 1.21 2014/08/08 03:05:45 rtr Exp $"); #include #include @@ -406,7 +406,7 @@ rfcomm_send_pcb(struct rfcomm_dlc *dlc, struct mbuf *m) } /* - * rfcomm_rcvd(dlc, space) + * rfcomm_rcvd_pcb(dlc, space) * * Indicate space now available in receive buffer * @@ -415,7 +415,7 @@ rfcomm_send_pcb(struct rfcomm_dlc *dlc, struct mbuf *m) * buffer after that. */ int -rfcomm_rcvd(struct rfcomm_dlc *dlc, size_t space) +rfcomm_rcvd_pcb(struct rfcomm_dlc *dlc, size_t space) { KASSERT(dlc != NULL); diff --git a/sys/netbt/sco_socket.c b/sys/netbt/sco_socket.c index 2563cf0af4d1..52de1b80ccb2 100644 --- a/sys/netbt/sco_socket.c +++ b/sys/netbt/sco_socket.c @@ -1,4 +1,4 @@ -/* $NetBSD: sco_socket.c,v 1.31 2014/08/05 07:55:32 rtr Exp $ */ +/* $NetBSD: sco_socket.c,v 1.32 2014/08/08 03:05:45 rtr Exp $ */ /*- * Copyright (c) 2006 Itronix Inc. @@ -30,7 +30,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: sco_socket.c,v 1.31 2014/08/05 07:55:32 rtr Exp $"); +__KERNEL_RCSID(0, "$NetBSD: sco_socket.c,v 1.32 2014/08/08 03:05:45 rtr Exp $"); /* load symbolic names */ #ifdef BLUETOOTH_DEBUG @@ -265,6 +265,14 @@ sco_sockaddr(struct socket *so, struct mbuf *nam) return sco_sockaddr_pcb(pcb, sa); } +static int +sco_rcvd(struct socket *so, int flags, struct lwp *l) +{ + KASSERT(solocked(so)); + + return EOPNOTSUPP; +} + static int sco_recvoob(struct socket *so, struct mbuf *m, int flags) { @@ -359,6 +367,7 @@ sco_usrreq(struct socket *up, int req, struct mbuf *m, KASSERT(req != PRU_SENSE); KASSERT(req != PRU_PEERADDR); KASSERT(req != PRU_SOCKADDR); + KASSERT(req != PRU_RCVD); KASSERT(req != PRU_RCVOOB); KASSERT(req != PRU_SEND); KASSERT(req != PRU_SENDOOB); @@ -375,9 +384,6 @@ sco_usrreq(struct socket *up, int req, struct mbuf *m, } switch(req) { - case PRU_RCVD: - return EOPNOTSUPP; /* (no release) */ - case PRU_CONNECT2: case PRU_FASTTIMO: case PRU_SLOWTIMO: @@ -532,6 +538,7 @@ PR_WRAP_USRREQS(sco) #define sco_stat sco_stat_wrapper #define sco_peeraddr sco_peeraddr_wrapper #define sco_sockaddr sco_sockaddr_wrapper +#define sco_rcvd sco_rcvd_wrapper #define sco_recvoob sco_recvoob_wrapper #define sco_send sco_send_wrapper #define sco_sendoob sco_sendoob_wrapper @@ -551,6 +558,7 @@ const struct pr_usrreqs sco_usrreqs = { .pr_stat = sco_stat, .pr_peeraddr = sco_peeraddr, .pr_sockaddr = sco_sockaddr, + .pr_rcvd = sco_rcvd, .pr_recvoob = sco_recvoob, .pr_send = sco_send, .pr_sendoob = sco_sendoob, diff --git a/sys/netinet/raw_ip.c b/sys/netinet/raw_ip.c index 776a158c34a5..2f420a2eb12c 100644 --- a/sys/netinet/raw_ip.c +++ b/sys/netinet/raw_ip.c @@ -1,4 +1,4 @@ -/* $NetBSD: raw_ip.c,v 1.143 2014/08/05 07:55:32 rtr Exp $ */ +/* $NetBSD: raw_ip.c,v 1.144 2014/08/08 03:05:45 rtr Exp $ */ /* * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project. @@ -65,7 +65,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: raw_ip.c,v 1.143 2014/08/05 07:55:32 rtr Exp $"); +__KERNEL_RCSID(0, "$NetBSD: raw_ip.c,v 1.144 2014/08/08 03:05:45 rtr Exp $"); #include "opt_inet.h" #include "opt_compat_netbsd.h" @@ -714,6 +714,14 @@ rip_sockaddr(struct socket *so, struct mbuf *nam) return 0; } +static int +rip_rcvd(struct socket *so, int flags, struct lwp *l) +{ + KASSERT(solocked(so)); + + return EOPNOTSUPP; +} + static int rip_recvoob(struct socket *so, struct mbuf *m, int flags) { @@ -802,6 +810,7 @@ rip_usrreq(struct socket *so, int req, struct mbuf *m, struct mbuf *nam, KASSERT(req != PRU_SENSE); KASSERT(req != PRU_PEERADDR); KASSERT(req != PRU_SOCKADDR); + KASSERT(req != PRU_RCVD); KASSERT(req != PRU_RCVOOB); KASSERT(req != PRU_SEND); KASSERT(req != PRU_SENDOOB); @@ -832,10 +841,6 @@ rip_usrreq(struct socket *so, int req, struct mbuf *m, struct mbuf *nam, error = EOPNOTSUPP; break; - case PRU_RCVD: - error = EOPNOTSUPP; - break; - default: panic("rip_usrreq"); } @@ -858,6 +863,7 @@ PR_WRAP_USRREQS(rip) #define rip_stat rip_stat_wrapper #define rip_peeraddr rip_peeraddr_wrapper #define rip_sockaddr rip_sockaddr_wrapper +#define rip_rcvd rip_rcvd_wrapper #define rip_recvoob rip_recvoob_wrapper #define rip_send rip_send_wrapper #define rip_sendoob rip_sendoob_wrapper @@ -877,6 +883,7 @@ const struct pr_usrreqs rip_usrreqs = { .pr_stat = rip_stat, .pr_peeraddr = rip_peeraddr, .pr_sockaddr = rip_sockaddr, + .pr_rcvd = rip_rcvd, .pr_recvoob = rip_recvoob, .pr_send = rip_send, .pr_sendoob = rip_sendoob, diff --git a/sys/netinet/tcp_input.c b/sys/netinet/tcp_input.c index c419013db080..218c5967df82 100644 --- a/sys/netinet/tcp_input.c +++ b/sys/netinet/tcp_input.c @@ -1,4 +1,4 @@ -/* $NetBSD: tcp_input.c,v 1.333 2014/05/30 02:27:29 rmind Exp $ */ +/* $NetBSD: tcp_input.c,v 1.334 2014/08/08 03:05:45 rtr Exp $ */ /* * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project. @@ -148,7 +148,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: tcp_input.c,v 1.333 2014/05/30 02:27:29 rmind Exp $"); +__KERNEL_RCSID(0, "$NetBSD: tcp_input.c,v 1.334 2014/08/08 03:05:45 rtr Exp $"); #include "opt_inet.h" #include "opt_ipsec.h" @@ -2879,7 +2879,7 @@ dodata: /* XXX */ * and arranging for acknowledgement of receipt if necessary. * This process logically involves adjusting tp->rcv_wnd as data * is presented to the user (this happens in tcp_usrreq.c, - * case PRU_RCVD). If a FIN has already been received on this + * tcp_rcvd()). If a FIN has already been received on this * connection then we just ignore the text. */ if ((tlen || (tiflags & TH_FIN)) && diff --git a/sys/netinet/tcp_usrreq.c b/sys/netinet/tcp_usrreq.c index ff12267cd178..7af7c8123d6f 100644 --- a/sys/netinet/tcp_usrreq.c +++ b/sys/netinet/tcp_usrreq.c @@ -1,4 +1,4 @@ -/* $NetBSD: tcp_usrreq.c,v 1.198 2014/08/05 07:55:32 rtr Exp $ */ +/* $NetBSD: tcp_usrreq.c,v 1.199 2014/08/08 03:05:45 rtr Exp $ */ /* * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project. @@ -99,7 +99,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: tcp_usrreq.c,v 1.198 2014/08/05 07:55:32 rtr Exp $"); +__KERNEL_RCSID(0, "$NetBSD: tcp_usrreq.c,v 1.199 2014/08/08 03:05:45 rtr Exp $"); #include "opt_inet.h" #include "opt_ipsec.h" @@ -244,6 +244,7 @@ tcp_usrreq(struct socket *so, int req, struct mbuf *m, struct mbuf *nam, KASSERT(req != PRU_SENSE); KASSERT(req != PRU_PEERADDR); KASSERT(req != PRU_SOCKADDR); + KASSERT(req != PRU_RCVD); KASSERT(req != PRU_RCVOOB); KASSERT(req != PRU_SEND); KASSERT(req != PRU_SENDOOB); @@ -298,21 +299,6 @@ tcp_usrreq(struct socket *so, int req, struct mbuf *m, struct mbuf *nam, error = EOPNOTSUPP; break; - /* - * After a receive, possibly send window update to peer. - */ - case PRU_RCVD: - /* - * soreceive() calls this function when a user receives - * ancillary data on a listening socket. We don't call - * tcp_output in such a case, since there is no header - * template for a listening socket and hence the kernel - * will panic. - */ - if ((so->so_state & (SS_ISCONNECTED|SS_ISCONNECTING)) != 0) - (void) tcp_output(tp); - break; - default: panic("tcp_usrreq"); } @@ -1066,6 +1052,40 @@ tcp_sockaddr(struct socket *so, struct mbuf *nam) return 0; } +static int +tcp_rcvd(struct socket *so, int flags, struct lwp *l) +{ + struct inpcb *inp = NULL; + struct in6pcb *in6p = NULL; + struct tcpcb *tp = NULL; + int ostate = 0; + int error = 0; + int s; + + if ((error = tcp_getpcb(so, &inp, &in6p, &tp)) != 0) + return error; + + ostate = tcp_debug_capture(tp, PRU_RCVD); + + /* + * After a receive, possibly send window update to peer. + * + * soreceive() calls this function when a user receives + * ancillary data on a listening socket. We don't call + * tcp_output in such a case, since there is no header + * template for a listening socket and hence the kernel + * will panic. + */ + s = splsoftnet(); + if ((so->so_state & (SS_ISCONNECTED|SS_ISCONNECTING)) != 0) + (void) tcp_output(tp); + splx(s); + + tcp_debug_trace(so, tp, ostate, PRU_RCVD); + + return 0; +} + static int tcp_recvoob(struct socket *so, struct mbuf *m, int flags) { @@ -2430,6 +2450,7 @@ PR_WRAP_USRREQS(tcp) #define tcp_stat tcp_stat_wrapper #define tcp_peeraddr tcp_peeraddr_wrapper #define tcp_sockaddr tcp_sockaddr_wrapper +#define tcp_rcvd tcp_rcvd_wrapper #define tcp_recvoob tcp_recvoob_wrapper #define tcp_send tcp_send_wrapper #define tcp_sendoob tcp_sendoob_wrapper @@ -2449,6 +2470,7 @@ const struct pr_usrreqs tcp_usrreqs = { .pr_stat = tcp_stat, .pr_peeraddr = tcp_peeraddr, .pr_sockaddr = tcp_sockaddr, + .pr_rcvd = tcp_rcvd, .pr_recvoob = tcp_recvoob, .pr_send = tcp_send, .pr_sendoob = tcp_sendoob, diff --git a/sys/netinet/udp_usrreq.c b/sys/netinet/udp_usrreq.c index bdcebdd41b68..30ab50dbbe2e 100644 --- a/sys/netinet/udp_usrreq.c +++ b/sys/netinet/udp_usrreq.c @@ -1,4 +1,4 @@ -/* $NetBSD: udp_usrreq.c,v 1.215 2014/08/05 07:55:32 rtr Exp $ */ +/* $NetBSD: udp_usrreq.c,v 1.216 2014/08/08 03:05:45 rtr Exp $ */ /* * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project. @@ -66,7 +66,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: udp_usrreq.c,v 1.215 2014/08/05 07:55:32 rtr Exp $"); +__KERNEL_RCSID(0, "$NetBSD: udp_usrreq.c,v 1.216 2014/08/08 03:05:45 rtr Exp $"); #include "opt_inet.h" #include "opt_compat_netbsd.h" @@ -1040,6 +1040,14 @@ udp_sockaddr(struct socket *so, struct mbuf *nam) return 0; } +static int +udp_rcvd(struct socket *so, int flags, struct lwp *l) +{ + KASSERT(solocked(so)); + + return EOPNOTSUPP; +} + static int udp_recvoob(struct socket *so, struct mbuf *m, int flags) { @@ -1131,6 +1139,7 @@ udp_usrreq(struct socket *so, int req, struct mbuf *m, struct mbuf *nam, KASSERT(req != PRU_SENSE); KASSERT(req != PRU_PEERADDR); KASSERT(req != PRU_SOCKADDR); + KASSERT(req != PRU_RCVD); KASSERT(req != PRU_RCVOOB); KASSERT(req != PRU_SEND); KASSERT(req != PRU_SENDOOB); @@ -1164,10 +1173,6 @@ udp_usrreq(struct socket *so, int req, struct mbuf *m, struct mbuf *nam, error = EOPNOTSUPP; break; - case PRU_RCVD: - error = EOPNOTSUPP; - break; - default: panic("udp_usrreq"); } @@ -1407,6 +1412,7 @@ PR_WRAP_USRREQS(udp) #define udp_stat udp_stat_wrapper #define udp_peeraddr udp_peeraddr_wrapper #define udp_sockaddr udp_sockaddr_wrapper +#define udp_rcvd udp_rcvd_wrapper #define udp_recvoob udp_recvoob_wrapper #define udp_send udp_send_wrapper #define udp_sendoob udp_sendoob_wrapper @@ -1426,6 +1432,7 @@ const struct pr_usrreqs udp_usrreqs = { .pr_stat = udp_stat, .pr_peeraddr = udp_peeraddr, .pr_sockaddr = udp_sockaddr, + .pr_rcvd = udp_rcvd, .pr_recvoob = udp_recvoob, .pr_send = udp_send, .pr_sendoob = udp_sendoob, diff --git a/sys/netinet6/raw_ip6.c b/sys/netinet6/raw_ip6.c index 8e0340304970..51f8572fc45a 100644 --- a/sys/netinet6/raw_ip6.c +++ b/sys/netinet6/raw_ip6.c @@ -1,4 +1,4 @@ -/* $NetBSD: raw_ip6.c,v 1.134 2014/08/05 07:55:32 rtr Exp $ */ +/* $NetBSD: raw_ip6.c,v 1.135 2014/08/08 03:05:45 rtr Exp $ */ /* $KAME: raw_ip6.c,v 1.82 2001/07/23 18:57:56 jinmei Exp $ */ /* @@ -62,7 +62,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: raw_ip6.c,v 1.134 2014/08/05 07:55:32 rtr Exp $"); +__KERNEL_RCSID(0, "$NetBSD: raw_ip6.c,v 1.135 2014/08/08 03:05:45 rtr Exp $"); #include "opt_ipsec.h" @@ -829,6 +829,14 @@ rip6_sockaddr(struct socket *so, struct mbuf *nam) return 0; } +static int +rip6_rcvd(struct socket *so, int flags, struct lwp *l) +{ + KASSERT(solocked(so)); + + return EOPNOTSUPP; +} + static int rip6_recvoob(struct socket *so, struct mbuf *m, int flags) { @@ -920,6 +928,7 @@ rip6_usrreq(struct socket *so, int req, struct mbuf *m, KASSERT(req != PRU_SENSE); KASSERT(req != PRU_PEERADDR); KASSERT(req != PRU_SOCKADDR); + KASSERT(req != PRU_RCVD); KASSERT(req != PRU_RCVOOB); KASSERT(req != PRU_SEND); KASSERT(req != PRU_SENDOOB); @@ -938,13 +947,6 @@ rip6_usrreq(struct socket *so, int req, struct mbuf *m, error = EOPNOTSUPP; break; - /* - * Not supported. - */ - case PRU_RCVD: - error = EOPNOTSUPP; - break; - default: panic("rip6_usrreq"); } @@ -1006,6 +1008,7 @@ PR_WRAP_USRREQS(rip6) #define rip6_stat rip6_stat_wrapper #define rip6_peeraddr rip6_peeraddr_wrapper #define rip6_sockaddr rip6_sockaddr_wrapper +#define rip6_rcvd rip6_rcvd_wrapper #define rip6_recvoob rip6_recvoob_wrapper #define rip6_send rip6_send_wrapper #define rip6_sendoob rip6_sendoob_wrapper @@ -1025,6 +1028,7 @@ const struct pr_usrreqs rip6_usrreqs = { .pr_stat = rip6_stat, .pr_peeraddr = rip6_peeraddr, .pr_sockaddr = rip6_sockaddr, + .pr_rcvd = rip6_rcvd, .pr_recvoob = rip6_recvoob, .pr_send = rip6_send, .pr_sendoob = rip6_sendoob, diff --git a/sys/netinet6/udp6_usrreq.c b/sys/netinet6/udp6_usrreq.c index 3701ac305eb2..536c77cf5a20 100644 --- a/sys/netinet6/udp6_usrreq.c +++ b/sys/netinet6/udp6_usrreq.c @@ -1,4 +1,4 @@ -/* $NetBSD: udp6_usrreq.c,v 1.113 2014/08/05 07:55:32 rtr Exp $ */ +/* $NetBSD: udp6_usrreq.c,v 1.114 2014/08/08 03:05:45 rtr Exp $ */ /* $KAME: udp6_usrreq.c,v 1.86 2001/05/27 17:33:00 itojun Exp $ */ /* @@ -62,7 +62,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: udp6_usrreq.c,v 1.113 2014/08/05 07:55:32 rtr Exp $"); +__KERNEL_RCSID(0, "$NetBSD: udp6_usrreq.c,v 1.114 2014/08/08 03:05:45 rtr Exp $"); #include "opt_inet.h" #include "opt_inet_csum.h" @@ -827,6 +827,14 @@ udp6_sockaddr(struct socket *so, struct mbuf *nam) return 0; } +static int +udp6_rcvd(struct socket *so, int flags, struct lwp *l) +{ + KASSERT(solocked(so)); + + return EOPNOTSUPP; +} + static int udp6_recvoob(struct socket *so, struct mbuf *m, int flags) { @@ -887,6 +895,7 @@ udp6_usrreq(struct socket *so, int req, struct mbuf *m, struct mbuf *addr6, KASSERT(req != PRU_SENSE); KASSERT(req != PRU_PEERADDR); KASSERT(req != PRU_SOCKADDR); + KASSERT(req != PRU_RCVD); KASSERT(req != PRU_RCVOOB); KASSERT(req != PRU_SEND); KASSERT(req != PRU_SENDOOB); @@ -913,9 +922,6 @@ udp6_usrreq(struct socket *so, int req, struct mbuf *m, struct mbuf *addr6, error = EOPNOTSUPP; break; - case PRU_RCVD: - return EOPNOTSUPP; /* do not free mbuf's */ - default: panic("udp6_usrreq"); } @@ -1010,6 +1016,7 @@ PR_WRAP_USRREQS(udp6) #define udp6_stat udp6_stat_wrapper #define udp6_peeraddr udp6_peeraddr_wrapper #define udp6_sockaddr udp6_sockaddr_wrapper +#define udp6_rcvd udp6_rcvd_wrapper #define udp6_recvoob udp6_recvoob_wrapper #define udp6_send udp6_send_wrapper #define udp6_sendoob udp6_sendoob_wrapper @@ -1029,6 +1036,7 @@ const struct pr_usrreqs udp6_usrreqs = { .pr_stat = udp6_stat, .pr_peeraddr = udp6_peeraddr, .pr_sockaddr = udp6_sockaddr, + .pr_rcvd = udp6_rcvd, .pr_recvoob = udp6_recvoob, .pr_send = udp6_send, .pr_sendoob = udp6_sendoob, diff --git a/sys/netipsec/keysock.c b/sys/netipsec/keysock.c index 758e9c7b3780..81d01670c24a 100644 --- a/sys/netipsec/keysock.c +++ b/sys/netipsec/keysock.c @@ -1,4 +1,4 @@ -/* $NetBSD: keysock.c,v 1.41 2014/08/05 07:55:32 rtr Exp $ */ +/* $NetBSD: keysock.c,v 1.42 2014/08/08 03:05:45 rtr Exp $ */ /* $FreeBSD: src/sys/netipsec/keysock.c,v 1.3.2.1 2003/01/24 05:11:36 sam Exp $ */ /* $KAME: keysock.c,v 1.25 2001/08/13 20:07:41 itojun Exp $ */ @@ -32,7 +32,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: keysock.c,v 1.41 2014/08/05 07:55:32 rtr Exp $"); +__KERNEL_RCSID(0, "$NetBSD: keysock.c,v 1.42 2014/08/08 03:05:45 rtr Exp $"); #include "opt_ipsec.h" @@ -608,6 +608,14 @@ key_sockaddr(struct socket *so, struct mbuf *nam) return 0; } +static int +key_rcvd(struct socket *so, int flags, struct lwp *l) +{ + KASSERT(solocked(so)); + + return EOPNOTSUPP; +} + static int key_recvoob(struct socket *so, struct mbuf *m, int flags) { @@ -666,6 +674,7 @@ key_usrreq(struct socket *so, int req,struct mbuf *m, struct mbuf *nam, KASSERT(req != PRU_SENSE); KASSERT(req != PRU_PEERADDR); KASSERT(req != PRU_SOCKADDR); + KASSERT(req != PRU_RCVD); KASSERT(req != PRU_RCVOOB); KASSERT(req != PRU_SEND); KASSERT(req != PRU_SENDOOB); @@ -698,6 +707,7 @@ PR_WRAP_USRREQS(key) #define key_stat key_stat_wrapper #define key_peeraddr key_peeraddr_wrapper #define key_sockaddr key_sockaddr_wrapper +#define key_rcvd key_rcvd_wrapper #define key_recvoob key_recvoob_wrapper #define key_send key_send_wrapper #define key_sendoob key_sendoob_wrapper @@ -717,6 +727,7 @@ const struct pr_usrreqs key_usrreqs = { .pr_stat = key_stat, .pr_peeraddr = key_peeraddr, .pr_sockaddr = key_sockaddr, + .pr_rcvd = key_rcvd, .pr_recvoob = key_recvoob, .pr_send = key_send, .pr_sendoob = key_sendoob, diff --git a/sys/netmpls/mpls_proto.c b/sys/netmpls/mpls_proto.c index b5ab493b1621..4be013c9dd7b 100644 --- a/sys/netmpls/mpls_proto.c +++ b/sys/netmpls/mpls_proto.c @@ -1,4 +1,4 @@ -/* $NetBSD: mpls_proto.c,v 1.22 2014/08/05 07:55:32 rtr Exp $ */ +/* $NetBSD: mpls_proto.c,v 1.23 2014/08/08 03:05:45 rtr Exp $ */ /* * Copyright (c) 2010 The NetBSD Foundation, Inc. @@ -30,7 +30,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: mpls_proto.c,v 1.22 2014/08/05 07:55:32 rtr Exp $"); +__KERNEL_RCSID(0, "$NetBSD: mpls_proto.c,v 1.23 2014/08/08 03:05:45 rtr Exp $"); #include "opt_inet.h" #include "opt_mbuftrace.h" @@ -180,6 +180,14 @@ mpls_sockaddr(struct socket *so, struct mbuf *nam) return EOPNOTSUPP; } +static int +mpls_rcvd(struct socket *so, int flags, struct lwp *l) +{ + KASSERT(solocked(so)); + + return EOPNOTSUPP; +} + static int mpls_recvoob(struct socket *so, struct mbuf *m, int flags) { @@ -223,6 +231,7 @@ mpls_usrreq(struct socket *so, int req, struct mbuf *m, KASSERT(req != PRU_SENSE); KASSERT(req != PRU_PEERADDR); KASSERT(req != PRU_SOCKADDR); + KASSERT(req != PRU_RCVD); KASSERT(req != PRU_RCVOOB); KASSERT(req != PRU_SEND); KASSERT(req != PRU_SENDOOB); @@ -325,6 +334,7 @@ PR_WRAP_USRREQS(mpls) #define mpls_stat mpls_stat_wrapper #define mpls_peeraddr mpls_peeraddr_wrapper #define mpls_sockaddr mpls_sockaddr_wrapper +#define mpls_rcvd mpls_rcvd_wrapper #define mpls_recvoob mpls_recvoob_wrapper #define mpls_send mpls_send_wrapper #define mpls_sendoob mpls_sendoob_wrapper @@ -344,6 +354,7 @@ static const struct pr_usrreqs mpls_usrreqs = { .pr_stat = mpls_stat, .pr_peeraddr = mpls_peeraddr, .pr_sockaddr = mpls_sockaddr, + .pr_rcvd = mpls_rcvd, .pr_recvoob = mpls_recvoob, .pr_send = mpls_send, .pr_sendoob = mpls_sendoob, diff --git a/sys/netnatm/natm.c b/sys/netnatm/natm.c index a8d435d260ac..bc66ce6938f1 100644 --- a/sys/netnatm/natm.c +++ b/sys/netnatm/natm.c @@ -1,4 +1,4 @@ -/* $NetBSD: natm.c,v 1.43 2014/08/05 07:55:32 rtr Exp $ */ +/* $NetBSD: natm.c,v 1.44 2014/08/08 03:05:45 rtr Exp $ */ /* * Copyright (c) 1996 Charles D. Cranor and Washington University. @@ -30,7 +30,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: natm.c,v 1.43 2014/08/05 07:55:32 rtr Exp $"); +__KERNEL_RCSID(0, "$NetBSD: natm.c,v 1.44 2014/08/08 03:05:45 rtr Exp $"); #include #include @@ -313,17 +313,61 @@ natm_peeraddr(struct socket *so, struct mbuf *nam) static int natm_sockaddr(struct socket *so, struct mbuf *nam) { - KASSERT(solocked(so)); + KASSERT(solocked(so)); - return EOPNOTSUPP; + return EOPNOTSUPP; +} + +static int +natm_rcvd(struct socket *so, int flags, struct lwp *l) +{ + KASSERT(solocked(so)); + + return EOPNOTSUPP; } static int natm_recvoob(struct socket *so, struct mbuf *m, int flags) { - KASSERT(solocked(so)); + KASSERT(solocked(so)); - return EOPNOTSUPP; + return EOPNOTSUPP; +} + +static int +natm_send(struct socket *so, struct mbuf *m, struct mbuf *nam, + struct mbuf *control) +{ + struct natmpcb *npcb = (struct natmpcb *) so->so_pcb; + struct atm_pseudohdr *aph; + + KASSERT(solocked(so)); + KASSERT(pcb != NULL); + KASSERT(m != NULL); + + if (control && control->m_len) { + m_freem(control); + m_freem(m); + return EINVAL; + } + + /* + * send the data. we must put an atm_pseudohdr on first + */ + s = SPLSOFTNET(); + M_PREPEND(m, sizeof(*aph), M_WAITOK); + if (m == NULL) { + error = ENOBUFS; + break; + } + aph = mtod(m, struct atm_pseudohdr *); + ATM_PH_VPI(aph) = npcb->npcb_vpi; + ATM_PH_SETVCI(aph, npcb->npcb_vci); + ATM_PH_FLAGS(aph) = (proto == PROTO_NATMAAL5) ? ATM_PH_AAL5 : 0; + error = atm_output(npcb->npcb_ifp, m, NULL, NULL); + splx(s); + + return error; } static int @@ -399,6 +443,7 @@ natm_usrreq(struct socket *so, int req, struct mbuf *m, struct mbuf *nam, KASSERT(req != PRU_SENSE); KASSERT(req != PRU_PEERADDR); KASSERT(req != PRU_SOCKADDR); + KASSERT(req != PRU_RCVD); KASSERT(req != PRU_RCVOOB); KASSERT(req != PRU_SEND); KASSERT(req != PRU_SENDOOB); @@ -414,7 +459,6 @@ natm_usrreq(struct socket *so, int req, struct mbuf *m, struct mbuf *nam, switch (req) { case PRU_CONNECT2: /* connect two sockets */ - case PRU_RCVD: /* have taken data; more room now */ case PRU_FASTTIMO: /* 200ms timeout */ case PRU_SLOWTIMO: /* 500ms timeout */ case PRU_PROTORCV: /* receive from below */ @@ -525,6 +569,7 @@ PR_WRAP_USRREQS(natm) #define natm_stat natm_stat_wrapper #define natm_peeraddr natm_peeraddr_wrapper #define natm_sockaddr natm_sockaddr_wrapper +#define natm_rcvd natm_rcvd_wrapper #define natm_recvoob natm_recvoob_wrapper #define natm_send natm_send_wrapper #define natm_sendoob natm_sendoob_wrapper @@ -544,6 +589,7 @@ const struct pr_usrreqs natm_usrreqs = { .pr_stat = natm_stat, .pr_peeraddr = natm_peeraddr, .pr_sockaddr = natm_sockaddr, + .pr_rcvd = natm_rcvd, .pr_recvoob = natm_recvoob, .pr_send = natm_send, .pr_sendoob = natm_sendoob, diff --git a/sys/rump/net/lib/libsockin/sockin.c b/sys/rump/net/lib/libsockin/sockin.c index d86d4e592b5f..390e93660480 100644 --- a/sys/rump/net/lib/libsockin/sockin.c +++ b/sys/rump/net/lib/libsockin/sockin.c @@ -1,4 +1,4 @@ -/* $NetBSD: sockin.c,v 1.56 2014/08/05 07:55:32 rtr Exp $ */ +/* $NetBSD: sockin.c,v 1.57 2014/08/08 03:05:45 rtr Exp $ */ /* * Copyright (c) 2008, 2009 Antti Kantee. All Rights Reserved. @@ -26,7 +26,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: sockin.c,v 1.56 2014/08/05 07:55:32 rtr Exp $"); +__KERNEL_RCSID(0, "$NetBSD: sockin.c,v 1.57 2014/08/08 03:05:45 rtr Exp $"); #include #include @@ -79,6 +79,7 @@ static int sockin_ioctl(struct socket *, u_long, void *, struct ifnet *); static int sockin_stat(struct socket *, struct stat *); static int sockin_peeraddr(struct socket *, struct mbuf *); static int sockin_sockaddr(struct socket *, struct mbuf *); +static int sockin_rcvd(struct socket *, int, struct lwp *); static int sockin_recvoob(struct socket *, struct mbuf *, int); static int sockin_send(struct socket *, struct mbuf *, struct mbuf *, struct mbuf *, struct lwp *); @@ -101,6 +102,7 @@ static const struct pr_usrreqs sockin_usrreqs = { .pr_stat = sockin_stat, .pr_peeraddr = sockin_peeraddr, .pr_sockaddr = sockin_sockaddr, + .pr_rcvd = sockin_rcvd, .pr_recvoob = sockin_recvoob, .pr_send = sockin_send, .pr_sendoob = sockin_sendoob, @@ -591,6 +593,14 @@ sockin_sockaddr(struct socket *so, struct mbuf *nam) return error; } +static int +sockin_rcvd(struct socket *so, int flags, struct lwp *l) +{ + KASSERT(solocked(so)); + + panic("sockin_rcvd: IMPLEMENT ME, rcvd not supported"); +} + static int sockin_recvoob(struct socket *so, struct mbuf *m, int flags) { @@ -684,6 +694,7 @@ sockin_usrreq(struct socket *so, int req, struct mbuf *m, struct mbuf *nam, KASSERT(req != PRU_SENSE); KASSERT(req != PRU_PEERADDR); KASSERT(req != PRU_SOCKADDR); + KASSERT(req != PRU_RCVD); KASSERT(req != PRU_RCVOOB); KASSERT(req != PRU_SEND); KASSERT(req != PRU_SENDOOB); diff --git a/sys/sys/protosw.h b/sys/sys/protosw.h index 03fab85a646a..39df46f10eb2 100644 --- a/sys/sys/protosw.h +++ b/sys/sys/protosw.h @@ -1,4 +1,4 @@ -/* $NetBSD: protosw.h,v 1.58 2014/08/05 07:55:32 rtr Exp $ */ +/* $NetBSD: protosw.h,v 1.59 2014/08/08 03:05:45 rtr Exp $ */ /*- * Copyright (c) 1982, 1986, 1993 @@ -110,7 +110,7 @@ struct protosw { #define PR_ATOMIC 0x01 /* exchange atomic messages only */ #define PR_ADDR 0x02 /* addresses given with messages */ #define PR_CONNREQUIRED 0x04 /* connection required by protocol */ -#define PR_WANTRCVD 0x08 /* want PRU_RCVD calls */ +#define PR_WANTRCVD 0x08 /* want pr_rcvd() calls */ #define PR_RIGHTS 0x10 /* passes capabilities */ #define PR_LISTEN 0x20 /* supports listen(2) and accept(2) */ #define PR_LASTHDR 0x40 /* enforce ipsec policy; last header */ @@ -249,6 +249,7 @@ struct pr_usrreqs { int (*pr_stat)(struct socket *, struct stat *); int (*pr_peeraddr)(struct socket *, struct mbuf *); int (*pr_sockaddr)(struct socket *, struct mbuf *); + int (*pr_rcvd)(struct socket *, int, struct lwp *); int (*pr_recvoob)(struct socket *, struct mbuf *, int); int (*pr_send)(struct socket *, struct mbuf *, struct mbuf *, struct mbuf *, struct lwp *); @@ -407,6 +408,16 @@ name##_sockaddr_wrapper(struct socket *a, struct mbuf *b) \ return rv; \ } \ static int \ +name##_rcvd_wrapper(struct socket *a, int b, \ + struct lwp *c) \ +{ \ + int rv; \ + KERNEL_LOCK(1, NULL); \ + rv = name##_rcvd(a, b, c); \ + KERNEL_UNLOCK_ONE(NULL); \ + return rv; \ +} \ +static int \ name##_recvoob_wrapper(struct socket *a, \ struct mbuf *b, int c) \ { \