1
0
mirror of https://github.com/RIOT-OS/RIOT.git synced 2024-12-29 04:50:03 +01:00

Merge pull request #8936 from haukepetersen/opt_rdclisimple_addrconf

net/rdcli_simple: specify RD address as string
This commit is contained in:
Koen Zandberg 2018-04-12 15:33:33 +02:00 committed by GitHub
commit 6ee4aceef1
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 63 additions and 29 deletions

View File

@ -35,9 +35,11 @@ CFLAGS += -DDEVELHELP
RD_LT ?= 60
# Override this variable to set the RD server address (default is the all nodes
# multicast address)
RD_SERVER ?= IPV6_ADDR_ALL_NODES_LINK_LOCAL
RD_ADDR ?= \"ff02::1\"
RD_PORT ?= 5683
CFLAGS += -DRDCLI_LT=$(RD_LT)
CFLAGS += -DRDCLI_SERVER_ADDR=$(RD_SERVER)
CFLAGS += -DRDCLI_SERVER_ADDR=$(RD_ADDR)
CFLAGS += -DRDCLI_SERVER_PORT=$(RD_PORT)
include $(RIOTBASE)/Makefile.include

View File

@ -14,7 +14,11 @@ CFLAGS="-DRDCLI_LT=\"7200\" -DRDCLI_EP=\"MyNode\"" make all
Per default, the node is looking for the CoRE RD at the all nodes link-local
multicast address [FF02::1]:5683. To change the target address or port, simply
redefine `RDCLI_SERVER_ADDR` and `RDCLI_SERVER_PORT`, e.g.:
override the `RD_ADDR` and `RD_PORT` variables, e.g.:
```
CFLAGS="-DRDCLI_SERVER_ADDR=IPV6_ADDR_ALL_ROUTERS_LINK_LOCAL" make all
RD_ADDR=\\\"::1\\\" RD_PORT=12345 make all
```
or
```
RD_ADDR=\\\"abc:0815::123\\\" make all
```

View File

@ -75,8 +75,10 @@ int main(void)
/* print RD client information */
puts("RD client information:");
printf(" ep: %s\n", rdcli_common_get_ep());
printf(" lt: %is\n", (int)RDCLI_LT);
printf(" RD addr: %s\n", RDCLI_SERVER_ADDR);
printf(" RD port: %u\n", (unsigned)RDCLI_SERVER_PORT);
printf(" ep: %s\n", rdcli_common_get_ep());
printf(" lt: %is\n", (int)RDCLI_LT);
/* run the shell */
char line_buf[SHELL_DEFAULT_BUFSIZE];

View File

@ -76,10 +76,11 @@ extern "C" {
/** @} */
/**
* @brief Default IPv6 address to use when looking for RDs
* @brief Use ALL_NODES multicast address as default address when looking for
* a RD server
*/
#ifndef RDCLI_SERVER_ADDR
#define RDCLI_SERVER_ADDR IPV6_ADDR_ALL_NODES_LINK_LOCAL
#define RDCLI_SERVER_ADDR "ff02::1"
#endif
/**

View File

@ -1,5 +1,5 @@
/*
* Copyright (C) 2017 Freie Universität Berlin
* Copyright (C) 2017-2018 Freie Universität Berlin
*
* This file is subject to the terms and conditions of the GNU Lesser
* General Public License v2.1. See the file LICENSE in the top level
@ -26,9 +26,23 @@
extern "C" {
#endif
/**
* @brief Error codes used by the rdcli_simple implementation
*/
enum {
RDCLI_SIMPLE_OK = 0, /**< all good */
RDCLI_SIMPLE_NOADDR = -1, /**< on address conversion errors */
RDCLI_SIMPLE_ERROR = -2, /**< on other errors */
};
/**
* @brief Initiate the node registration by sending an empty CoAP POST message
* to the RD server's /.well-known/core resource
*
* @return RDCLI_SIMPLE_OK on success
* @return RDCLI_SIMPLE_NOADDR if conversion of RD address fails
* @return RDCLI_SIMPLE_ERROR if something goes wrong preparing or sending the
* initial request
*/
int rdcli_simple_register(void);

View File

@ -25,36 +25,45 @@
#include "net/rdcli_config.h"
#include "net/rdcli_common.h"
#include "net/rdcli_simple.h"
#include "net/ipv6/addr.h"
#define BUFSIZE (128U)
/* we don't want to allocate the CoAP packet and scratch buffer on the stack,
* as they are too large for that. */
static coap_pkt_t pkt;
static uint8_t buf[BUFSIZE];
/* allocate an UDP endpoint to the RD server */
static const sock_udp_ep_t remote = {
.family = AF_INET6,
.netif = SOCK_ADDR_ANY_NETIF,
.addr = RDCLI_SERVER_ADDR ,
.port = RDCLI_SERVER_PORT
};
int rdcli_simple_register(void)
{
sock_udp_ep_t remote = {
.family = AF_INET6,
.netif = SOCK_ADDR_ANY_NETIF,
.port = RDCLI_SERVER_PORT,
};
/* parse RD server address */
if (ipv6_addr_from_str((ipv6_addr_t *)&remote.addr.ipv6,
RDCLI_SERVER_ADDR) == NULL) {
return RDCLI_SIMPLE_NOADDR;
}
/* build the initial CON packet */
int res = gcoap_req_init(&pkt, buf, sizeof(buf), COAP_METHOD_POST,
"/.well-known/core");
if (res < 0) {
return res;
if (gcoap_req_init(&pkt, buf, sizeof(buf), COAP_METHOD_POST,
"/.well-known/core") < 0) {
return RDCLI_SIMPLE_ERROR;
}
/* make packet confirmable */
coap_hdr_set_type(pkt.hdr, COAP_TYPE_CON);
/* add Uri-Query options */
res = rdcli_common_add_qstring(&pkt);
if (res < 0) {
return res;
if (rdcli_common_add_qstring(&pkt) < 0) {
return RDCLI_SIMPLE_ERROR;
}
/* finish, we don't have any payload */
ssize_t len = gcoap_finish(&pkt, 0, COAP_FORMAT_LINK);
return (int)gcoap_req_send2(buf, len, &remote, NULL);
if (gcoap_req_send2(buf, len, &remote, NULL) == 0) {
return RDCLI_SIMPLE_ERROR;
}
return RDCLI_SIMPLE_OK;
}

View File

@ -38,14 +38,16 @@ static void *reg_runner(void *arg)
xtimer_sleep(RDCLI_STARTUP_DELAY);
while (1) {
int res = rdcli_simple_register();
if (res < 0) {
LOG_ERROR("[rdcli_simple] error: unable to trigger registration\n");
if (rdcli_simple_register() != RDCLI_SIMPLE_OK) {
/* if this fails once, it will always fail, so we might as well
* quit now */
LOG_ERROR("[rdcli_simple] error: unable to send registration\n");
break;
}
xtimer_sleep(RDCLI_UPDATE_INTERVAL);
}
return NULL; /* should never be reached */
return NULL;
}
void rdcli_simple_run(void)