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