libcoap 4.3.5-develop-490e4e0
Loading...
Searching...
No Matches
coap_dgrm_contiki.c
Go to the documentation of this file.
1/* coap_dgrm_contiki.c -- UDP Network I/O functions for libcoap on Contiki-NG
2 *
3 * Copyright (C) 2012,2014,2024-2025 Olaf Bergmann <bergmann@tzi.org>
4 * 2014 chrysn <chrysn@fsfe.org>
5 *
6 * SPDX-License-Identifier: BSD-2-Clause
7 *
8 * This file is part of the CoAP library libcoap. Please see
9 * README for terms of use.
10 */
11
18
19#if defined(WITH_CONTIKI)
20
21#include "contiki-net.h"
22
23extern struct process libcoap_io_process;
24
25int
27 const coap_address_t *listen_addr,
28 coap_address_t *bound_addr) {
29 uip_ds6_addr_t *addr;
30
31 addr = uip_ds6_get_global(ADDR_PREFERRED);
32 if (!addr) {
33 coap_log_err("coap_socket_bind_udp: called before getting an IPv6 address\n");
34 return 0;
35 }
36 PROCESS_CONTEXT_BEGIN(&libcoap_io_process);
37 sock->udp_conn = udp_new(NULL, 0, sock);
38 PROCESS_CONTEXT_END(&libcoap_io_process);
39 if (!sock->udp_conn) {
40 coap_log_err("coap_socket_bind_udp: udp_new returned NULL\n");
41 return 0;
42 }
43 udp_bind(sock->udp_conn, listen_addr->port);
44 uip_ipaddr_copy(&bound_addr->addr, &addr->ipaddr);
45 bound_addr->port = sock->udp_conn->lport;
46 return 1;
47}
48
49int
51 const coap_address_t *local_if,
52 const coap_address_t *server,
53 int default_port,
54 coap_address_t *local_addr,
55 coap_address_t *remote_addr) {
56 uip_ds6_addr_t *addr;
57
58 if (local_if) {
59 coap_log_warn("coap_socket_connect_udp: ignoring local_if parameter\n");
60 }
61 addr = uip_ds6_get_global(ADDR_PREFERRED);
62 if (!addr) {
63 coap_log_err("coap_socket_connect_udp: called before getting an IPv6 address\n");
64 return 0;
65 }
66 PROCESS_CONTEXT_BEGIN(&libcoap_io_process);
67 sock->udp_conn = udp_new(&server->addr, server->port ? server->port : default_port, sock);
68 PROCESS_CONTEXT_END(&libcoap_io_process);
69 if (!sock->udp_conn) {
70 coap_log_err("coap_socket_connect_udp: udp_new returned NULL\n");
71 return 0;
72 }
73 uip_ipaddr_copy(&local_addr->addr, &addr->ipaddr);
74 local_addr->port = sock->udp_conn->lport;
75 uip_ipaddr_copy(&remote_addr->addr, &server->addr);
76 remote_addr->port = sock->udp_conn->rport;
78 return 1;
79}
80
81ssize_t
82coap_socket_write(coap_socket_t *sock, const uint8_t *data, size_t data_len) {
83 return -1;
84}
85
86ssize_t
87coap_socket_read(coap_socket_t *sock, uint8_t *data, size_t data_len) {
88 return -1;
89}
90
91void
93 uip_udp_remove(sock->udp_conn);
94 sock->udp_conn = NULL;
96}
97
98/*
99 * dgram
100 * return +ve Number of bytes written.
101 * -1 Error error in errno).
102 */
103ssize_t
104coap_socket_send(coap_socket_t *sock, coap_session_t *session, const uint8_t *data,
105 size_t datalen) {
106 ssize_t bytes_written = 0;
107
108 if (!coap_debug_send_packet()) {
109 bytes_written = (ssize_t)datalen;
110 } else {
111 uip_udp_packet_sendto(sock->udp_conn, data, datalen,
112 &session->addr_info.remote.addr, session->addr_info.remote.port);
113 bytes_written = datalen;
114 }
115
116 if (bytes_written < 0) {
117 coap_log_crit("coap_socket_send: %s\n", coap_socket_strerror());
118 }
119
120 return bytes_written;
121}
122
123/*
124 * dgram
125 * return +ve Number of bytes written.
126 * -1 Error error in errno).
127 * -2 ICMP error response
128 */
129ssize_t
131 ssize_t len;
132
133 assert(sock);
134 assert(packet);
135
136 if (!(sock->flags & COAP_SOCKET_CAN_READ)) {
137 return -1;
138 }
139 /* clear has-data flag */
140 sock->flags &= ~COAP_SOCKET_CAN_READ;
141
142 uip_ipaddr_copy(&packet->addr_info.remote.addr, &UIP_IP_BUF->srcipaddr);
143 packet->addr_info.remote.port = UIP_UDP_BUF->srcport;
144 uip_ipaddr_copy(&packet->addr_info.local.addr, &UIP_IP_BUF->destipaddr);
145 packet->addr_info.local.port = UIP_UDP_BUF->destport;
146
147 len = uip_datalen();
148
149 if (len > COAP_RXBUFFER_SIZE) {
150 coap_log_warn("Received message does not fit within buffer\n");
151 return -1;
152 }
153 packet->length = len;
154 packet->payload = uip_appdata;
155
156 return len;
157}
158
159#else /* ! WITH_CONTIKI */
160
161#ifdef __clang__
162/* Make compilers happy that do not like empty modules. As this function is
163 * never used, we ignore -Wunused-function at the end of compiling this file
164 */
165#pragma GCC diagnostic ignored "-Wunused-function"
166#endif
167static inline void
168dummy(void) {
169}
170
171#endif /* ! WITH_CONTIKI */
int coap_debug_send_packet(void)
Check to see whether a packet should be sent or not.
static void dummy(void)
const char * coap_socket_strerror(void)
Definition coap_io.c:814
#define COAP_RXBUFFER_SIZE
Definition coap_io.h:33
#define COAP_SOCKET_CAN_READ
non blocking socket can now read without blocking
#define COAP_SOCKET_CONNECTED
the socket is connected
#define COAP_SOCKET_EMPTY
coap_socket_flags_t values
Library specific build wrapper for coap_internal.h.
int coap_socket_connect_udp(coap_socket_t *sock, const coap_address_t *local_if, const coap_address_t *server, int default_port, coap_address_t *local_addr, coap_address_t *remote_addr)
Create a new UDP socket and 'connect' it to the address tuple.
ssize_t coap_socket_recv(coap_socket_t *sock, coap_packet_t *packet)
Function interface for reading data.
ssize_t coap_socket_send(coap_socket_t *sock, coap_session_t *session, const uint8_t *data, size_t datalen)
Function interface for data transmission.
int coap_socket_bind_udp(coap_socket_t *sock, const coap_address_t *listen_addr, coap_address_t *bound_addr)
Create a new UDP socket and then listen for new incoming UDP sessions to the specified IP address and...
void coap_socket_dgrm_close(coap_socket_t *sock)
Function interface to close off a datagram socket.
#define coap_log_warn(...)
Definition coap_debug.h:108
#define coap_log_err(...)
Definition coap_debug.h:102
#define coap_log_crit(...)
Definition coap_debug.h:96
ssize_t coap_socket_read(coap_socket_t *sock, uint8_t *data, size_t data_len)
Function interface for data stream receiving off a socket.
ssize_t coap_socket_write(coap_socket_t *sock, const uint8_t *data, size_t data_len)
Function interface for data stream sending off a socket.
coap_address_t remote
remote address and port
Definition coap_io.h:60
coap_address_t local
local address and port
Definition coap_io.h:61
Multi-purpose address abstraction.
union coap_address_t::@0 addr
size_t length
length of payload
coap_addr_tuple_t addr_info
local and remote addresses
unsigned char * payload
payload
Abstraction of virtual session that can be attached to coap_context_t (client) or coap_endpoint_t (se...
coap_addr_tuple_t addr_info
remote/local address info
coap_socket_flags_t flags
1 or more of COAP_SOCKET* flag values