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