Merge pull request #8936 from haukepetersen/opt_rdclisimple_addrconf
net/rdcli_simple: specify RD address as string
This commit is contained in:
commit
6ee4aceef1
@ -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
|
||||||
|
|||||||
@ -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
|
||||||
```
|
```
|
||||||
|
|||||||
@ -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];
|
||||||
|
|||||||
@ -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
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@ -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);
|
||||||
|
|
||||||
|
|||||||
@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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)
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user