xref: /minix3/minix/net/lwip/lwip.h (revision ef8d499e2d2af900e9b2ab297171d7b088652482)
1*ef8d499eSDavid van Moolenbroek #ifndef MINIX_NET_LWIP_LWIP_H
2*ef8d499eSDavid van Moolenbroek #define MINIX_NET_LWIP_LWIP_H
3*ef8d499eSDavid van Moolenbroek 
4*ef8d499eSDavid van Moolenbroek #include <minix/drivers.h>
5*ef8d499eSDavid van Moolenbroek #include <minix/sockevent.h>
6*ef8d499eSDavid van Moolenbroek #include <minix/rmib.h>
7*ef8d499eSDavid van Moolenbroek #include <netinet/in.h>
8*ef8d499eSDavid van Moolenbroek #include <sys/ioctl.h>
9*ef8d499eSDavid van Moolenbroek #include <net/bpf.h>
10*ef8d499eSDavid van Moolenbroek 
11*ef8d499eSDavid van Moolenbroek #include "lwip/ip.h"
12*ef8d499eSDavid van Moolenbroek #include "lwiphooks.h"
13*ef8d499eSDavid van Moolenbroek 
14*ef8d499eSDavid van Moolenbroek #include "addr.h"
15*ef8d499eSDavid van Moolenbroek #include "ipsock.h"
16*ef8d499eSDavid van Moolenbroek #include "ifdev.h"
17*ef8d499eSDavid van Moolenbroek #include "util.h"
18*ef8d499eSDavid van Moolenbroek 
19*ef8d499eSDavid van Moolenbroek /*
20*ef8d499eSDavid van Moolenbroek  * The standard sockaddr_dl is an absolute pain, because the actual structure
21*ef8d499eSDavid van Moolenbroek  * is dynamically sized, while the standard definition is neither the minimum
22*ef8d499eSDavid van Moolenbroek  * nor the maximum size.  We use our own version, which uses the maximum size
23*ef8d499eSDavid van Moolenbroek  * that we will ever produce and accept.  This greatly simplifies dealing with
24*ef8d499eSDavid van Moolenbroek  * this structure while also limiting stack usage a bit.
25*ef8d499eSDavid van Moolenbroek  */
26*ef8d499eSDavid van Moolenbroek struct sockaddr_dlx {
27*ef8d499eSDavid van Moolenbroek 	uint8_t		sdlx_len;	/* actual length of this structure */
28*ef8d499eSDavid van Moolenbroek 	sa_family_t	sdlx_family;	/* address family, always AF_LINK */
29*ef8d499eSDavid van Moolenbroek 	uint16_t	sdlx_index;	/* interface index */
30*ef8d499eSDavid van Moolenbroek 	uint8_t		sdlx_type;	/* interface type (IFT_) */
31*ef8d499eSDavid van Moolenbroek 	uint8_t		sdlx_nlen;	/* interface name length, w/o nul */
32*ef8d499eSDavid van Moolenbroek 	uint8_t		sdlx_alen;	/* link-layer address length */
33*ef8d499eSDavid van Moolenbroek 	uint8_t		sdlx_slen;	/* selector length, always 0 */
34*ef8d499eSDavid van Moolenbroek 	uint8_t		sdlx_data[IFNAMSIZ + NETIF_MAX_HWADDR_LEN];
35*ef8d499eSDavid van Moolenbroek };
36*ef8d499eSDavid van Moolenbroek 
37*ef8d499eSDavid van Moolenbroek STATIC_SOCKADDR_MAX_ASSERT(sockaddr_in);
38*ef8d499eSDavid van Moolenbroek STATIC_SOCKADDR_MAX_ASSERT(sockaddr_in6);
39*ef8d499eSDavid van Moolenbroek STATIC_SOCKADDR_MAX_ASSERT(sockaddr_dlx);
40*ef8d499eSDavid van Moolenbroek 
41*ef8d499eSDavid van Moolenbroek /* This is our own, much smaller internal version of sockaddr_storage. */
42*ef8d499eSDavid van Moolenbroek union sockaddr_any {
43*ef8d499eSDavid van Moolenbroek 	struct sockaddr sa;
44*ef8d499eSDavid van Moolenbroek 	struct sockaddr_in sin;
45*ef8d499eSDavid van Moolenbroek 	struct sockaddr_in6 sin6;
46*ef8d499eSDavid van Moolenbroek 	struct sockaddr_dlx sdlx;
47*ef8d499eSDavid van Moolenbroek };
48*ef8d499eSDavid van Moolenbroek 
49*ef8d499eSDavid van Moolenbroek /* Number of bits in each of the types of IP addresses. */
50*ef8d499eSDavid van Moolenbroek #define IP4_BITS	32		/* number of bits in an IPv4 address */
51*ef8d499eSDavid van Moolenbroek #define IP6_BITS	128		/* number of bits in an IPv6 address */
52*ef8d499eSDavid van Moolenbroek 
53*ef8d499eSDavid van Moolenbroek /*
54*ef8d499eSDavid van Moolenbroek  * Each socket module maintains its own set of sockets, but all sockets must be
55*ef8d499eSDavid van Moolenbroek  * given globally unique identifiers.  Therefore, we use these modifier masks,
56*ef8d499eSDavid van Moolenbroek  * which are bitwise OR'ed with the per-module socket identifiers.
57*ef8d499eSDavid van Moolenbroek  */
58*ef8d499eSDavid van Moolenbroek #define SOCKID_TCP	0x00000000
59*ef8d499eSDavid van Moolenbroek #define SOCKID_UDP	0x00100000
60*ef8d499eSDavid van Moolenbroek #define SOCKID_RAW	0x00200000
61*ef8d499eSDavid van Moolenbroek #define SOCKID_RT	0x00400000
62*ef8d499eSDavid van Moolenbroek #define SOCKID_LNK	0x00800000
63*ef8d499eSDavid van Moolenbroek 
64*ef8d499eSDavid van Moolenbroek /*
65*ef8d499eSDavid van Moolenbroek  * Static remote MIB node identifiers for nodes that are dynamically numbered
66*ef8d499eSDavid van Moolenbroek  * on NetBSD, because they do not have a corresponding protocol family number.
67*ef8d499eSDavid van Moolenbroek  */
68*ef8d499eSDavid van Moolenbroek #define NET_INTERFACES	(PF_MAX)	/* net.interfaces (TODO) */
69*ef8d499eSDavid van Moolenbroek #define NET_BPF		(PF_MAX + 1)	/* net.bpf */
70*ef8d499eSDavid van Moolenbroek 
71*ef8d499eSDavid van Moolenbroek #define ROOT_EUID	0		/* effective user ID of superuser */
72*ef8d499eSDavid van Moolenbroek 
73*ef8d499eSDavid van Moolenbroek /*
74*ef8d499eSDavid van Moolenbroek  * Function declarations.  Modules with more extended interfaces have their own
75*ef8d499eSDavid van Moolenbroek  * header files.
76*ef8d499eSDavid van Moolenbroek  */
77*ef8d499eSDavid van Moolenbroek 
78*ef8d499eSDavid van Moolenbroek /* mempool.c */
79*ef8d499eSDavid van Moolenbroek void mempool_init(void);
80*ef8d499eSDavid van Moolenbroek unsigned int mempool_cur_buffers(void);
81*ef8d499eSDavid van Moolenbroek unsigned int mempool_max_buffers(void);
82*ef8d499eSDavid van Moolenbroek 
83*ef8d499eSDavid van Moolenbroek /* pchain.c */
84*ef8d499eSDavid van Moolenbroek struct pbuf **pchain_end(struct pbuf * pbuf);
85*ef8d499eSDavid van Moolenbroek size_t pchain_size(struct pbuf * pbuf);
86*ef8d499eSDavid van Moolenbroek 
87*ef8d499eSDavid van Moolenbroek /* addrpol.c */
88*ef8d499eSDavid van Moolenbroek int addrpol_get_label(const ip_addr_t * ipaddr);
89*ef8d499eSDavid van Moolenbroek int addrpol_get_scope(const ip_addr_t * ipaddr, int is_src);
90*ef8d499eSDavid van Moolenbroek 
91*ef8d499eSDavid van Moolenbroek /* tcpsock.c */
92*ef8d499eSDavid van Moolenbroek void tcpsock_init(void);
93*ef8d499eSDavid van Moolenbroek sockid_t tcpsock_socket(int domain, int protocol, struct sock ** sock,
94*ef8d499eSDavid van Moolenbroek 	const struct sockevent_ops ** ops);
95*ef8d499eSDavid van Moolenbroek 
96*ef8d499eSDavid van Moolenbroek /* udpsock.c */
97*ef8d499eSDavid van Moolenbroek void udpsock_init(void);
98*ef8d499eSDavid van Moolenbroek sockid_t udpsock_socket(int domain, int protocol, struct sock ** sock,
99*ef8d499eSDavid van Moolenbroek 	const struct sockevent_ops ** ops);
100*ef8d499eSDavid van Moolenbroek 
101*ef8d499eSDavid van Moolenbroek /* rawsock.c */
102*ef8d499eSDavid van Moolenbroek void rawsock_init(void);
103*ef8d499eSDavid van Moolenbroek sockid_t rawsock_socket(int domain, int protocol, struct sock ** sock,
104*ef8d499eSDavid van Moolenbroek 	const struct sockevent_ops ** ops);
105*ef8d499eSDavid van Moolenbroek 
106*ef8d499eSDavid van Moolenbroek /* loopif.c */
107*ef8d499eSDavid van Moolenbroek void loopif_init(void);
108*ef8d499eSDavid van Moolenbroek ssize_t loopif_cksum(struct rmib_call * call, struct rmib_node * node,
109*ef8d499eSDavid van Moolenbroek 	struct rmib_oldp * oldp, struct rmib_newp * newp);
110*ef8d499eSDavid van Moolenbroek 
111*ef8d499eSDavid van Moolenbroek /* lnksock.c */
112*ef8d499eSDavid van Moolenbroek void lnksock_init(void);
113*ef8d499eSDavid van Moolenbroek sockid_t lnksock_socket(int type, int protocol, struct sock ** sock,
114*ef8d499eSDavid van Moolenbroek 	const struct sockevent_ops ** ops);
115*ef8d499eSDavid van Moolenbroek 
116*ef8d499eSDavid van Moolenbroek /* mibtree.c */
117*ef8d499eSDavid van Moolenbroek void mibtree_init(void);
118*ef8d499eSDavid van Moolenbroek void mibtree_register_inet(int domain, int protocol, struct rmib_node * node);
119*ef8d499eSDavid van Moolenbroek void mibtree_register_lwip(struct rmib_node * node);
120*ef8d499eSDavid van Moolenbroek 
121*ef8d499eSDavid van Moolenbroek /* ifconf.c */
122*ef8d499eSDavid van Moolenbroek void ifconf_init(void);
123*ef8d499eSDavid van Moolenbroek int ifconf_ioctl(struct sock * sock, unsigned long request,
124*ef8d499eSDavid van Moolenbroek 	const struct sockdriver_data * data, endpoint_t user_endpt);
125*ef8d499eSDavid van Moolenbroek 
126*ef8d499eSDavid van Moolenbroek /* bpf_filter.c */
127*ef8d499eSDavid van Moolenbroek u_int bpf_filter_ext(const struct bpf_insn * pc, const struct pbuf * pbuf,
128*ef8d499eSDavid van Moolenbroek 	const u_char * packet, u_int total, u_int len);
129*ef8d499eSDavid van Moolenbroek 
130*ef8d499eSDavid van Moolenbroek #endif /* !MINIX_NET_LWIP_LWIP_H */
131