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