xref: /minix3/minix/net/lwip/ipsock.h (revision ef8d499e2d2af900e9b2ab297171d7b088652482)
1*ef8d499eSDavid van Moolenbroek #ifndef MINIX_NET_LWIP_IPSOCK_H
2*ef8d499eSDavid van Moolenbroek #define MINIX_NET_LWIP_IPSOCK_H
3*ef8d499eSDavid van Moolenbroek 
4*ef8d499eSDavid van Moolenbroek /* IP-level socket, shared by TCP, UDP, and RAW. */
5*ef8d499eSDavid van Moolenbroek struct ipsock {
6*ef8d499eSDavid van Moolenbroek 	struct sock ip_sock;		/* socket object, MUST be first */
7*ef8d499eSDavid van Moolenbroek 	unsigned int ip_flags;		/* all socket flags */
8*ef8d499eSDavid van Moolenbroek 	size_t ip_sndbuf;		/* send buffer size */
9*ef8d499eSDavid van Moolenbroek 	size_t ip_rcvbuf;		/* receive buffer size */
10*ef8d499eSDavid van Moolenbroek };
11*ef8d499eSDavid van Moolenbroek 
12*ef8d499eSDavid van Moolenbroek /*
13*ef8d499eSDavid van Moolenbroek  * Socket flags.  In order to reduce memory consumption, all these flags are
14*ef8d499eSDavid van Moolenbroek  * stored in the same field (ipsock.ip_flags) and thus must not overlap between
15*ef8d499eSDavid van Moolenbroek  * the same users of the field, and that is why they are all here.  For
16*ef8d499eSDavid van Moolenbroek  * example, UDPF/PKTF/IPF should all be unique, and TCPF/IPF should be unique,
17*ef8d499eSDavid van Moolenbroek  * but UDPF/PKTF may overlap with TCPF and UDPF may overlap with RAWF.  In
18*ef8d499eSDavid van Moolenbroek  * practice, we have no UDPF or RAWF flags and plenty of space to make all
19*ef8d499eSDavid van Moolenbroek  * flags unique anyway.
20*ef8d499eSDavid van Moolenbroek  */
21*ef8d499eSDavid van Moolenbroek #define IPF_IPV6		0x0000001	/* socket is IPv6 */
22*ef8d499eSDavid van Moolenbroek #define IPF_V6ONLY		0x0000002	/* socket is IPv6 only */
23*ef8d499eSDavid van Moolenbroek 
24*ef8d499eSDavid van Moolenbroek #define PKTF_RECVINFO		0x0000010	/* receive ancillary PKTINFO */
25*ef8d499eSDavid van Moolenbroek #define PKTF_RECVTTL		0x0000020	/* receive ancillary TTL */
26*ef8d499eSDavid van Moolenbroek #define PKTF_RECVTOS		0x0000040	/* receive ancillary TOS */
27*ef8d499eSDavid van Moolenbroek #define PKTF_MCAWARE		0x0000080	/* owner is multicast aware */
28*ef8d499eSDavid van Moolenbroek 
29*ef8d499eSDavid van Moolenbroek #define TCPF_CONNECTING		0x0001000	/* attempting to connect */
30*ef8d499eSDavid van Moolenbroek #define TCPF_SENT_FIN		0x0002000	/* send FIN when possible */
31*ef8d499eSDavid van Moolenbroek #define TCPF_RCVD_FIN		0x0004000	/* received FIN from peer */
32*ef8d499eSDavid van Moolenbroek #define TCPF_FULL		0x0008000	/* PCB send buffer is full */
33*ef8d499eSDavid van Moolenbroek #define TCPF_OOM		0x0010000	/* memory allocation failed */
34*ef8d499eSDavid van Moolenbroek 
35*ef8d499eSDavid van Moolenbroek #define ipsock_get_sock(ip)		(&(ip)->ip_sock)
36*ef8d499eSDavid van Moolenbroek #define ipsock_is_ipv6(ip)		((ip)->ip_flags & IPF_IPV6)
37*ef8d499eSDavid van Moolenbroek #define ipsock_is_v6only(ip)		((ip)->ip_flags & IPF_V6ONLY)
38*ef8d499eSDavid van Moolenbroek #define ipsock_get_flags(ip)		((ip)->ip_flags)
39*ef8d499eSDavid van Moolenbroek #define ipsock_get_flag(ip,fl)		((ip)->ip_flags & (fl))
40*ef8d499eSDavid van Moolenbroek #define ipsock_set_flag(ip,fl)		((ip)->ip_flags |= (fl))
41*ef8d499eSDavid van Moolenbroek #define ipsock_clear_flag(ip,fl)	((ip)->ip_flags &= ~(fl))
42*ef8d499eSDavid van Moolenbroek #define ipsock_get_sndbuf(ip)		((ip)->ip_sndbuf)
43*ef8d499eSDavid van Moolenbroek #define ipsock_get_rcvbuf(ip)		((ip)->ip_rcvbuf)
44*ef8d499eSDavid van Moolenbroek 
45*ef8d499eSDavid van Moolenbroek /*
46*ef8d499eSDavid van Moolenbroek  * IP-level option pointers.  This is necessary because even though lwIP's
47*ef8d499eSDavid van Moolenbroek  * TCP, UDP, and RAW PCBs share the same initial fields, the C standard does
48*ef8d499eSDavid van Moolenbroek  * not permit generic access to such initial fields (due to both possible
49*ef8d499eSDavid van Moolenbroek  * padding differences and strict-aliasing rules).  The fields in this
50*ef8d499eSDavid van Moolenbroek  * structure are therefore pointers to the initial fields of each of the PCB
51*ef8d499eSDavid van Moolenbroek  * structures.  If lwIP ever groups its IP PCB fields into a single structure
52*ef8d499eSDavid van Moolenbroek  * and uses that structure as first field of each of the other PCBs, then we
53*ef8d499eSDavid van Moolenbroek  * will be able to replace this structure with a pointer to the IP PCB instead.
54*ef8d499eSDavid van Moolenbroek  * For convenience we also carry the send and receive buffer limits here.
55*ef8d499eSDavid van Moolenbroek  */
56*ef8d499eSDavid van Moolenbroek struct ipopts {
57*ef8d499eSDavid van Moolenbroek 	ip_addr_t *local_ip;
58*ef8d499eSDavid van Moolenbroek 	ip_addr_t *remote_ip;
59*ef8d499eSDavid van Moolenbroek 	uint8_t *tos;
60*ef8d499eSDavid van Moolenbroek 	uint8_t *ttl;
61*ef8d499eSDavid van Moolenbroek 	size_t sndmin;
62*ef8d499eSDavid van Moolenbroek 	size_t sndmax;
63*ef8d499eSDavid van Moolenbroek 	size_t rcvmin;
64*ef8d499eSDavid van Moolenbroek 	size_t rcvmax;
65*ef8d499eSDavid van Moolenbroek };
66*ef8d499eSDavid van Moolenbroek 
67*ef8d499eSDavid van Moolenbroek struct ifdev;
68*ef8d499eSDavid van Moolenbroek 
69*ef8d499eSDavid van Moolenbroek void ipsock_init(void);
70*ef8d499eSDavid van Moolenbroek int ipsock_socket(struct ipsock * ip, int domain, size_t sndbuf, size_t rcvbuf,
71*ef8d499eSDavid van Moolenbroek 	struct sock ** sockp);
72*ef8d499eSDavid van Moolenbroek void ipsock_clone(struct ipsock * ip, struct ipsock * newip, sockid_t newid);
73*ef8d499eSDavid van Moolenbroek void ipsock_get_any_addr(struct ipsock * ip, ip_addr_t * ipaddr);
74*ef8d499eSDavid van Moolenbroek int ipsock_check_src_addr(struct ipsock * ip, ip_addr_t * ipaddr,
75*ef8d499eSDavid van Moolenbroek 	int allow_mcast, struct ifdev ** ifdevp);
76*ef8d499eSDavid van Moolenbroek int ipsock_get_src_addr(struct ipsock * ip, const struct sockaddr * addr,
77*ef8d499eSDavid van Moolenbroek 	socklen_t addr_len, endpoint_t user_endpt, ip_addr_t * local_ip,
78*ef8d499eSDavid van Moolenbroek 	uint16_t local_port, int allow_mcast, ip_addr_t * ipaddr,
79*ef8d499eSDavid van Moolenbroek 	uint16_t * portp);
80*ef8d499eSDavid van Moolenbroek int ipsock_get_dst_addr(struct ipsock * ip, const struct sockaddr * addr,
81*ef8d499eSDavid van Moolenbroek 	socklen_t addr_len, const ip_addr_t * local_addr, ip_addr_t * dst_addr,
82*ef8d499eSDavid van Moolenbroek 	uint16_t * dst_port);
83*ef8d499eSDavid van Moolenbroek void ipsock_put_addr(struct ipsock * ip, struct sockaddr * addr,
84*ef8d499eSDavid van Moolenbroek 	socklen_t * addr_len, ip_addr_t * ipaddr, uint16_t port);
85*ef8d499eSDavid van Moolenbroek int ipsock_setsockopt(struct ipsock * ip, int level, int name,
86*ef8d499eSDavid van Moolenbroek 	const struct sockdriver_data * data, socklen_t len,
87*ef8d499eSDavid van Moolenbroek 	struct ipopts * ipopts);
88*ef8d499eSDavid van Moolenbroek int ipsock_getsockopt(struct ipsock * ip, int level, int name,
89*ef8d499eSDavid van Moolenbroek 	const struct sockdriver_data * data, socklen_t * len,
90*ef8d499eSDavid van Moolenbroek 	struct ipopts * ipopts);
91*ef8d499eSDavid van Moolenbroek void ipsock_get_info(struct kinfo_pcb * ki, const ip_addr_t * local_ip,
92*ef8d499eSDavid van Moolenbroek 	uint16_t local_port, const ip_addr_t * remote_ip,
93*ef8d499eSDavid van Moolenbroek 	uint16_t remote_port);
94*ef8d499eSDavid van Moolenbroek 
95*ef8d499eSDavid van Moolenbroek #endif /* !MINIX_NET_LWIP_IPSOCK_H */
96