Skip to content

Commit

Permalink
Merge pull request #8936 from haukepetersen/opt_rdclisimple_addrconf
Browse files Browse the repository at this point in the history
net/rdcli_simple: specify RD address as string
  • Loading branch information
bergzand authored Apr 12, 2018
2 parents 3be4b51 + 2e6ccfa commit 6ee4ace
Show file tree
Hide file tree
Showing 7 changed files with 63 additions and 29 deletions.
6 changes: 4 additions & 2 deletions examples/rdcli_simple/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -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
8 changes: 6 additions & 2 deletions examples/rdcli_simple/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
```
6 changes: 4 additions & 2 deletions examples/rdcli_simple/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -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];
Expand Down
5 changes: 3 additions & 2 deletions sys/include/net/rdcli_config.h
Original file line number Diff line number Diff line change
Expand Up @@ -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

/**
Expand Down
16 changes: 15 additions & 1 deletion sys/include/net/rdcli_simple.h
Original file line number Diff line number Diff line change
@@ -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
Expand All @@ -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);

Expand Down
41 changes: 25 additions & 16 deletions sys/net/application_layer/rdcli_simple/rdcli_simple.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
10 changes: 6 additions & 4 deletions sys/net/application_layer/rdcli_simple/rdcli_simple_standalone.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down

0 comments on commit 6ee4ace

Please sign in to comment.