1 /////////////////////////////////////////////////////////////////////////
2 // $Id: socket.h 13932 2020-09-02 08:35:44Z vruppert $
3 /////////////////////////////////////////////////////////////////////////
4 /*
5  * Copyright (c) 1995 Danny Gasparovski.
6  *
7  * Please read the file COPYRIGHT for the
8  * terms and conditions of the copyright.
9  */
10 
11 #ifndef _SLIRP_SOCKET_H_
12 #define _SLIRP_SOCKET_H_
13 
14 #define SO_EXPIRE 240000
15 #define SO_EXPIREFAST 10000
16 
17 /*
18  * Our socket structure
19  */
20 
21 struct socket {
22   struct socket *so_next,*so_prev;      /* For a linked list of sockets */
23 
24   int s;                           /* The actual socket */
25 
26   Slirp *slirp;			   /* managing slirp instance */
27 
28 			/* XXX union these with not-yet-used sbuf params */
29   struct mbuf *so_m;	           /* Pointer to the original SYN packet,
30 				    * for non-blocking connect()'s, and
31 				    * PING reply's */
32   struct tcpiphdr *so_ti;	   /* Pointer to the original ti within
33 				    * so_mconn, for non-blocking connections */
34   int so_urgc;
35   struct in_addr so_faddr;	   /* foreign host table entry */
36   struct in_addr so_laddr;	   /* local host table entry */
37   uint16_t so_fport;		   /* foreign port */
38   uint16_t so_lport;		   /* local port */
39 
40   uint8_t	so_iptos;	/* Type of service */
41   uint8_t	so_emu;		/* Is the socket emulated? */
42 
43   u_char	so_type;		/* Type of socket, UDP or TCP */
44   int	so_state;		/* internal state flags SS_*, below */
45 
46   struct 	tcpcb *so_tcpcb;	/* pointer to TCP protocol control block */
47   u_int	so_expire;		/* When the socket will expire */
48 
49   int	so_queued;		/* Number of packets queued from this socket */
50   int	so_nqueued;		/* Number of packets queued in a row
51 				 * Used to determine when to "downgrade" a session
52 					 * from fastq to batchq */
53 
54   struct sbuf so_rcv;		/* Receive buffer */
55   struct sbuf so_snd;		/* Send buffer */
56   void * extra;			/* Extra pointer */
57 };
58 
59 
60 /*
61  * Socket state bits. (peer means the host on the Internet,
62  * local host means the host on the other end of the modem)
63  */
64 #define SS_NOFDREF		0x001	/* No fd reference */
65 
66 #define SS_ISFCONNECTING	0x002	/* Socket is connecting to peer (non-blocking connect()'s) */
67 #define SS_ISFCONNECTED		0x004	/* Socket is connected to peer */
68 #define SS_FCANTRCVMORE		0x008	/* Socket can't receive more from peer (for half-closes) */
69 #define SS_FCANTSENDMORE	0x010	/* Socket can't send more to peer (for half-closes) */
70 #define SS_FWDRAIN		0x040	/* We received a FIN, drain data and set SS_FCANTSENDMORE */
71 
72 #define SS_CTL			0x080
73 #define SS_FACCEPTCONN		0x100	/* Socket is accepting connections from a host on the internet */
74 #define SS_FACCEPTONCE		0x200	/* If set, the SS_FACCEPTCONN socket will die after one accept */
75 
76 #define SS_PERSISTENT_MASK	0xf000	/* Unremovable state bits */
77 #define SS_HOSTFWD		0x1000	/* Socket describes host->guest forwarding */
78 #define SS_INCOMING		0x2000	/* Connection was initiated by a host on the internet */
79 
80 struct socket * solookup(struct socket *, struct in_addr, u_int, struct in_addr, u_int);
81 struct socket * socreate(Slirp *);
82 void sofree(struct socket *);
83 int soread(struct socket *);
84 void sorecvoob(struct socket *);
85 int sosendoob(struct socket *);
86 int sowrite(struct socket *);
87 void sorecvfrom(struct socket *);
88 int sosendto(struct socket *, struct mbuf *);
89 struct socket * tcp_listen(Slirp *, uint32_t, u_int, uint32_t, u_int,
90                                int);
91 void soisfconnecting(struct socket *);
92 void soisfconnected(struct socket *);
93 void sofwdrain(struct socket *);
94 struct iovec; /* For win32 */
95 size_t sopreprbuf(struct socket *so, struct iovec *iov, int *np);
96 int soreadbuf(struct socket *so, const char *buf, int size);
97 
98 #endif /* _SOCKET_H_ */
99