xref: /minix3/minix/net/lwip/pktsock.h (revision ef8d499e2d2af900e9b2ab297171d7b088652482)
1*ef8d499eSDavid van Moolenbroek #ifndef MINIX_NET_LWIP_PKTSOCK_H
2*ef8d499eSDavid van Moolenbroek #define MINIX_NET_LWIP_PKTSOCK_H
3*ef8d499eSDavid van Moolenbroek 
4*ef8d499eSDavid van Moolenbroek #include "mcast.h"
5*ef8d499eSDavid van Moolenbroek 
6*ef8d499eSDavid van Moolenbroek /* Packet-level socket, shared by UDP and RAW. */
7*ef8d499eSDavid van Moolenbroek struct pktsock {
8*ef8d499eSDavid van Moolenbroek 	struct ipsock pkt_ipsock;	/* IP socket object, MUST be first */
9*ef8d499eSDavid van Moolenbroek 	struct pbuf *pkt_rcvhead;	/* receive buffer, first packet */
10*ef8d499eSDavid van Moolenbroek 	struct pbuf **pkt_rcvtailp;	/* receive buffer, last ptr-ptr */
11*ef8d499eSDavid van Moolenbroek 	size_t pkt_rcvlen;		/* receive buffer, length in bytes */
12*ef8d499eSDavid van Moolenbroek 	struct mcast_head pkt_mcast;	/* multicast membership list */
13*ef8d499eSDavid van Moolenbroek 	ip6_addr_p_t pkt_srcaddr;	/* IPV6_PKTINFO: source address */
14*ef8d499eSDavid van Moolenbroek 	uint32_t pkt_ifindex;		/* IPV6_KPTINFO: interface index */
15*ef8d499eSDavid van Moolenbroek };
16*ef8d499eSDavid van Moolenbroek 
17*ef8d499eSDavid van Moolenbroek #define pktsock_get_ipsock(pkt)		(&(pkt)->pkt_ipsock)
18*ef8d499eSDavid van Moolenbroek #define pktsock_get_ifindex(pkt)	((pkt)->pkt_ifindex)
19*ef8d499eSDavid van Moolenbroek 
20*ef8d499eSDavid van Moolenbroek /* Options when sending packets. */
21*ef8d499eSDavid van Moolenbroek struct pktopt {
22*ef8d499eSDavid van Moolenbroek 	uint8_t pkto_flags;		/* packet send flags (PKTOF_) */
23*ef8d499eSDavid van Moolenbroek 	uint8_t pkto_tos;		/* type of service for the packet */
24*ef8d499eSDavid van Moolenbroek 	uint8_t pkto_ttl;		/* time-to-live for the packet */
25*ef8d499eSDavid van Moolenbroek 	uint8_t pkto_mcast_ttl;		/* time-to-live for multicast packet */
26*ef8d499eSDavid van Moolenbroek 	ip6_addr_p_t pkto_srcaddr;	/* IPV6_PKTINFO: source address */
27*ef8d499eSDavid van Moolenbroek 	unsigned int pkto_ifindex;	/* IPV6_PKTINFO: interface index */
28*ef8d499eSDavid van Moolenbroek };
29*ef8d499eSDavid van Moolenbroek 
30*ef8d499eSDavid van Moolenbroek #define PKTOF_TTL		0x01	/* send packet with custom TTL value */
31*ef8d499eSDavid van Moolenbroek #define PKTOF_TOS		0x02	/* send packet with custom TOS value */
32*ef8d499eSDavid van Moolenbroek #define PKTOF_PKTINFO		0x04	/* send packet with src addr, on if. */
33*ef8d499eSDavid van Moolenbroek 
34*ef8d499eSDavid van Moolenbroek int pktsock_socket(struct pktsock * pkt, int domain, size_t sndbuf,
35*ef8d499eSDavid van Moolenbroek 	size_t rcvbuf, struct sock ** sockp);
36*ef8d499eSDavid van Moolenbroek int pktsock_test_input(struct pktsock * pkt, struct pbuf * pbuf);
37*ef8d499eSDavid van Moolenbroek void pktsock_input(struct pktsock * pkt, struct pbuf * pbuf,
38*ef8d499eSDavid van Moolenbroek 	const ip_addr_t * srcaddr, uint16_t port);
39*ef8d499eSDavid van Moolenbroek int pktsock_get_pktinfo(struct pktsock * pkt, struct pktopt * pkto,
40*ef8d499eSDavid van Moolenbroek 	struct ifdev ** ifdevp, ip_addr_t * src_addrp);
41*ef8d499eSDavid van Moolenbroek int pktsock_get_ctl(struct pktsock * pkt, const struct sockdriver_data * ctl,
42*ef8d499eSDavid van Moolenbroek 	socklen_t ctl_len, struct pktopt * pkto);
43*ef8d499eSDavid van Moolenbroek int pktsock_get_data(struct pktsock * pkt, const struct sockdriver_data * data,
44*ef8d499eSDavid van Moolenbroek 	size_t len, struct pbuf * pbuf);
45*ef8d499eSDavid van Moolenbroek int pktsock_pre_recv(struct sock * sock, endpoint_t user_endpt, int flags);
46*ef8d499eSDavid van Moolenbroek int pktsock_recv(struct sock * sock, const struct sockdriver_data * data,
47*ef8d499eSDavid van Moolenbroek 	size_t len, size_t * off, const struct sockdriver_data * ctl,
48*ef8d499eSDavid van Moolenbroek 	socklen_t ctl_len, socklen_t * ctl_off, struct sockaddr * addr,
49*ef8d499eSDavid van Moolenbroek 	socklen_t * addr_len, endpoint_t user_endpt, int flags, size_t min,
50*ef8d499eSDavid van Moolenbroek 	int * rflags);
51*ef8d499eSDavid van Moolenbroek int pktsock_test_recv(struct sock * sock, size_t min, size_t * size);
52*ef8d499eSDavid van Moolenbroek void pktsock_set_mcaware(struct pktsock * pkt);
53*ef8d499eSDavid van Moolenbroek int pktsock_setsockopt(struct pktsock * pkt, int level, int name,
54*ef8d499eSDavid van Moolenbroek 	const struct sockdriver_data * data, socklen_t len,
55*ef8d499eSDavid van Moolenbroek 	struct ipopts * ipopts);
56*ef8d499eSDavid van Moolenbroek int pktsock_getsockopt(struct pktsock * pkt, int level, int name,
57*ef8d499eSDavid van Moolenbroek 	const struct sockdriver_data * data, socklen_t * len,
58*ef8d499eSDavid van Moolenbroek 	struct ipopts * ipopts);
59*ef8d499eSDavid van Moolenbroek void pktsock_shutdown(struct pktsock * pkt, unsigned int mask);
60*ef8d499eSDavid van Moolenbroek void pktsock_close(struct pktsock * pkt);
61*ef8d499eSDavid van Moolenbroek size_t pktsock_get_recvlen(struct pktsock * pkt);
62*ef8d499eSDavid van Moolenbroek 
63*ef8d499eSDavid van Moolenbroek #endif /* !MINIX_NET_LWIP_PKTSOCK_H */
64