/* * Copyright (c) 2015 Jiri Svoboda * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - The name of the author may not be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /** @addtogroup udp * @{ */ /** @file UDP type definitions */ #ifndef UDP_TYPE_H #define UDP_TYPE_H #include <async.h> #include <errno.h> #include <fibril.h> #include <fibril_synch.h> #include <inet/endpoint.h> #include <ipc/loc.h> #include <refcount.h> #include <stdbool.h> #include <stddef.h> #include <stdint.h> #include <inet/addr.h> #define UDP_FRAGMENT_SIZE 65535 /** UDP error codes */ typedef enum { UDP_EOK, /* Insufficient resources */ UDP_ENORES, /* Remote endpoint unspecified */ UDP_EUNSPEC, /* No route to destination */ UDP_ENOROUTE, /** Association reset by user */ UDP_ERESET } udp_error_t; typedef enum { XF_DUMMY = 0x1 } xflags_t; /** Unencoded UDP message (datagram) */ typedef struct { /** Message data */ void *data; /** Message data size */ size_t data_size; } udp_msg_t; /** Encoded PDU */ typedef struct { /** IP link (optional) */ service_id_t iplink; /** Source address */ inet_addr_t src; /** Destination address */ inet_addr_t dest; /** Encoded PDU data including header */ void *data; /** Encoded PDU data size */ size_t data_size; } udp_pdu_t; /** Functions needed by associations module. * * Functions that need to be provided by the caller so that the associations * module can function. */ typedef struct { errno_t (*get_srcaddr)(inet_addr_t *, uint8_t, inet_addr_t *); errno_t (*transmit_msg)(inet_ep2_t *, udp_msg_t *); } udp_assocs_dep_t; /** Association callbacks. * * Callbacks for a particular association, to notify caller of events * on the association. */ typedef struct { /** Message received */ void (*recv_msg)(void *, inet_ep2_t *, udp_msg_t *); } udp_assoc_cb_t; /** UDP association * * This is a rough equivalent of a TCP connection endpoint. It allows * sending and receiving UDP datagrams and it is uniquely identified * by an endpoint pair. */ typedef struct { char *name; link_t link; /** Association identification (endpoint pair) */ inet_ep2_t ident; /** True if association was reset by user */ bool reset; /** True if association was deleted by user */ bool deleted; /** Protects access to association structure */ fibril_mutex_t lock; /** Reference count */ atomic_refcount_t refcnt; /** Receive queue */ list_t rcv_queue; /** Receive queue CV. Broadcast when new datagram is inserted */ fibril_condvar_t rcv_queue_cv; /** Allow sending messages with no local address */ bool nolocal; udp_assoc_cb_t *cb; void *cb_arg; } udp_assoc_t; typedef struct { } udp_assoc_status_t; /** UDP receive queue entry */ typedef struct { /** Link to receive queue */ link_t link; /** Endpoint pair */ inet_ep2_t epp; /** Message */ udp_msg_t *msg; } udp_rcv_queue_entry_t; /** UDP client association. * * Ties a UDP association into the namespace of a client */ typedef struct udp_cassoc { /** Association */ udp_assoc_t *assoc; /** Association ID for the client */ sysarg_t id; /** Client */ struct udp_client *client; link_t lclient; } udp_cassoc_t; /** UDP client receive queue entry */ typedef struct { /** Link to receive queue */ link_t link; /** Endpoint pair */ inet_ep2_t epp; /** Message */ udp_msg_t *msg; /** Client association */ udp_cassoc_t *cassoc; } udp_crcv_queue_entry_t; /** UDP client */ typedef struct udp_client { /** Client callback session */ async_sess_t *sess; /** Client assocations */ list_t cassoc; /* of udp_cassoc_t */ /** Client receive queue */ list_t crcv_queue; } udp_client_t; #endif /** @} */