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 RD_LT ?= 60
# Override this variable to set the RD server address (default is the all nodes # Override this variable to set the RD server address (default is the all nodes
# multicast address) # multicast address)
RD_SERVER ?= IPV6_ADDR_ALL_NODES_LINK_LOCAL RD_ADDR ?= \"ff02::1\"
RD_PORT ?= 5683
CFLAGS += -DRDCLI_LT=$(RD_LT) 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 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 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 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 */ /* print RD client information */
puts("RD client information:"); puts("RD client information:");
printf(" ep: %s\n", rdcli_common_get_ep()); printf(" RD addr: %s\n", RDCLI_SERVER_ADDR);
printf(" lt: %is\n", (int)RDCLI_LT); 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 */ /* run the shell */
char line_buf[SHELL_DEFAULT_BUFSIZE]; 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 #ifndef RDCLI_SERVER_ADDR
#define RDCLI_SERVER_ADDR IPV6_ADDR_ALL_NODES_LINK_LOCAL #define RDCLI_SERVER_ADDR "ff02::1"
#endif #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 * 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 * General Public License v2.1. See the file LICENSE in the top level
@ -26,9 +26,23 @@
extern "C" { extern "C" {
#endif #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 * @brief Initiate the node registration by sending an empty CoAP POST message
* to the RD server's /.well-known/core resource * 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); int rdcli_simple_register(void);

View File

@ -25,36 +25,45 @@
#include "net/rdcli_config.h" #include "net/rdcli_config.h"
#include "net/rdcli_common.h" #include "net/rdcli_common.h"
#include "net/rdcli_simple.h" #include "net/rdcli_simple.h"
#include "net/ipv6/addr.h"
#define BUFSIZE (128U) #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 coap_pkt_t pkt;
static uint8_t buf[BUFSIZE]; 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) 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 */ /* build the initial CON packet */
int res = gcoap_req_init(&pkt, buf, sizeof(buf), COAP_METHOD_POST, if (gcoap_req_init(&pkt, buf, sizeof(buf), COAP_METHOD_POST,
"/.well-known/core"); "/.well-known/core") < 0) {
if (res < 0) { return RDCLI_SIMPLE_ERROR;
return res;
} }
/* make packet confirmable */ /* make packet confirmable */
coap_hdr_set_type(pkt.hdr, COAP_TYPE_CON); coap_hdr_set_type(pkt.hdr, COAP_TYPE_CON);
/* add Uri-Query options */ /* add Uri-Query options */
res = rdcli_common_add_qstring(&pkt); if (rdcli_common_add_qstring(&pkt) < 0) {
if (res < 0) { return RDCLI_SIMPLE_ERROR;
return res;
} }
/* finish, we don't have any payload */ /* finish, we don't have any payload */
ssize_t len = gcoap_finish(&pkt, 0, COAP_FORMAT_LINK); 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); xtimer_sleep(RDCLI_STARTUP_DELAY);
while (1) { while (1) {
int res = rdcli_simple_register(); if (rdcli_simple_register() != RDCLI_SIMPLE_OK) {
if (res < 0) { /* if this fails once, it will always fail, so we might as well
LOG_ERROR("[rdcli_simple] error: unable to trigger registration\n"); * quit now */
LOG_ERROR("[rdcli_simple] error: unable to send registration\n");
break;
} }
xtimer_sleep(RDCLI_UPDATE_INTERVAL); xtimer_sleep(RDCLI_UPDATE_INTERVAL);
} }
return NULL; /* should never be reached */ return NULL;
} }
void rdcli_simple_run(void) void rdcli_simple_run(void)