2 * Copyright (c) 2015 Jiri Svoboda
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
9 * - Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 * - Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the distribution.
14 * - The name of the author may not be used to endorse or promote products
15 * derived from this software without specific prior written permission.
17 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
38 #include <inet/inet.h>
47 static errno_t
udp_inet_ev_recv(inet_dgram_t
*dgram
);
48 static void udp_received_pdu(udp_pdu_t
*pdu
);
50 static inet_ev_ops_t udp_inet_ev_ops
= {
51 .recv
= udp_inet_ev_recv
54 /** Received datagram callback */
55 static errno_t
udp_inet_ev_recv(inet_dgram_t
*dgram
)
59 log_msg(LOG_DEFAULT
, LVL_DEBUG
, "udp_inet_ev_recv()");
62 pdu
->iplink
= dgram
->iplink
;
63 pdu
->data
= dgram
->data
;
64 pdu
->data_size
= dgram
->size
;
66 pdu
->src
= dgram
->src
;
67 pdu
->dest
= dgram
->dest
;
69 udp_received_pdu(pdu
);
71 /* We don't want udp_pdu_delete() to free dgram->data */
78 /** Transmit PDU over network layer. */
79 errno_t
udp_transmit_pdu(udp_pdu_t
*pdu
)
84 log_msg(LOG_DEFAULT
, LVL_DEBUG
, "udp_transmit_pdu()");
86 dgram
.iplink
= pdu
->iplink
;
88 dgram
.dest
= pdu
->dest
;
90 dgram
.data
= pdu
->data
;
91 dgram
.size
= pdu
->data_size
;
93 rc
= inet_send(&dgram
, INET_TTL_MAX
, 0);
95 log_msg(LOG_DEFAULT
, LVL_ERROR
, "Failed to transmit PDU.");
100 /** Process received PDU. */
101 static void udp_received_pdu(udp_pdu_t
*pdu
)
106 log_msg(LOG_DEFAULT
, LVL_DEBUG
, "udp_received_pdu()");
108 if (udp_pdu_decode(pdu
, &rident
, &dmsg
) != EOK
) {
109 log_msg(LOG_DEFAULT
, LVL_WARN
, "Not enough memory. PDU dropped.");
114 * Insert decoded message into appropriate receive queue.
115 * This transfers ownership of dmsg to the callee, we do not
118 udp_assoc_received(&rident
, dmsg
);
121 errno_t
udp_inet_init(void)
125 log_msg(LOG_DEFAULT
, LVL_DEBUG
, "udp_inet_init()");
127 rc
= inet_init(IP_PROTO_UDP
, &udp_inet_ev_ops
);
129 log_msg(LOG_DEFAULT
, LVL_ERROR
, "Failed connecting to internet service.");