libcoap 4.3.5-develop-5567e83
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 if (!(sock->flags & COAP_SOCKET_SLAVE)) {
94 uip_udp_remove(sock->udp_conn);
95 sock->udp_conn = NULL;
97 }
98}
99
100/*
101 * dgram
102 * return +ve Number of bytes written.
103 * -1 Error error in errno).
104 */
105ssize_t
106coap_socket_send(coap_socket_t *sock, coap_session_t *session, const uint8_t *data,
107 size_t datalen) {
108 ssize_t bytes_written = 0;
109
110 if (!coap_debug_send_packet()) {
111 bytes_written = (ssize_t)datalen;
112 } else {
113 uip_udp_packet_sendto(sock->udp_conn, data, datalen,
114 &session->addr_info.remote.addr, session->addr_info.remote.port);
115 bytes_written = datalen;
116 }
117
118 if (bytes_written < 0) {
119 coap_log_crit("coap_socket_send: %s\n", coap_socket_strerror());
120 }
121
122 return bytes_written;
123}
124
125/*
126 * dgram
127 * return +ve Number of bytes written.
128 * -1 Error error in errno).
129 * -2 ICMP error response
130 */
131ssize_t
133 ssize_t len;
134
135 assert(sock);
136 assert(packet);
137
138 if (!(sock->flags & COAP_SOCKET_CAN_READ)) {
139 return -1;
140 }
141 /* clear has-data flag */
142 sock->flags &= ~COAP_SOCKET_CAN_READ;
143
144 uip_ipaddr_copy(&packet->addr_info.remote.addr, &UIP_IP_BUF->srcipaddr);
145 packet->addr_info.remote.port = UIP_UDP_BUF->srcport;
146 uip_ipaddr_copy(&packet->addr_info.local.addr, &UIP_IP_BUF->destipaddr);
147 packet->addr_info.local.port = UIP_UDP_BUF->destport;
148
149 len = uip_datalen();
150
151 if (len > COAP_RXBUFFER_SIZE) {
152 coap_log_warn("Received message does not fit within buffer\n");
153 return -1;
154 }
155 packet->length = len;
156 packet->payload = uip_appdata;
157
158 return len;
159}
160
161#else /* ! WITH_CONTIKI */
162
163#ifdef __clang__
164/* Make compilers happy that do not like empty modules. As this function is
165 * never used, we ignore -Wunused-function at the end of compiling this file
166 */
167#pragma GCC diagnostic ignored "-Wunused-function"
168#endif
169static inline void
170dummy(void) {
171}
172
173#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:847
#define COAP_RXBUFFER_SIZE
Definition coap_io.h:33
#define COAP_SOCKET_SLAVE
socket is a slave socket - do not close
#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