mirror of
https://github.com/RIOT-OS/RIOT.git
synced 2025-01-18 12:52:44 +01:00
Merge pull request #20125 from benpicco/examples/dtls-sock-cleanup
examples/dtls-sock: make use of helper functions
This commit is contained in:
commit
a384707d6d
@ -13,6 +13,7 @@ USEMODULE += netdev_default
|
|||||||
USEMODULE += auto_init_gnrc_netif
|
USEMODULE += auto_init_gnrc_netif
|
||||||
# Specify the mandatory networking modules for IPv6 and UDP
|
# Specify the mandatory networking modules for IPv6 and UDP
|
||||||
USEMODULE += gnrc_ipv6_default
|
USEMODULE += gnrc_ipv6_default
|
||||||
|
USEMODULE += netutils
|
||||||
|
|
||||||
# Specify DTLS implementation
|
# Specify DTLS implementation
|
||||||
USEPKG += tinydtls
|
USEPKG += tinydtls
|
||||||
|
@ -27,6 +27,7 @@
|
|||||||
#include "net/ipv6/addr.h"
|
#include "net/ipv6/addr.h"
|
||||||
#include "net/credman.h"
|
#include "net/credman.h"
|
||||||
#include "net/sock/util.h"
|
#include "net/sock/util.h"
|
||||||
|
#include "net/utils.h"
|
||||||
|
|
||||||
#include "tinydtls_keys.h"
|
#include "tinydtls_keys.h"
|
||||||
|
|
||||||
@ -88,27 +89,6 @@ static const credman_credential_t credential1 = {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
static credman_tag_t _client_psk_cb(sock_dtls_t *sock, sock_udp_ep_t *ep, credman_tag_t tags[],
|
|
||||||
unsigned tags_len, const char *hint, size_t hint_len)
|
|
||||||
{
|
|
||||||
(void) sock;
|
|
||||||
(void) tags;
|
|
||||||
(void) tags_len;
|
|
||||||
|
|
||||||
/* this callback is here just to show the functionality, it only prints the received hint */
|
|
||||||
char addrstr[IPV6_ADDR_MAX_STR_LEN];
|
|
||||||
uint16_t port;
|
|
||||||
|
|
||||||
sock_udp_ep_fmt(ep, addrstr, &port);
|
|
||||||
printf("From [%s]:%d\n", addrstr, port);
|
|
||||||
|
|
||||||
if (hint && hint_len) {
|
|
||||||
printf("Client got hint: %.*s\n", (unsigned)hint_len, hint);
|
|
||||||
}
|
|
||||||
|
|
||||||
return CREDMAN_TAG_EMPTY;
|
|
||||||
}
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static int client_send(char *addr_str, char *data, size_t datalen)
|
static int client_send(char *addr_str, char *data, size_t datalen)
|
||||||
@ -122,33 +102,17 @@ static int client_send(char *addr_str, char *data, size_t datalen)
|
|||||||
local.port = 12345;
|
local.port = 12345;
|
||||||
remote.port = DTLS_DEFAULT_PORT;
|
remote.port = DTLS_DEFAULT_PORT;
|
||||||
uint8_t buf[DTLS_HANDSHAKE_BUFSIZE];
|
uint8_t buf[DTLS_HANDSHAKE_BUFSIZE];
|
||||||
|
credman_tag_t tag = SOCK_DTLS_CLIENT_TAG_0;
|
||||||
|
|
||||||
/* get interface */
|
/* get interface */
|
||||||
char* iface = ipv6_addr_split_iface(addr_str);
|
netif_t *netif;
|
||||||
if (iface) {
|
res = netutils_get_ipv6((void *)&remote.addr, &netif, addr_str);
|
||||||
int pid = atoi(iface);
|
if (res) {
|
||||||
if (gnrc_netif_get_by_pid(pid) == NULL) {
|
printf("Error parsing remote address\n");
|
||||||
puts("Invalid network interface");
|
return res;
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
remote.netif = pid;
|
|
||||||
} else if (gnrc_netif_numof() == 1) {
|
|
||||||
/* assign the single interface found in gnrc_netif_numof() */
|
|
||||||
remote.netif = gnrc_netif_iter(NULL)->pid;
|
|
||||||
} else {
|
|
||||||
/* no interface is given, or given interface is invalid */
|
|
||||||
/* FIXME This probably is not valid with multiple interfaces */
|
|
||||||
remote.netif = SOCK_ADDR_ANY_NETIF;
|
|
||||||
}
|
}
|
||||||
|
if (netif) {
|
||||||
if (!ipv6_addr_from_str((ipv6_addr_t *)remote.addr.ipv6, addr_str)) {
|
remote.netif = netif_get_id(netif);
|
||||||
puts("Error parsing destination address");
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (sock_udp_create(&udp_sock, &local, NULL, 0) < 0) {
|
|
||||||
puts("Error creating UDP sock");
|
|
||||||
return -1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
res = credman_add(&credential0);
|
res = credman_add(&credential0);
|
||||||
@ -159,13 +123,6 @@ static int client_send(char *addr_str, char *data, size_t datalen)
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (sock_dtls_create(&dtls_sock, &udp_sock, SOCK_DTLS_CLIENT_TAG_0,
|
|
||||||
SOCK_DTLS_1_2, SOCK_DTLS_CLIENT) < 0) {
|
|
||||||
puts("Error creating DTLS sock");
|
|
||||||
sock_udp_close(&udp_sock);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
#if IS_ACTIVE(CONFIG_DTLS_PSK)
|
#if IS_ACTIVE(CONFIG_DTLS_PSK)
|
||||||
/* register a second PSK credential */
|
/* register a second PSK credential */
|
||||||
res = credman_add(&credential1);
|
res = credman_add(&credential1);
|
||||||
@ -175,32 +132,17 @@ static int client_send(char *addr_str, char *data, size_t datalen)
|
|||||||
sock_udp_close(&udp_sock);
|
sock_udp_close(&udp_sock);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
tag = SOCK_DTLS_CLIENT_TAG_1;
|
||||||
/* make the new credential available to the sock */
|
|
||||||
if (sock_dtls_add_credential(&dtls_sock, SOCK_DTLS_CLIENT_TAG_1) < 0) {
|
|
||||||
printf("Error cannot add credential to the sock: %" PRIdSIZE "\n", res);
|
|
||||||
sock_udp_close(&udp_sock);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* register a callback for PSK credential selection */
|
|
||||||
sock_dtls_set_client_psk_cb(&dtls_sock, _client_psk_cb);
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
res = sock_dtls_session_init(&dtls_sock, &remote, &session);
|
res = sock_dtls_establish_session(&udp_sock, &dtls_sock, &session, tag,
|
||||||
if (res <= 0) {
|
&local, &remote, buf, sizeof(buf));
|
||||||
|
if (res) {
|
||||||
sock_udp_close(&udp_sock);
|
sock_udp_close(&udp_sock);
|
||||||
|
printf("Error establishing connection: %d\n", (int)res);
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
res = sock_dtls_recv(&dtls_sock, &session, buf, sizeof(buf),
|
|
||||||
SOCK_NO_TIMEOUT);
|
|
||||||
if (res != -SOCK_DTLS_HANDSHAKE) {
|
|
||||||
printf("Error creating session: %" PRIdSIZE "\n", res);
|
|
||||||
sock_dtls_close(&dtls_sock);
|
|
||||||
sock_udp_close(&udp_sock);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
printf("Connection to server successful\n");
|
printf("Connection to server successful\n");
|
||||||
|
|
||||||
if (sock_dtls_send(&dtls_sock, &session, data, datalen, 0) < 0) {
|
if (sock_dtls_send(&dtls_sock, &session, data, datalen, 0) < 0) {
|
||||||
@ -209,11 +151,10 @@ static int client_send(char *addr_str, char *data, size_t datalen)
|
|||||||
else {
|
else {
|
||||||
printf("Sent DTLS message\n");
|
printf("Sent DTLS message\n");
|
||||||
|
|
||||||
uint8_t rcv[512];
|
if ((res = sock_dtls_recv(&dtls_sock, &session, buf, sizeof(buf),
|
||||||
if ((res = sock_dtls_recv(&dtls_sock, &session, rcv, sizeof(rcv),
|
|
||||||
SOCK_NO_TIMEOUT)) >= 0) {
|
SOCK_NO_TIMEOUT)) >= 0) {
|
||||||
printf("Received %" PRIdSIZE " bytes: \"%.*s\"\n", res, (int)res,
|
printf("Received %" PRIdSIZE " bytes: \"%.*s\"\n", res, (int)res,
|
||||||
(char *)rcv);
|
(char *)buf);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user