RTEMS CPU Kit with SuperCore  4.11.3
socketvar.h
Go to the documentation of this file.
1 /*-
2  * Copyright (c) 1982, 1986, 1990, 1993
3  * The Regents of the University of California. All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  * 1. Redistributions of source code must retain the above copyright
9  * notice, this list of conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright
11  * notice, this list of conditions and the following disclaimer in the
12  * documentation and/or other materials provided with the distribution.
13  * 4. Neither the name of the University nor the names of its contributors
14  * may be used to endorse or promote products derived from this software
15  * without specific prior written permission.
16  *
17  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
18  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20  * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
21  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
23  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27  * SUCH DAMAGE.
28  *
29  * @(#)socketvar.h 8.3 (Berkeley) 2/19/95
30  * $FreeBSD: src/sys/sys/socketvar.h,v 1.135 2004/10/18 22:19:43 rwatson Exp $
31  */
32 
33 #ifndef _SYS_SOCKETVAR_H_
34 #define _SYS_SOCKETVAR_H_
35 
36 #include <sys/queue.h> /* for TAILQ macros */
37 #include <sys/select.h> /* for struct selinfo */
38 
39 
40 /*
41  * Kernel structure per socket.
42  * Contains send and receive buffer queues,
43  * handle on protocol and pointer to protocol
44  * private data and error information.
45  */
46 typedef u_quad_t so_gen_t;
47 
48 struct socket {
49  short so_type; /* generic type, see socket.h */
50  short so_options; /* from socket call, see socket.h */
51  short so_linger; /* time to linger while closing */
52  short so_state; /* internal state flags SS_*, below */
53  void *so_pcb; /* protocol control block */
54  struct protosw *so_proto; /* protocol handle */
55 /*
56  * Variables for connection queuing.
57  * Socket where accepts occur is so_head in all subsidiary sockets.
58  * If so_head is 0, socket is not related to an accept.
59  * For head socket so_q0 queues partially completed connections,
60  * while so_q is a queue of connections ready to be accepted.
61  * If a connection is aborted and it has so_head set, then
62  * it has to be pulled out of either so_q0 or so_q.
63  * We allow connections to queue up based on current queue lengths
64  * and limit on number of queued connections for this socket.
65  */
66  struct socket *so_head; /* back pointer to accept socket */
67  TAILQ_HEAD(, socket) so_incomp; /* queue of partial unaccepted connections */
68  TAILQ_HEAD(, socket) so_comp; /* queue of complete unaccepted connections */
69  TAILQ_ENTRY(socket) so_list; /* list of unaccepted connections */
70  short so_qlen; /* number of unaccepted connections */
71  short so_incqlen; /* number of unaccepted incomplete
72  connections */
73  short so_qlimit; /* max number queued connections */
74  short so_timeo; /* connection timeout */
75  u_short so_error; /* error affecting connection */
76  pid_t so_pgid; /* pgid for signals */
77  u_long so_oobmark; /* chars to oob mark */
78 /*
79  * Variables for socket buffering.
80  */
81  struct sockbuf {
82  u_int sb_cc; /* actual chars in buffer */
83  u_int sb_hiwat; /* max actual char count */
84  u_int sb_mbcnt; /* chars of mbufs used */
85  u_int sb_mbmax; /* max chars of mbufs to use */
86  int sb_lowat; /* low water mark */
87  struct mbuf *sb_mb; /* the mbuf chain */
88  struct selinfo sb_sel; /* process selecting read/write */
89  short sb_flags; /* flags, see below */
90  int sb_timeo; /* timeout for read/write */
91  void (*sb_wakeup)(struct socket *, void *);
92  void *sb_wakeuparg; /* arg for above */
93  } so_rcv, so_snd;
94 #define SB_MAX (256L*1024L) /* default for max chars in sockbuf */
95 #define SB_LOCK 0x01 /* lock on data queue */
96 #define SB_WANT 0x02 /* someone is waiting to lock */
97 #define SB_WAIT 0x04 /* someone is waiting for data/space */
98 #define SB_SEL 0x08 /* someone is selecting */
99 #define SB_ASYNC 0x10 /* ASYNC I/O, need signals */
100 #define SB_NOTIFY (SB_WAIT|SB_SEL|SB_ASYNC)
101 #define SB_NOINTR 0x40 /* operations not interruptible */
102 
103  caddr_t so_tpcb; /* Wisc. protocol control block XXX */
104  void (*so_upcall)(struct socket *, void *arg, int);
105  void *so_upcallarg; /* Arg for above */
106 };
107 
108 /*
109  * Socket state bits.
110  */
111 #define SS_NOFDREF 0x0001 /* no file table ref any more */
112 #define SS_ISCONNECTED 0x0002 /* socket connected to a peer */
113 #define SS_ISCONNECTING 0x0004 /* in process of connecting to peer */
114 #define SS_ISDISCONNECTING 0x0008 /* in process of disconnecting */
115 #define SS_CANTSENDMORE 0x0010 /* can't send more data to peer */
116 #define SS_CANTRCVMORE 0x0020 /* can't receive more data from peer */
117 #define SS_RCVATMARK 0x0040 /* at mark on input */
118 
119 #define SS_PRIV 0x0080 /* privileged for broadcast, raw... */
120 #define SS_NBIO 0x0100 /* non-blocking ops */
121 #define SS_ASYNC 0x0200 /* async i/o notify */
122 #define SS_ISCONFIRMING 0x0400 /* deciding to accept connection req */
123 
124 #define SS_INCOMP 0x0800 /* unaccepted, incomplete connection */
125 #define SS_COMP 0x1000 /* unaccepted, complete connection */
126 
127 
128 /*
129  * Macros for sockets and socket buffering.
130  */
131 
132 /*
133  * How much space is there in a socket buffer (so->so_snd or so->so_rcv)?
134  * This is problematical if the fields are unsigned, as the space might
135  * still be negative (cc > hiwat or mbcnt > mbmax). Should detect
136  * overflow and return 0. Should use "lmin" but it doesn't exist now.
137  */
138 #define sbspace(sb) \
139  ((long) imin((int)((sb)->sb_hiwat - (sb)->sb_cc), \
140  (int)((sb)->sb_mbmax - (sb)->sb_mbcnt)))
141 
142 /* do we have to send all at once on a socket? */
143 #define sosendallatonce(so) \
144  ((so)->so_proto->pr_flags & PR_ATOMIC)
145 
146 /* can we read something from so? */
147 #define soreadable(so) \
148  ((so)->so_rcv.sb_cc >= (so)->so_rcv.sb_lowat || \
149  ((so)->so_state & SS_CANTRCVMORE) || \
150  (so)->so_comp.tqh_first || (so)->so_error)
151 
152 /* can we write something to so? */
153 #define sowriteable(so) \
154  ((sbspace(&(so)->so_snd) >= (so)->so_snd.sb_lowat && \
155  (((so)->so_state&SS_ISCONNECTED) || \
156  ((so)->so_proto->pr_flags&PR_CONNREQUIRED)==0)) || \
157  ((so)->so_state & SS_CANTSENDMORE) || \
158  (so)->so_error)
159 
160 /* adjust counters in sb reflecting allocation of m */
161 #define sballoc(sb, m) { \
162  (sb)->sb_cc += (m)->m_len; \
163  (sb)->sb_mbcnt += MSIZE; \
164  if ((m)->m_flags & M_EXT) \
165  (sb)->sb_mbcnt += (m)->m_ext.ext_size; \
166 }
167 
168 /* adjust counters in sb reflecting freeing of m */
169 #define sbfree(sb, m) { \
170  (sb)->sb_cc -= (m)->m_len; \
171  (sb)->sb_mbcnt -= MSIZE; \
172  if ((m)->m_flags & M_EXT) \
173  (sb)->sb_mbcnt -= (m)->m_ext.ext_size; \
174 }
175 
176 /*
177  * Set lock on sockbuf sb; sleep if lock is already held.
178  * Unless SB_NOINTR is set on sockbuf, sleep is interruptible.
179  * Returns error without lock if sleep is interrupted.
180  */
181 #define sblock(sb, wf) ((sb)->sb_flags & SB_LOCK ? \
182  (((wf) == M_WAITOK) ? sb_lock(sb) : EWOULDBLOCK) : \
183  ((sb)->sb_flags |= SB_LOCK), 0)
184 
185 /* release lock on sockbuf sb */
186 #define sbunlock(sb) { \
187  (sb)->sb_flags &= ~SB_LOCK; \
188  if ((sb)->sb_flags & SB_WANT) { \
189  (sb)->sb_flags &= ~SB_WANT; \
190  wakeup((caddr_t)&(sb)->sb_flags); \
191  } \
192 }
193 
194 #define sorwakeup(so) { sowakeup((so), &(so)->so_rcv); \
195  if ((so)->so_upcall) \
196  (*((so)->so_upcall))((so), (so)->so_upcallarg, M_DONTWAIT); \
197  }
198 
199 #define sowwakeup(so) sowakeup((so), &(so)->so_snd)
200 
201 #ifdef _KERNEL
202 extern u_long sb_max;
203 
204 /* to catch callers missing new second argument to sonewconn: */
205 #define sonewconn(head, connstatus) sonewconn1((head), (connstatus))
206 
207 struct filedesc;
208 struct mbuf;
209 struct sockaddr;
210 struct stat;
211 
212 /*
213  * From uipc_socket and friends
214  */
215 int sockargs(struct mbuf **mp, caddr_t buf, int buflen, int type);
216 void sbappend(struct sockbuf *sb, struct mbuf *m);
217 int sbappendaddr(struct sockbuf *sb, struct sockaddr *asa,
218  struct mbuf *m0, struct mbuf *control);
219 int sbappendcontrol(struct sockbuf *sb, struct mbuf *m0,
220  struct mbuf *control);
221 void sbappendrecord(struct sockbuf *sb, struct mbuf *m0);
222 void sbcheck(struct sockbuf *sb);
223 void sbcompress(struct sockbuf *sb, struct mbuf *m, struct mbuf *n);
224 struct mbuf *
225  sbcreatecontrol(caddr_t p, int size, int type, int level);
226 void sbdrop(struct sockbuf *sb, int len);
227 void sbdroprecord(struct sockbuf *sb);
228 void sbflush(struct sockbuf *sb);
229 void sbinsertoob(struct sockbuf *sb, struct mbuf *m0);
230 void sbrelease(struct sockbuf *sb);
231 int sbreserve(struct sockbuf *sb, u_long cc);
232 int sbwait(struct sockbuf *sb);
233 int sb_lock(struct sockbuf *sb);
234 int soabort(struct socket *so);
235 int soaccept(struct socket *so, struct mbuf *nam);
236 int sobind(struct socket *so, struct mbuf *nam);
237 void socantrcvmore(struct socket *so);
238 void socantsendmore(struct socket *so);
239 int soclose(struct socket *so);
240 int soconnect(struct socket *so, struct mbuf *nam);
241 int soconnect2(struct socket *so1, struct socket *so2);
242 int socreate(int dom, struct socket **aso, int type, int proto,
243  struct proc *p);
244 int sodisconnect(struct socket *so);
245 void sofree(struct socket *so);
246 int sogetopt(struct socket *so, int level, int optname,
247  struct mbuf **mp);
248 void sohasoutofband(struct socket *so);
249 void soisconnected(struct socket *so);
250 void soisconnecting(struct socket *so);
251 void soisdisconnected(struct socket *so);
252 void soisdisconnecting(struct socket *so);
253 int solisten(struct socket *so, int backlog);
254 struct socket *
255  sodropablereq(struct socket *head);
256 struct socket *
257  sonewconn1(struct socket *head, int connstatus);
258 int soreceive(struct socket *so, struct mbuf **paddr, struct uio *uio,
259  struct mbuf **mp0, struct mbuf **controlp, int *flagsp);
260 int soreserve(struct socket *so, u_long sndcc, u_long rcvcc);
261 void sorflush(struct socket *so);
262 int sosend(struct socket *so, struct mbuf *addr, struct uio *uio,
263  struct mbuf *top, struct mbuf *control, int flags);
264 int sosetopt(struct socket *so, int level, int optname,
265  struct mbuf *m0);
266 int soshutdown(struct socket *so, int how);
267 void sowakeup(struct socket *so, struct sockbuf *sb);
268 #endif /* _KERNEL */
269 
270 #endif /* !_SYS_SOCKETVAR_H_ */
Definition: select.h:50
Definition: socketvar.h:49
Definition: proc.h:5
Definition: socket.h:180
Definition: socketvar.h:82
Definition: mbuf.h:103
Definition: protosw.h:66