Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files. =================================================================== RCS file: /ftp/cvs/cvsroot/src/sys/kern/uipc_socket.c,v rcsdiff: /ftp/cvs/cvsroot/src/sys/kern/uipc_socket.c,v: warning: Unknown phrases like `commitid ...;' are present. retrieving revision 1.235.2.6 retrieving revision 1.240 diff -u -p -r1.235.2.6 -r1.240 --- src/sys/kern/uipc_socket.c 2016/10/05 20:56:03 1.235.2.6 +++ src/sys/kern/uipc_socket.c 2015/05/02 17:18:03 1.240 @@ -1,4 +1,4 @@ -/* $NetBSD: uipc_socket.c,v 1.235.2.6 2016/10/05 20:56:03 skrll Exp $ */ +/* $NetBSD: uipc_socket.c,v 1.240 2015/05/02 17:18:03 rtr Exp $ */ /*- * Copyright (c) 2002, 2007, 2008, 2009 The NetBSD Foundation, Inc. @@ -71,17 +71,14 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: uipc_socket.c,v 1.235.2.6 2016/10/05 20:56:03 skrll Exp $"); +__KERNEL_RCSID(0, "$NetBSD: uipc_socket.c,v 1.240 2015/05/02 17:18:03 rtr Exp $"); -#ifdef _KERNEL_OPT #include "opt_compat_netbsd.h" #include "opt_sock_counters.h" #include "opt_sosend_loan.h" #include "opt_mbuftrace.h" #include "opt_somaxkva.h" #include "opt_multiprocessor.h" /* XXX */ -#include "opt_sctp.h" -#endif #include #include @@ -645,29 +642,23 @@ int solisten(struct socket *so, int backlog, struct lwp *l) { int error; - short oldopt, oldqlimit; solock(so); - if ((so->so_state & (SS_ISCONNECTED | SS_ISCONNECTING | + if ((so->so_state & (SS_ISCONNECTED | SS_ISCONNECTING | SS_ISDISCONNECTING)) != 0) { sounlock(so); return EINVAL; } - oldopt = so->so_options; - oldqlimit = so->so_qlimit; - if (TAILQ_EMPTY(&so->so_q)) - so->so_options |= SO_ACCEPTCONN; - if (backlog < 0) - backlog = 0; - so->so_qlimit = min(backlog, somaxconn); - error = (*so->so_proto->pr_usrreqs->pr_listen)(so, l); if (error != 0) { - so->so_options = oldopt; - so->so_qlimit = oldqlimit; sounlock(so); return error; } + if (TAILQ_EMPTY(&so->so_q)) + so->so_options |= SO_ACCEPTCONN; + if (backlog < 0) + backlog = 0; + so->so_qlimit = min(backlog, somaxconn); sounlock(so); return 0; } @@ -786,7 +777,7 @@ soabort(struct socket *so) { u_int refs; int error; - + KASSERT(solocked(so)); KASSERT(so->so_head == NULL); @@ -836,14 +827,10 @@ soconnect(struct socket *so, struct sock */ if (so->so_state & (SS_ISCONNECTED|SS_ISCONNECTING) && ((so->so_proto->pr_flags & PR_CONNREQUIRED) || - (error = sodisconnect(so)))) { + (error = sodisconnect(so)))) error = EISCONN; - } else { - if (nam->sa_family != so->so_proto->pr_domain->dom_family) { - return EAFNOSUPPORT; - } + else error = (*so->so_proto->pr_usrreqs->pr_connect)(so, nam, l); - } return error; } @@ -892,8 +879,8 @@ sodisconnect(struct socket *so) * Data and control buffers are freed on return. */ int -sosend(struct socket *so, struct sockaddr *addr, struct uio *uio, - struct mbuf *top, struct mbuf *control, int flags, struct lwp *l) +sosend(struct socket *so, struct mbuf *addr, struct uio *uio, struct mbuf *top, + struct mbuf *control, int flags, struct lwp *l) { struct mbuf **mp, *m; long space, len, resid, clen, mlen; @@ -950,7 +937,7 @@ sosend(struct socket *so, struct sockadd error = ENOTCONN; goto release; } - } else if (addr == NULL) { + } else if (addr == 0) { error = EDESTADDRREQ; goto release; } @@ -998,7 +985,7 @@ sosend(struct socket *so, struct sockadd m = m_gethdr(M_WAIT, MT_DATA); mlen = MHLEN; m->m_pkthdr.len = 0; - m_reset_rcvif(m); + m->m_pkthdr.rcvif = NULL; } else { m = m_get(M_WAIT, MT_DATA); mlen = MLEN; @@ -1068,8 +1055,12 @@ sosend(struct socket *so, struct sockadd error = (*so->so_proto->pr_usrreqs->pr_sendoob)(so, top, control); } else { + struct sockaddr *sin = NULL; + if (addr) { + sin = mtod(addr, struct sockaddr *); + } error = (*so->so_proto->pr_usrreqs->pr_send)(so, - top, addr, control, l); + top, sin, control, l); } if (dontroute) so->so_options &= ~SO_DONTROUTE; @@ -1324,35 +1315,12 @@ soreceive(struct socket *so, struct mbuf m->m_next = NULL; m = so->so_rcv.sb_mb; } else { - m = so->so_rcv.sb_mb = m_free(m); + MFREE(m, so->so_rcv.sb_mb); + m = so->so_rcv.sb_mb; } sbsync(&so->so_rcv, nextrecord); } } - if (pr->pr_flags & PR_ADDR_OPT) { - /* - * For SCTP we may be getting a - * whole message OR a partial delivery. - */ - if (m->m_type == MT_SONAME) { - orig_resid = 0; - if (flags & MSG_PEEK) { - if (paddr) - *paddr = m_copy(m, 0, m->m_len); - m = m->m_next; - } else { - sbfree(&so->so_rcv, m); - if (paddr) { - *paddr = m; - so->so_rcv.sb_mb = m->m_next; - m->m_next = 0; - m = so->so_rcv.sb_mb; - } else { - m = so->so_rcv.sb_mb = m_free(m); - } - } - } - } /* * Process one or more MT_CONTROL mbufs present before any data mbufs @@ -1487,10 +1455,6 @@ soreceive(struct socket *so, struct mbuf if (len == m->m_len - moff) { if (m->m_flags & M_EOR) flags |= MSG_EOR; -#ifdef SCTP - if (m->m_flags & M_NOTIFICATION) - flags |= MSG_NOTIFICATION; -#endif /* SCTP */ if (flags & MSG_PEEK) { m = m->m_next; moff = 0; @@ -1503,7 +1467,8 @@ soreceive(struct socket *so, struct mbuf so->so_rcv.sb_mb = m = m->m_next; *mp = NULL; } else { - m = so->so_rcv.sb_mb = m_free(m); + MFREE(m, so->so_rcv.sb_mb); + m = so->so_rcv.sb_mb; } /* * If m != NULL, we also know that @@ -1915,7 +1880,7 @@ so_setsockopt(struct lwp *l, struct sock return error; } - + /* * internal get SOL_SOCKET options */ @@ -2244,7 +2209,7 @@ filt_soread(struct knote *kn, long hint) rv = 1; else if (kn->kn_sfflags & NOTE_LOWAT) rv = (kn->kn_data >= kn->kn_sdata); - else + else rv = (kn->kn_data >= so->so_rcv.sb_lowat); if (hint != NOTE_SUBMIT) sounlock(so);