uipc_socket.c (167799) | uipc_socket.c (167895) |
---|---|
1/*- 2 * Copyright (c) 1982, 1986, 1988, 1990, 1993 3 * The Regents of the University of California. 4 * Copyright (c) 2004 The FreeBSD Foundation 5 * Copyright (c) 2004-2006 Robert N. M. Watson 6 * All rights reserved. 7 * 8 * Redistribution and use in source and binary forms, with or without --- 81 unchanged lines hidden (view full) --- 90 * calls to explicitly manage socket references, soref(), and sorele(). 91 * Currently, these are generally required only when transitioning a socket 92 * from a listen queue to a file descriptor, in order to prevent garbage 93 * collection of the socket at an untimely moment. For a number of reasons, 94 * these interfaces are not preferred, and should be avoided. 95 */ 96 97#include <sys/cdefs.h> | 1/*- 2 * Copyright (c) 1982, 1986, 1988, 1990, 1993 3 * The Regents of the University of California. 4 * Copyright (c) 2004 The FreeBSD Foundation 5 * Copyright (c) 2004-2006 Robert N. M. Watson 6 * All rights reserved. 7 * 8 * Redistribution and use in source and binary forms, with or without --- 81 unchanged lines hidden (view full) --- 90 * calls to explicitly manage socket references, soref(), and sorele(). 91 * Currently, these are generally required only when transitioning a socket 92 * from a listen queue to a file descriptor, in order to prevent garbage 93 * collection of the socket at an untimely moment. For a number of reasons, 94 * these interfaces are not preferred, and should be avoided. 95 */ 96 97#include <sys/cdefs.h> |
98__FBSDID("$FreeBSD: head/sys/kern/uipc_socket.c 167799 2007-03-22 13:21:24Z glebius $"); | 98__FBSDID("$FreeBSD: head/sys/kern/uipc_socket.c 167895 2007-03-26 08:59:03Z rwatson $"); |
99 100#include "opt_inet.h" 101#include "opt_mac.h" 102#include "opt_zero.h" 103#include "opt_compat.h" 104 105#include <sys/param.h> 106#include <sys/systm.h> --- 11 unchanged lines hidden (view full) --- 118#include <sys/eventhandler.h> 119#include <sys/poll.h> 120#include <sys/proc.h> 121#include <sys/protosw.h> 122#include <sys/socket.h> 123#include <sys/socketvar.h> 124#include <sys/resourcevar.h> 125#include <sys/signalvar.h> | 99 100#include "opt_inet.h" 101#include "opt_mac.h" 102#include "opt_zero.h" 103#include "opt_compat.h" 104 105#include <sys/param.h> 106#include <sys/systm.h> --- 11 unchanged lines hidden (view full) --- 118#include <sys/eventhandler.h> 119#include <sys/poll.h> 120#include <sys/proc.h> 121#include <sys/protosw.h> 122#include <sys/socket.h> 123#include <sys/socketvar.h> 124#include <sys/resourcevar.h> 125#include <sys/signalvar.h> |
126#include <sys/stat.h> |
|
126#include <sys/sysctl.h> 127#include <sys/uio.h> 128#include <sys/jail.h> 129 130#include <security/mac/mac_framework.h> 131 132#include <vm/uma.h> 133 --- 2454 unchanged lines hidden (view full) --- 2588 2589 SOCKBUF_LOCK(sb); 2590 knlist_add(&sb->sb_sel.si_note, kn, 1); 2591 sb->sb_flags |= SB_KNOTE; 2592 SOCKBUF_UNLOCK(sb); 2593 return (0); 2594} 2595 | 127#include <sys/sysctl.h> 128#include <sys/uio.h> 129#include <sys/jail.h> 130 131#include <security/mac/mac_framework.h> 132 133#include <vm/uma.h> 134 --- 2454 unchanged lines hidden (view full) --- 2589 2590 SOCKBUF_LOCK(sb); 2591 knlist_add(&sb->sb_sel.si_note, kn, 1); 2592 sb->sb_flags |= SB_KNOTE; 2593 SOCKBUF_UNLOCK(sb); 2594 return (0); 2595} 2596 |
2597/* 2598 * Some routines that return EOPNOTSUPP for entry points that are not 2599 * supported by a protocol. Fill in as needed. 2600 */ 2601int 2602pru_accept_notsupp(struct socket *so, struct sockaddr **nam) 2603{ 2604 return EOPNOTSUPP; 2605} 2606 2607int 2608pru_attach_notsupp(struct socket *so, int proto, struct thread *td) 2609{ 2610 return EOPNOTSUPP; 2611} 2612 2613int 2614pru_bind_notsupp(struct socket *so, struct sockaddr *nam, struct thread *td) 2615{ 2616 return EOPNOTSUPP; 2617} 2618 2619int 2620pru_connect_notsupp(struct socket *so, struct sockaddr *nam, struct thread *td) 2621{ 2622 return EOPNOTSUPP; 2623} 2624 2625int 2626pru_connect2_notsupp(struct socket *so1, struct socket *so2) 2627{ 2628 return EOPNOTSUPP; 2629} 2630 2631int 2632pru_control_notsupp(struct socket *so, u_long cmd, caddr_t data, 2633 struct ifnet *ifp, struct thread *td) 2634{ 2635 return EOPNOTSUPP; 2636} 2637 2638int 2639pru_disconnect_notsupp(struct socket *so) 2640{ 2641 return EOPNOTSUPP; 2642} 2643 2644int 2645pru_listen_notsupp(struct socket *so, int backlog, struct thread *td) 2646{ 2647 return EOPNOTSUPP; 2648} 2649 2650int 2651pru_peeraddr_notsupp(struct socket *so, struct sockaddr **nam) 2652{ 2653 return EOPNOTSUPP; 2654} 2655 2656int 2657pru_rcvd_notsupp(struct socket *so, int flags) 2658{ 2659 return EOPNOTSUPP; 2660} 2661 2662int 2663pru_rcvoob_notsupp(struct socket *so, struct mbuf *m, int flags) 2664{ 2665 return EOPNOTSUPP; 2666} 2667 2668int 2669pru_send_notsupp(struct socket *so, int flags, struct mbuf *m, 2670 struct sockaddr *addr, struct mbuf *control, struct thread *td) 2671{ 2672 return EOPNOTSUPP; 2673} 2674 2675/* 2676 * This isn't really a ``null'' operation, but it's the default one 2677 * and doesn't do anything destructive. 2678 */ 2679int 2680pru_sense_null(struct socket *so, struct stat *sb) 2681{ 2682 sb->st_blksize = so->so_snd.sb_hiwat; 2683 return 0; 2684} 2685 2686int 2687pru_shutdown_notsupp(struct socket *so) 2688{ 2689 return EOPNOTSUPP; 2690} 2691 2692int 2693pru_sockaddr_notsupp(struct socket *so, struct sockaddr **nam) 2694{ 2695 return EOPNOTSUPP; 2696} 2697 2698int 2699pru_sosend_notsupp(struct socket *so, struct sockaddr *addr, struct uio *uio, 2700 struct mbuf *top, struct mbuf *control, int flags, struct thread *td) 2701{ 2702 return EOPNOTSUPP; 2703} 2704 2705int 2706pru_soreceive_notsupp(struct socket *so, struct sockaddr **paddr, 2707 struct uio *uio, struct mbuf **mp0, struct mbuf **controlp, 2708 int *flagsp) 2709{ 2710 return EOPNOTSUPP; 2711} 2712 2713int 2714pru_sopoll_notsupp(struct socket *so, int events, struct ucred *cred, 2715 struct thread *td) 2716{ 2717 return EOPNOTSUPP; 2718} 2719 |
|
2596static void 2597filt_sordetach(struct knote *kn) 2598{ 2599 struct socket *so = kn->kn_fp->f_data; 2600 2601 SOCKBUF_LOCK(&so->so_rcv); 2602 knlist_remove(&so->so_rcv.sb_sel.si_note, kn, 1); 2603 if (knlist_empty(&so->so_rcv.sb_sel.si_note)) --- 92 unchanged lines hidden (view full) --- 2696 return (error); 2697 2698 if (val < 1 || val > USHRT_MAX) 2699 return (EINVAL); 2700 2701 somaxconn = val; 2702 return (0); 2703} | 2720static void 2721filt_sordetach(struct knote *kn) 2722{ 2723 struct socket *so = kn->kn_fp->f_data; 2724 2725 SOCKBUF_LOCK(&so->so_rcv); 2726 knlist_remove(&so->so_rcv.sb_sel.si_note, kn, 1); 2727 if (knlist_empty(&so->so_rcv.sb_sel.si_note)) --- 92 unchanged lines hidden (view full) --- 2820 return (error); 2821 2822 if (val < 1 || val > USHRT_MAX) 2823 return (EINVAL); 2824 2825 somaxconn = val; 2826 return (0); 2827} |
2828 2829/* 2830 * Primitive routines for operating on sockets. 2831 */ 2832 2833/* 2834 * Procedures to manipulate state flags of socket 2835 * and do appropriate wakeups. Normal sequence from the 2836 * active (originating) side is that soisconnecting() is 2837 * called during processing of connect() call, 2838 * resulting in an eventual call to soisconnected() if/when the 2839 * connection is established. When the connection is torn down 2840 * soisdisconnecting() is called during processing of disconnect() call, 2841 * and soisdisconnected() is called when the connection to the peer 2842 * is totally severed. The semantics of these routines are such that 2843 * connectionless protocols can call soisconnected() and soisdisconnected() 2844 * only, bypassing the in-progress calls when setting up a ``connection'' 2845 * takes no time. 2846 * 2847 * From the passive side, a socket is created with 2848 * two queues of sockets: so_incomp for connections in progress 2849 * and so_comp for connections already made and awaiting user acceptance. 2850 * As a protocol is preparing incoming connections, it creates a socket 2851 * structure queued on so_incomp by calling sonewconn(). When the connection 2852 * is established, soisconnected() is called, and transfers the 2853 * socket structure to so_comp, making it available to accept(). 2854 * 2855 * If a socket is closed with sockets on either 2856 * so_incomp or so_comp, these sockets are dropped. 2857 * 2858 * If higher level protocols are implemented in 2859 * the kernel, the wakeups done here will sometimes 2860 * cause software-interrupt process scheduling. 2861 */ 2862 2863void 2864soisconnecting(so) 2865 register struct socket *so; 2866{ 2867 2868 SOCK_LOCK(so); 2869 so->so_state &= ~(SS_ISCONNECTED|SS_ISDISCONNECTING); 2870 so->so_state |= SS_ISCONNECTING; 2871 SOCK_UNLOCK(so); 2872} 2873 2874void 2875soisconnected(so) 2876 struct socket *so; 2877{ 2878 struct socket *head; 2879 2880 ACCEPT_LOCK(); 2881 SOCK_LOCK(so); 2882 so->so_state &= ~(SS_ISCONNECTING|SS_ISDISCONNECTING|SS_ISCONFIRMING); 2883 so->so_state |= SS_ISCONNECTED; 2884 head = so->so_head; 2885 if (head != NULL && (so->so_qstate & SQ_INCOMP)) { 2886 if ((so->so_options & SO_ACCEPTFILTER) == 0) { 2887 SOCK_UNLOCK(so); 2888 TAILQ_REMOVE(&head->so_incomp, so, so_list); 2889 head->so_incqlen--; 2890 so->so_qstate &= ~SQ_INCOMP; 2891 TAILQ_INSERT_TAIL(&head->so_comp, so, so_list); 2892 head->so_qlen++; 2893 so->so_qstate |= SQ_COMP; 2894 ACCEPT_UNLOCK(); 2895 sorwakeup(head); 2896 wakeup_one(&head->so_timeo); 2897 } else { 2898 ACCEPT_UNLOCK(); 2899 so->so_upcall = 2900 head->so_accf->so_accept_filter->accf_callback; 2901 so->so_upcallarg = head->so_accf->so_accept_filter_arg; 2902 so->so_rcv.sb_flags |= SB_UPCALL; 2903 so->so_options &= ~SO_ACCEPTFILTER; 2904 SOCK_UNLOCK(so); 2905 so->so_upcall(so, so->so_upcallarg, M_DONTWAIT); 2906 } 2907 return; 2908 } 2909 SOCK_UNLOCK(so); 2910 ACCEPT_UNLOCK(); 2911 wakeup(&so->so_timeo); 2912 sorwakeup(so); 2913 sowwakeup(so); 2914} 2915 2916void 2917soisdisconnecting(so) 2918 register struct socket *so; 2919{ 2920 2921 /* 2922 * Note: This code assumes that SOCK_LOCK(so) and 2923 * SOCKBUF_LOCK(&so->so_rcv) are the same. 2924 */ 2925 SOCKBUF_LOCK(&so->so_rcv); 2926 so->so_state &= ~SS_ISCONNECTING; 2927 so->so_state |= SS_ISDISCONNECTING; 2928 so->so_rcv.sb_state |= SBS_CANTRCVMORE; 2929 sorwakeup_locked(so); 2930 SOCKBUF_LOCK(&so->so_snd); 2931 so->so_snd.sb_state |= SBS_CANTSENDMORE; 2932 sowwakeup_locked(so); 2933 wakeup(&so->so_timeo); 2934} 2935 2936void 2937soisdisconnected(so) 2938 register struct socket *so; 2939{ 2940 2941 /* 2942 * Note: This code assumes that SOCK_LOCK(so) and 2943 * SOCKBUF_LOCK(&so->so_rcv) are the same. 2944 */ 2945 SOCKBUF_LOCK(&so->so_rcv); 2946 so->so_state &= ~(SS_ISCONNECTING|SS_ISCONNECTED|SS_ISDISCONNECTING); 2947 so->so_state |= SS_ISDISCONNECTED; 2948 so->so_rcv.sb_state |= SBS_CANTRCVMORE; 2949 sorwakeup_locked(so); 2950 SOCKBUF_LOCK(&so->so_snd); 2951 so->so_snd.sb_state |= SBS_CANTSENDMORE; 2952 sbdrop_locked(&so->so_snd, so->so_snd.sb_cc); 2953 sowwakeup_locked(so); 2954 wakeup(&so->so_timeo); 2955} 2956 2957/* 2958 * Make a copy of a sockaddr in a malloced buffer of type M_SONAME. 2959 */ 2960struct sockaddr * 2961sodupsockaddr(const struct sockaddr *sa, int mflags) 2962{ 2963 struct sockaddr *sa2; 2964 2965 sa2 = malloc(sa->sa_len, M_SONAME, mflags); 2966 if (sa2) 2967 bcopy(sa, sa2, sa->sa_len); 2968 return sa2; 2969} 2970 2971/* 2972 * Create an external-format (``xsocket'') structure using the information 2973 * in the kernel-format socket structure pointed to by so. This is done 2974 * to reduce the spew of irrelevant information over this interface, 2975 * to isolate user code from changes in the kernel structure, and 2976 * potentially to provide information-hiding if we decide that 2977 * some of this information should be hidden from users. 2978 */ 2979void 2980sotoxsocket(struct socket *so, struct xsocket *xso) 2981{ 2982 xso->xso_len = sizeof *xso; 2983 xso->xso_so = so; 2984 xso->so_type = so->so_type; 2985 xso->so_options = so->so_options; 2986 xso->so_linger = so->so_linger; 2987 xso->so_state = so->so_state; 2988 xso->so_pcb = so->so_pcb; 2989 xso->xso_protocol = so->so_proto->pr_protocol; 2990 xso->xso_family = so->so_proto->pr_domain->dom_family; 2991 xso->so_qlen = so->so_qlen; 2992 xso->so_incqlen = so->so_incqlen; 2993 xso->so_qlimit = so->so_qlimit; 2994 xso->so_timeo = so->so_timeo; 2995 xso->so_error = so->so_error; 2996 xso->so_pgid = so->so_sigio ? so->so_sigio->sio_pgid : 0; 2997 xso->so_oobmark = so->so_oobmark; 2998 sbtoxsockbuf(&so->so_snd, &xso->so_snd); 2999 sbtoxsockbuf(&so->so_rcv, &xso->so_rcv); 3000 xso->so_uid = so->so_cred->cr_uid; 3001} |
|