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