VirtualBox

source: vbox/trunk/src/VBox/Devices/Network/slirp/socket.h

Last change on this file was 98103, checked in by vboxsync, 16 months ago

Copyright year updates by scm.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 7.4 KB
Line 
1/* $Id: socket.h 98103 2023-01-17 14:15:46Z vboxsync $ */
2/** @file
3 * NAT - socket handling (declarations/defines).
4 */
5
6/*
7 * Copyright (C) 2006-2023 Oracle and/or its affiliates.
8 *
9 * This file is part of VirtualBox base platform packages, as
10 * available from https://www.virtualbox.org.
11 *
12 * This program is free software; you can redistribute it and/or
13 * modify it under the terms of the GNU General Public License
14 * as published by the Free Software Foundation, in version 3 of the
15 * License.
16 *
17 * This program is distributed in the hope that it will be useful, but
18 * WITHOUT ANY WARRANTY; without even the implied warranty of
19 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
20 * General Public License for more details.
21 *
22 * You should have received a copy of the GNU General Public License
23 * along with this program; if not, see <https://www.gnu.org/licenses>.
24 *
25 * SPDX-License-Identifier: GPL-3.0-only
26 */
27
28/*
29 * This code is based on:
30 *
31 * Copyright (c) 1995 Danny Gasparovski.
32 *
33 * Please read the file COPYRIGHT for the
34 * terms and conditions of the copyright.
35 */
36
37/* MINE */
38
39#ifndef _SLIRP_SOCKET_H_
40#define _SLIRP_SOCKET_H_
41
42#define SO_EXPIRE 240000
43#define SO_EXPIREFAST 10000
44
45/*
46 * Our socket structure
47 */
48
49struct socket
50{
51 struct socket *so_next;
52 struct socket *so_prev; /* For a linked list of sockets */
53
54#if !defined(RT_OS_WINDOWS)
55 int s; /* The actual socket */
56#else
57 union {
58 int s;
59 HANDLE sh;
60 };
61 uint64_t so_icmp_id; /* XXX: hack */
62 uint64_t so_icmp_seq; /* XXX: hack */
63#endif
64
65 /* XXX union these with not-yet-used sbuf params */
66 struct mbuf *so_m; /* Pointer to the original SYN packet,
67 * for non-blocking connect()'s, and
68 * PING reply's */
69 struct tcpiphdr *so_ti; /* Pointer to the original ti within
70 * so_mconn, for non-blocking connections */
71 uint8_t *so_ohdr; /* unmolested IP header of the datagram in so_m */
72 caddr_t so_optp; /* tcp options in so_m */
73 int so_optlen; /* length of options in so_m */
74 int so_urgc;
75 struct in_addr so_faddr; /* foreign host table entry */
76 struct in_addr so_laddr; /* local host table entry */
77 u_int16_t so_fport; /* foreign port */
78 u_int16_t so_lport; /* local port */
79 u_int16_t so_hlport; /* host local port */
80 struct in_addr so_hladdr; /* local host addr */
81
82 u_int8_t so_iptos; /* Type of service */
83
84 uint8_t so_sottl; /* cached socket's IP_TTL option */
85 uint8_t so_sotos; /* cached socket's IP_TOS option */
86 int8_t so_sodf; /* cached socket's DF option */
87
88 u_char so_type; /* Type of socket, UDP or TCP */
89 int so_state; /* internal state flags SS_*, below */
90
91 struct tcpcb *so_tcpcb; /* pointer to TCP protocol control block */
92 u_int so_expire; /* When the socket will expire */
93
94 int so_queued; /* Number of packets queued from this socket */
95 int so_nqueued; /* Number of packets queued in a row
96 * Used to determine when to "downgrade" a session
97 * from fastq to batchq */
98
99 struct sbuf so_rcv; /* Receive buffer */
100 struct sbuf so_snd; /* Send buffer */
101#ifndef RT_OS_WINDOWS
102 int so_poll_index;
103#endif /* !RT_OS_WINDOWS */
104 /*
105 * FD_CLOSE/POLLHUP event has been occurred on socket
106 */
107 int so_close;
108
109 void (* so_timeout)(PNATState pData, struct socket *so, void *arg);
110 void *so_timeout_arg;
111
112 /** These flags (''fUnderPolling'' and ''fShouldBeRemoved'') introduced to
113 * to let polling routine gain control over freeing socket whatever level of
114 * TCP/IP initiated socket releasing.
115 * So polling routine when start processing socket alter it's state to
116 * ''fUnderPolling'' to 1, and clean (set to 0) when it finish.
117 * When polling routine calls functions it should be ensure on return,
118 * whether ''fShouldBeRemoved'' set or not, and depending on state call
119 * ''sofree'' or continue socket processing.
120 * On ''fShouldBeRemoved'' equal to 1, polling routine should call ''sofree'',
121 * clearing ''fUnderPolling'' to do real freeng of the socket and removing from
122 * the queue.
123 * @todo: perhaps, to simplefy the things we need some helper function.
124 * @note: it's used like a bool, I use 'int' to avoid compiler warnings
125 * appearing if [-Wc++-compat] used.
126 */
127 int fUnderPolling;
128 /** This flag used by ''sofree'' function in following manner
129 *
130 * fUnderPolling = 1, then we don't remove socket from the queue, just
131 * alter value ''fShouldBeRemoved'' to 1, else we do removal.
132 */
133 int fShouldBeRemoved;
134};
135
136# define SOCKET_LOCK(so) do {} while (0)
137# define SOCKET_UNLOCK(so) do {} while (0)
138# define SOCKET_LOCK_CREATE(so) do {} while (0)
139# define SOCKET_LOCK_DESTROY(so) do {} while (0)
140
141/*
142 * Socket state bits. (peer means the host on the Internet,
143 * local host means the host on the other end of the modem)
144 */
145#define SS_NOFDREF 0x001 /* No fd reference */
146
147#define SS_ISFCONNECTING 0x002 /* Socket is connecting to peer (non-blocking connect()'s) */
148#define SS_ISFCONNECTED 0x004 /* Socket is connected to peer */
149#define SS_FCANTRCVMORE 0x008 /* Socket can't receive more from peer (for half-closes) */
150#define SS_FCANTSENDMORE 0x010 /* Socket can't send more to peer (for half-closes) */
151/* #define SS_ISFDISCONNECTED 0x020*/ /* Socket has disconnected from peer, in 2MSL state */
152#define SS_FWDRAIN 0x040 /* We received a FIN, drain data and set SS_FCANTSENDMORE */
153
154/* #define SS_CTL 0x080 */
155#define SS_FACCEPTCONN 0x100 /* Socket is accepting connections from a host on the internet */
156#define SS_FACCEPTONCE 0x200 /* If set, the SS_FACCEPTCONN socket will die after one accept */
157
158extern struct socket tcb;
159
160#if defined(DECLARE_IOVEC) && !defined(HAVE_READV)
161# if !defined(RT_OS_WINDOWS)
162struct iovec
163{
164 char *iov_base;
165 size_t iov_len;
166};
167# else
168/* make it congruent with WSABUF */
169struct iovec
170{
171 ULONG iov_len;
172 char *iov_base;
173};
174# endif
175#endif
176
177void so_init (void);
178struct socket * solookup (struct socket *, struct in_addr, u_int, struct in_addr, u_int);
179struct socket * socreate (void);
180void sofree (PNATState, struct socket *);
181int sobind(PNATState, struct socket *);
182int soread (PNATState, struct socket *);
183void sorecvoob (PNATState, struct socket *);
184int sosendoob (struct socket *);
185int sowrite (PNATState, struct socket *);
186void sorecvfrom (PNATState, struct socket *);
187int sosendto (PNATState, struct socket *, struct mbuf *);
188struct socket * solisten (PNATState, u_int32_t, u_int, u_int32_t, u_int, int);
189void sorwakeup (struct socket *);
190void sowwakeup (struct socket *);
191void soisfconnecting (register struct socket *);
192void soisfconnected (register struct socket *);
193int sofcantrcvmore (struct socket *);
194void sofcantsendmore (struct socket *);
195void soisfdisconnected (struct socket *);
196void sofwdrain (struct socket *);
197
198static inline int soIgnorableErrorCode(int iErrorCode)
199{
200 return ( iErrorCode == EINPROGRESS
201 || iErrorCode == EAGAIN
202 || iErrorCode == EWOULDBLOCK);
203}
204
205#endif /* _SOCKET_H_ */
Note: See TracBrowser for help on using the repository browser.

© 2023 Oracle
ContactPrivacy policyTerms of Use