Date   

API meeting: agenda

Carles Cufi
 

Hi all,

The topics for today:

- PR: Fix handling of WDT_DISABLE_AT_BOOT option
- https://github.com/zephyrproject-rtos/zephyr/pull/22859

- PR (cont): generalize async notification and add queued operation manager
- https://github.com/zephyrproject-rtos/zephyr/pull/22853

- PR (RFC): asynchronous sequence manager (assuming the relevant stakeholders are present)
- https://github.com/zephyrproject-rtos/zephyr/pull/23075

Additional items in the "Triage" column in the GitHub project may be discussed if time permits.
If you want an item included in the meeting, please add it to the GitHub project.

https://github.com/zephyrproject-rtos/zephyr/wiki/Zephyr-Committee-and-Working-Group-Meetings#zephyr-api-discussion
https://github.com/zephyrproject-rtos/zephyr/projects/18
https://docs.google.com/document/d/1lv-8B5QE2m4FjBcvfqAXFIgQfW5oz6306zJ7GIZIWCk/edit

Regards,

Carles


Re: CONFIG_MBEDTLS_BUILTIN vs CONFIG_MBEDTLS_LIBRARY

Paul Sokolovsky
 

Hello,

On Mon, 2 Mar 2020 14:15:57 +0000
"Sebastian Boe" <Sebastian.Boe@...> wrote:

Hi,

I would recommend opening menuconfig and reading the help text for
each option.
It's also possible to search/read config option descriptions in Zephyr
docs, just go to https://docs.zephyrproject.org/latest/ , paste an
option name into search field on the left, and voila.

That said, in this case, option descriptions are rather bare and hardly
can be understood without knowing more context (like, being a Zephyr
developer with some experience):
https://docs.zephyrproject.org/latest/reference/kconfig/CONFIG_MBEDTLS_LIBRARY.html

I'd suggest we use questions like this to actually improve config
option descriptions. In that regard, I submitted
https://github.com/zephyrproject-rtos/zephyr/pull/23217


Subject: [Zephyr-devel] CONFIG_MBEDTLS_BUILTIN vs
CONFIG_MBEDTLS_LIBRARY

Hi All,

What is the difference between CONFIG_MBEDTLS_BUILTIN vs
CONFIG_MBEDTLS_LIBRARY

When i set CONFIG_MBEDTLS_LIBRARY it is throwing error:

/home/jamal/zephyrproject/zephyr/subsys/net/lib/sockets/sockets_tls.c:24:10:
fatal error: mbedtls/config.h: No such file or directory #include
"mbedtls/config.h" ^~~~~~~~~~~~~~~~~~
compilation terminated.

I want to set MBEDTLS_X509_CRT_PARSE_C, so that my certificate and
private keys are parsed by the mbedtls library, can you please
provide me steps to achieve this?
--
Best Regards,
Paul

Linaro.org | Open source software for ARM SoCs
Follow Linaro: http://www.facebook.com/pages/Linaro
http://twitter.com/#!/linaroorg - http://www.linaro.org/linaro-blog


Re: Why is TLS_CREDENTIAL_PRIVATE_KEY not implemented

Lubos, Robert
 

I’m afraid you’ve misunderstood the code in there. Just by the fact the `case TLS_CREDENTIAL_PRIVATE_KEY` is empty does not mean that private key management is not implemented (which is more or less explained in the comment).

 

As private key needs to be registered together with its corresponding public certificate, they’re handled together in the condition above. That’s why there’s no need for an action, when private key is encountered:

https://github.com/zephyrproject-rtos/zephyr/blob/master/subsys/net/lib/sockets/sockets_tls.c#L672

 

This mechanism is for instance used in `echo_server` sample, where both private key and server certificate are registered, and later on used in the sample:

https://github.com/zephyrproject-rtos/zephyr/blob/master/samples/net/sockets/echo_server/src/echo-server.c#L63

 

Regards,

Robert

 

From: devel@... [mailto:devel@...] On Behalf Of Linux Weekend Learning via Lists.Zephyrproject.Org
Sent: Monday, March 2, 2020 17:19
To: devel@...
Cc: devel@...
Subject: [Zephyr-devel] Why is TLS_CREDENTIAL_PRIVATE_KEY not implemented

 

I tried to debug my problem and found that  TLS_CREDENTIAL_PRIVATE_KEY is not implemented. I need to set private key and my certificate and both are not implemented. When setting

certificate it is looking for private key which is not stored

This is the code in socket_tls.c file tls_set_credential

 

 case TLS_CREDENTIAL_PRIVATE_KEY:
/* Ignore private key - it will be used together
* with public certificate
*/
break;


Why is TLS_CREDENTIAL_PRIVATE_KEY not implemented

Linux Weekend Learning
 

I tried to debug my problem and found that  TLS_CREDENTIAL_PRIVATE_KEY is not implemented. I need to set private key and my certificate and both are not implemented. When setting
certificate it is looking for private key which is not stored
This is the code in socket_tls.c file tls_set_credential

 case TLS_CREDENTIAL_PRIVATE_KEY:
/* Ignore private key - it will be used together
* with public certificate
*/
break;


Re: CONFIG_MBEDTLS_BUILTIN vs CONFIG_MBEDTLS_LIBRARY

Linux Weekend Learning
 

I added this in my prj.conf file

CONFIG_MBEDTLS_USER_CONFIG_ENABLE=y
CONFIG_MBEDTLS_USER_CONFIG_FILE="user-tls.conf"

user-tls.conf file:

#define MBEDTLS_X509_CRT_PARSE_C

In my code, i added a check to see whether this is enabled or not
#if defined(MBEDTLS_X509_CRT_PARSE_C)
LOG_INF("Enabled");
#endif

This log is not printing, what mistake i am doing. i need to set  MBEDTLS_X509_CRT_PARSE_C for certificate and private key to be accepted by socket_tls.c


On Mon, Mar 2, 2020 at 7:45 PM Bøe, Sebastian <Sebastian.Boe@...> wrote:
Hi,

I would recommend opening menuconfig and reading the help text for each option.

________________________________________
From: devel@... <devel@...> on behalf of Linux Weekend Learning via Lists.Zephyrproject.Org <md.jamalmohiuddin=gmail.com@...>
Sent: Monday, March 2, 2020 3:14 PM
To: devel@...
Cc: devel@...
Subject: [Zephyr-devel] CONFIG_MBEDTLS_BUILTIN vs CONFIG_MBEDTLS_LIBRARY

Hi All,

What is the difference between CONFIG_MBEDTLS_BUILTIN vs  CONFIG_MBEDTLS_LIBRARY

When i set  CONFIG_MBEDTLS_LIBRARY it is throwing error:

/home/jamal/zephyrproject/zephyr/subsys/net/lib/sockets/sockets_tls.c:24:10: fatal error: mbedtls/config.h: No such file or directory
 #include "mbedtls/config.h"
          ^~~~~~~~~~~~~~~~~~
compilation terminated.

I want to set MBEDTLS_X509_CRT_PARSE_C, so that my certificate and private keys are parsed by the mbedtls library, can you please provide me steps to achieve this?


Re: CONFIG_MBEDTLS_BUILTIN vs CONFIG_MBEDTLS_LIBRARY

Sebastian Boe
 

Hi,

I would recommend opening menuconfig and reading the help text for each option.

________________________________________
From: devel@... <devel@...> on behalf of Linux Weekend Learning via Lists.Zephyrproject.Org <md.jamalmohiuddin=gmail.com@...>
Sent: Monday, March 2, 2020 3:14 PM
To: devel@...
Cc: devel@...
Subject: [Zephyr-devel] CONFIG_MBEDTLS_BUILTIN vs CONFIG_MBEDTLS_LIBRARY

Hi All,

What is the difference between CONFIG_MBEDTLS_BUILTIN vs CONFIG_MBEDTLS_LIBRARY

When i set CONFIG_MBEDTLS_LIBRARY it is throwing error:

/home/jamal/zephyrproject/zephyr/subsys/net/lib/sockets/sockets_tls.c:24:10: fatal error: mbedtls/config.h: No such file or directory
#include "mbedtls/config.h"
^~~~~~~~~~~~~~~~~~
compilation terminated.

I want to set MBEDTLS_X509_CRT_PARSE_C, so that my certificate and private keys are parsed by the mbedtls library, can you please provide me steps to achieve this?


CONFIG_MBEDTLS_BUILTIN vs CONFIG_MBEDTLS_LIBRARY

Linux Weekend Learning
 

Hi All,

What is the difference between CONFIG_MBEDTLS_BUILTIN vs  CONFIG_MBEDTLS_LIBRARY

When i set  CONFIG_MBEDTLS_LIBRARY it is throwing error:

/home/jamal/zephyrproject/zephyr/subsys/net/lib/sockets/sockets_tls.c:24:10: fatal error: mbedtls/config.h: No such file or directory
 #include "mbedtls/config.h"
          ^~~~~~~~~~~~~~~~~~
compilation terminated.

I want to set MBEDTLS_X509_CRT_PARSE_C, so that my certificate and private keys are parsed by the mbedtls library, can you please provide me steps to achieve this?


Re: mqtt_connect blocked at connect stage

Jukka Rissanen
 

Hi,

some comments inline below:

On Sun, 2020-03-01 at 10:01 +0530, Linux Weekend Learning wrote:

static void broker_init(void)
{
struct sockaddr_in *broker4 = (struct sockaddr_in *)&broker;

broker4->sin_family = AF_INET;
broker4->sin_port = htons(8883);

net_ipaddr_copy(&broker4->sin_addr,
&net_sin(haddr->ai_addr)->sin_addr);

#if defined(CONFIG_SOCKS)
struct sockaddr_in *proxy4 = (struct sockaddr_in *)&socks5_proxy;

proxy4->sin_family = AF_INET;
proxy4->sin_port = htons(1081);
inet_pton(AF_INET, "agwgaprlb6xdl-ats.iot.us-west-2.amazonaws.com",
&proxy4->sin_addr);
Use IP address here instead of hostname.


#endif
}

void mqtt_evt_handler(struct mqtt_client *const client,
const struct mqtt_evt *evt)
{
int err;

switch (evt->type) {
case MQTT_EVT_CONNACK:
if (evt->result != 0) {
LOG_ERR("MQTT connect failed %d", evt->result);
break;
}

connected = true;
LOG_INF("MQTT client connected!");

break;

case MQTT_EVT_DISCONNECT:
LOG_INF("MQTT client disconnected %d", evt->result);

connected = false;
clear_fds();

break;

case MQTT_EVT_PUBACK:
if (evt->result != 0) {
LOG_ERR("MQTT PUBACK error %d", evt->result);
break;
}

LOG_INF("PUBACK packet id: %u", evt->param.puback.message_id);

break;

case MQTT_EVT_PUBREC:
if (evt->result != 0) {
LOG_ERR("MQTT PUBREC error %d", evt->result);
break;
}

LOG_INF("PUBREC packet id: %u", evt->param.pubrec.message_id);

const struct mqtt_pubrel_param rel_param = {
.message_id = evt->param.pubrec.message_id
};
err = mqtt_publish_qos2_release(client, &rel_param);
if (err != 0) {
LOG_ERR("Failed to send MQTT PUBREL: %d", err);
}

break;

case MQTT_EVT_PUBCOMP:
if (evt->result != 0) {
LOG_ERR("MQTT PUBCOMP error %d", evt->result);
break;
}

LOG_INF("PUBCOMP packet id: %u",
evt->param.pubcomp.message_id);

break;

default:
break;
}
}


static void client_init(struct mqtt_client *client)
{
static struct mqtt_utf8 password;
static struct mqtt_utf8 username;

mqtt_client_init(client);
broker_init();


password.utf8 = (u8_t *)CONFIG_SAMPLE_CLOUD_AWS_PASSWORD;
password.size = strlen(CONFIG_SAMPLE_CLOUD_AWS_PASSWORD);

client->password = &password;

username.utf8 = (u8_t *)CONFIG_SAMPLE_CLOUD_AWS_USERNAME;
username.size = strlen(CONFIG_SAMPLE_CLOUD_AWS_USERNAME);

client->user_name = &username;


/* MQTT client configuration */
client->broker = &broker;
client->evt_cb = mqtt_evt_handler;
client->client_id.utf8 = (u8_t *)MQTT_CLIENTID;
client->client_id.size = strlen(MQTT_CLIENTID);
client->password = NULL;
client->user_name = NULL;
client->protocol_version = MQTT_VERSION_3_1_1;

/* MQTT buffers configuration */
client->rx_buf = rx_buffer;
client->rx_buf_size = sizeof(rx_buffer);
client->tx_buf = tx_buffer;
client->tx_buf_size = sizeof(tx_buffer);

client->transport.type = MQTT_TRANSPORT_SECURE;

struct mqtt_sec_config *tls_config = &client->transport.tls.config;

tls_config->peer_verify = TLS_PEER_VERIFY_REQUIRED;
tls_config->cipher_list = NULL;
tls_config->sec_tag_list = m_sec_tags;
tls_config->sec_tag_count = ARRAY_SIZE(m_sec_tags);
tls_config->hostname = "agwgaprlb6xdl-ats.iot.us-west-
2.amazonaws.com";
client->transport.type = MQTT_TRANSPORT_SECURE;
#if defined(CONFIG_SOCKS)
mqtt_client_set_proxy(client, &socks5_proxy,
socks5_proxy.sa_family == AF_INET ?
sizeof(struct sockaddr_in) :
sizeof(struct sockaddr_in6));
#endif


}
#define RC_STR(rc) ((rc) == 0 ? "OK" : "ERROR")
#define PRINT_RESULT(func, rc) \
LOG_INF("%s: %d <%s>", (func), rc, RC_STR(rc))
static void prepare_fds(struct mqtt_client *client)
{
if (client->transport.type == MQTT_TRANSPORT_NON_SECURE) {
fds[0].fd = client->transport.tcp.sock;
}
#if defined(CONFIG_MQTT_LIB_TLS)
else if (client->transport.type == MQTT_TRANSPORT_SECURE) {
fds[0].fd = client->transport.tls.sock;
}
#endif

fds[0].events = ZSOCK_POLLIN;
nfds = 1;
}

static void wait(int timeout)
{
if (nfds > 0) {
if (poll(fds, nfds, timeout) < 0) {
LOG_ERR("poll error: %d", errno);
}
}
}



static int try_to_connect(struct mqtt_client *client)
{
u8_t retries = 3U;
int rc;

LOG_DBG("attempting to connect...");
You could print the IP address you are trying to connect in order to
verify that it is set correctly.


client_init(client);
rc = mqtt_connect(client);
if (rc != 0) {
PRINT_RESULT("mqtt_connect", rc);
k_sleep(500);
} else {

prepare_fds(client);

wait(500);
mqtt_input(client);
if (!connected) {
LOG_INF("Aborting connection\n");
mqtt_abort(client);
}

}
if (connected) {
return 0;
}

return -EINVAL;

}


static int tls_init(void)
{
int err = -EINVAL;
LOG_INF("Ca size:%d\n", sizeof(ca_certificate));
err = tls_credential_add(APP_CA_CERT_TAG,
TLS_CREDENTIAL_CA_CERTIFICATE,
ca_certificate,
sizeof(ca_certificate));
if (err < 0) {
LOG_ERR("Failed to register public certificate: %d",
err);
return err;
}


return err;
}


void mqtt_startup(char *hostname, int port)
{
struct mqtt_client *client = &client_ctx;
int retries = 5;
int err, cnt;
static struct zsock_addrinfo hints;
int res = 0;
int rc;




hints.ai_family = AF_INET;
hints.ai_socktype = SOCK_STREAM;
hints.ai_protocol = 0;
cnt = 0;
while ((err = getaddrinfo("agwgaprlb6xdl-ats.iot.us-west-
2.amazonaws.com", "8883", &hints,
&haddr)) && cnt < 3) {
LOG_ERR("Unable to get address for broker, retrying");
cnt++;
}
if (err != 0) {
LOG_ERR("Unable to get address for broker, error %d",
res);
return;
}
LOG_INF("DNS resolved for agwgaprlb6xdl-ats.iot.us-west-
2.amazonaws.com:8833");
try_to_connect(client);
PRINT_RESULT("try_to_connect", rc);




}

static void show_addrinfo(struct addrinfo *addr)
{
char hr_addr[NET_IPV6_ADDR_LEN];
void *a;

top:
LOG_DBG(" flags : %d", addr->ai_flags);
LOG_DBG(" family : %d", addr->ai_family);
LOG_DBG(" socktype: %d", addr->ai_socktype);
LOG_DBG(" protocol: %d", addr->ai_protocol);
LOG_DBG(" addrlen : %d", (int)addr->ai_addrlen);

/* Assume two words. */
LOG_DBG(" addr[0]: 0x%lx", ((uint32_t *)addr->ai_addr)[0]);
LOG_DBG(" addr[1]: 0x%lx", ((uint32_t *)addr->ai_addr)[1]);

if (addr->ai_next != 0) {
addr = addr->ai_next;
goto top;
}

a = &net_sin(addr->ai_addr)->sin_addr;
LOG_INF(" Got %s",
log_strdup(net_addr_ntop(addr->ai_family, a,
hr_addr, sizeof(hr_addr))));

}

void do_sntp(struct addrinfo *addr)
{
struct sntp_ctx ctx;
int rc;
s64_t stamp;
struct sntp_time sntp_time;
char time_str[sizeof("1970-01-01T00:00:00")];

LOG_INF("Sending NTP request for current time:");

/* Initialize sntp */
rc = sntp_init(&ctx, addr->ai_addr, sizeof(struct sockaddr_in));
if (rc < 0) {
LOG_ERR("Unable to init sntp context: %d", rc);
return;
}
rc = sntp_query(&ctx, K_FOREVER, &sntp_time);
if (rc == 0) {
stamp = k_uptime_get();
time_base = sntp_time.seconds * MSEC_PER_SEC - stamp;

/* Convert time to make sure. */
time_t now = sntp_time.seconds;
struct tm now_tm;

gmtime_r(&now, &now_tm);
strftime(time_str, sizeof(time_str), "%FT%T", &now_tm);
LOG_INF(" Acquired time: %s", log_strdup(time_str));

} else {
LOG_ERR(" Failed to acquire SNTP, code %d\n", rc);
}

sntp_close(&ctx);
}


void main(void)
{
static struct addrinfo hints;
struct addrinfo *haddr;
int res;
int cnt = 0;
int rc;


app_dhcpv4_startup();

LOG_INF("Should have DHCPv4 lease at this point.");
hints.ai_family = AF_INET;
hints.ai_socktype = SOCK_DGRAM;
hints.ai_protocol = 0;
//while ((res = getaddrinfo("console.aws.amazon.com", "80", &hints,
while ((res = getaddrinfo("time.google.com", "123", &hints,
&haddr)) && cnt < 3) {
LOG_ERR("Unable to get address for NTP server, retrying");
cnt++;
}

if (res != 0) {
LOG_ERR("Unable to get address of NTP server, exiting %d", res);
return;
}


LOG_INF("DNS resolved for console.aws.amazon.com:80");
show_addrinfo(haddr);
do_sntp(haddr);

#if defined(CONFIG_MQTT_LIB_TLS)

rc = tls_init();
PRINT_RESULT("tls_init", rc);
#endif

mqtt_startup("agwgaprlb6xdl-ats.iot.us-west-2.amazonaws.com", 8883);

}

Console Logs:

[00:00:09.666,000] <inf> aws_mqtt: tls_init: 0 <OK>
[00:00:09.706,000] <inf> aws_mqtt: DNS resolved for agwgaprlb6xdl-
ats.iot.us-west-2.amazonaws.com:8833
[00:00:09.718,000] <dbg> aws_mqtt.try_to_connect: attempting to
connect...
[00:00:09.727,000] <dbg> net_mqtt_sock_tls.mqtt_client_tls_connect:
(0x20401bac): Created socket 0
[00:00:09.739,000] <dbg> net_mqtt_sock_tls.mqtt_client_tls_connect:
(0x20401bac): Before Connect completed
_._,_._,_

Cheers,
Jukka


mqtt_connect blocked at connect stage

Linux Weekend Learning
 

Hi Guys,

Please help me out here, the code is blocked internally when calling 'connect'

I wrote a code to connect to the Amazon Web Services IOT Service

/*
 * Copyright (c) 2019 Intel Corporation
 *
 * SPDX-License-Identifier: Apache-2.0
 */

#include <logging/log.h>
LOG_MODULE_REGISTER(aws_mqtt, LOG_LEVEL_DBG);

#include <zephyr.h>
#include <net/socket.h>
#include <net/mqtt.h>
#include <net/net_config.h>
#include <net/net_event.h>
#include <net/sntp.h>

#include <sys/printk.h>
#include <string.h>
#include <errno.h>
#include "dhcp.h"
#include <time.h>
#include <inttypes.h>
#include "test_certs.h"
#if defined(CONFIG_SOCKS)
static struct sockaddr socks5_proxy;
#endif
static struct pollfd fds[1];
static int nfds;

#define CONFIG_SAMPLE_CLOUD_AWS_PASSWORD ""
#define CONFIG_SAMPLE_CLOUD_AWS_USERNAME ""

#define APP_MQTT_BUFFER_SIZE    128
#define APP_CA_CERT_TAG 1
#define APP_PSK_TAG 2

static sec_tag_t m_sec_tags[] = {
#if defined(MBEDTLS_X509_CRT_PARSE_C) || defined(CONFIG_NET_SOCKETS_OFFLOAD)
APP_CA_CERT_TAG,
#endif
#if defined(MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED)
APP_PSK_TAG,
#endif
};

/* Buffers for MQTT client. */
static u8_t rx_buffer[APP_MQTT_BUFFER_SIZE];
static u8_t tx_buffer[APP_MQTT_BUFFER_SIZE];
static bool connected;

#define MQTT_CLIENTID           "zephyr_publisher"

struct zsock_addrinfo *haddr;
s64_t time_base;
static struct sockaddr_storage broker;
static struct mqtt_client client_ctx;

static void clear_fds(void)
{
nfds = 0;
}
time_t my_k_time(time_t *ptr)
{
s64_t stamp;
time_t now;

stamp = k_uptime_get();
now = (time_t)((stamp + time_base) / 1000);

if (ptr) {
*ptr = now;
}

return now;
}

static void broker_init(void)
{
struct sockaddr_in *broker4 = (struct sockaddr_in *)&broker;

broker4->sin_family = AF_INET;
broker4->sin_port = htons(8883);

net_ipaddr_copy(&broker4->sin_addr,
&net_sin(haddr->ai_addr)->sin_addr);

#if defined(CONFIG_SOCKS)
struct sockaddr_in *proxy4 = (struct sockaddr_in *)&socks5_proxy;

proxy4->sin_family = AF_INET;
proxy4->sin_port = htons(1081);
inet_pton(AF_INET, "agwgaprlb6xdl-ats.iot.us-west-2.amazonaws.com", &proxy4->sin_addr);
#endif
}

void mqtt_evt_handler(struct mqtt_client *const client,
const struct mqtt_evt *evt)
{
int err;

switch (evt->type) {
case MQTT_EVT_CONNACK:
if (evt->result != 0) {
LOG_ERR("MQTT connect failed %d", evt->result);
break;
}

connected = true;
LOG_INF("MQTT client connected!");

break;

case MQTT_EVT_DISCONNECT:
LOG_INF("MQTT client disconnected %d", evt->result);

connected = false;
clear_fds();

break;

case MQTT_EVT_PUBACK:
if (evt->result != 0) {
LOG_ERR("MQTT PUBACK error %d", evt->result);
break;
}

LOG_INF("PUBACK packet id: %u", evt->param.puback.message_id);

break;

case MQTT_EVT_PUBREC:
if (evt->result != 0) {
LOG_ERR("MQTT PUBREC error %d", evt->result);
break;
}

LOG_INF("PUBREC packet id: %u", evt->param.pubrec.message_id);

const struct mqtt_pubrel_param rel_param = {
.message_id = evt->param.pubrec.message_id
};
err = mqtt_publish_qos2_release(client, &rel_param);
if (err != 0) {
LOG_ERR("Failed to send MQTT PUBREL: %d", err);
}

break;

case MQTT_EVT_PUBCOMP:
if (evt->result != 0) {
LOG_ERR("MQTT PUBCOMP error %d", evt->result);
break;
}

LOG_INF("PUBCOMP packet id: %u",
evt->param.pubcomp.message_id);

break;

default:
break;
}
}


static void client_init(struct mqtt_client *client)
{
        static struct mqtt_utf8 password;
        static struct mqtt_utf8 username;

mqtt_client_init(client);
broker_init();


password.utf8 = (u8_t *)CONFIG_SAMPLE_CLOUD_AWS_PASSWORD;
password.size = strlen(CONFIG_SAMPLE_CLOUD_AWS_PASSWORD);

client->password = &password;

username.utf8 = (u8_t *)CONFIG_SAMPLE_CLOUD_AWS_USERNAME;
username.size = strlen(CONFIG_SAMPLE_CLOUD_AWS_USERNAME);

client->user_name = &username;


/* MQTT client configuration */
client->broker = &broker;
client->evt_cb = mqtt_evt_handler;
client->client_id.utf8 = (u8_t *)MQTT_CLIENTID;
client->client_id.size = strlen(MQTT_CLIENTID);
client->password = NULL;
client->user_name = NULL;
client->protocol_version = MQTT_VERSION_3_1_1;

/* MQTT buffers configuration */
client->rx_buf = rx_buffer;
client->rx_buf_size = sizeof(rx_buffer);
client->tx_buf = tx_buffer;
client->tx_buf_size = sizeof(tx_buffer);

client->transport.type = MQTT_TRANSPORT_SECURE;

struct mqtt_sec_config *tls_config = &client->transport.tls.config;

tls_config->peer_verify = TLS_PEER_VERIFY_REQUIRED;
tls_config->cipher_list = NULL;
tls_config->sec_tag_list = m_sec_tags;
tls_config->sec_tag_count = ARRAY_SIZE(m_sec_tags);
tls_config->hostname = "agwgaprlb6xdl-ats.iot.us-west-2.amazonaws.com";
client->transport.type = MQTT_TRANSPORT_SECURE;
#if defined(CONFIG_SOCKS)
mqtt_client_set_proxy(client, &socks5_proxy,
socks5_proxy.sa_family == AF_INET ?
sizeof(struct sockaddr_in) :
sizeof(struct sockaddr_in6));
#endif


}
#define RC_STR(rc) ((rc) == 0 ? "OK" : "ERROR")
#define PRINT_RESULT(func, rc) \
LOG_INF("%s: %d <%s>", (func), rc, RC_STR(rc))
static void prepare_fds(struct mqtt_client *client)
{
if (client->transport.type == MQTT_TRANSPORT_NON_SECURE) {
fds[0].fd = client->transport.tcp.sock;
}
#if defined(CONFIG_MQTT_LIB_TLS)
else if (client->transport.type == MQTT_TRANSPORT_SECURE) {
fds[0].fd = client->transport.tls.sock;
}
#endif

fds[0].events = ZSOCK_POLLIN;
nfds = 1;
}

static void wait(int timeout)
{
if (nfds > 0) {
if (poll(fds, nfds, timeout) < 0) {
LOG_ERR("poll error: %d", errno);
}
}
}



static int try_to_connect(struct mqtt_client *client)
{
u8_t retries = 3U;
int rc;

LOG_DBG("attempting to connect...");

client_init(client);
rc = mqtt_connect(client);
if (rc != 0) {
PRINT_RESULT("mqtt_connect", rc);
k_sleep(500);
} else {

prepare_fds(client);

wait(500);
mqtt_input(client);
if (!connected) {
LOG_INF("Aborting connection\n");
mqtt_abort(client);
}

}
if (connected) {
return 0;
}

return -EINVAL;

}


static int tls_init(void)
{
        int err = -EINVAL;
LOG_INF("Ca size:%d\n", sizeof(ca_certificate));
        err = tls_credential_add(APP_CA_CERT_TAG, TLS_CREDENTIAL_CA_CERTIFICATE,
                                 ca_certificate, sizeof(ca_certificate));
        if (err < 0) {
                LOG_ERR("Failed to register public certificate: %d", err);
                return err;
        }


        return err;
}


void mqtt_startup(char *hostname, int port)
{
struct mqtt_client *client = &client_ctx;
int retries = 5;
int err, cnt;
static struct zsock_addrinfo hints;
int res = 0;
int rc;




hints.ai_family = AF_INET;
hints.ai_socktype = SOCK_STREAM;
hints.ai_protocol = 0;
cnt = 0;
while ((err = getaddrinfo("agwgaprlb6xdl-ats.iot.us-west-2.amazonaws.com", "8883", &hints,
&haddr)) && cnt < 3) {
LOG_ERR("Unable to get address for broker, retrying");
cnt++;
}
if (err != 0) {
LOG_ERR("Unable to get address for broker, error %d",
res);
return;
}
LOG_INF("DNS resolved for agwgaprlb6xdl-ats.iot.us-west-2.amazonaws.com:8833");
try_to_connect(client);
PRINT_RESULT("try_to_connect", rc);




}

static void show_addrinfo(struct addrinfo *addr)
{
char hr_addr[NET_IPV6_ADDR_LEN];
void *a;

top:
LOG_DBG("  flags   : %d", addr->ai_flags);
LOG_DBG("  family  : %d", addr->ai_family);
LOG_DBG("  socktype: %d", addr->ai_socktype);
LOG_DBG("  protocol: %d", addr->ai_protocol);
LOG_DBG("  addrlen : %d", (int)addr->ai_addrlen);

/* Assume two words. */
LOG_DBG("   addr[0]: 0x%lx", ((uint32_t *)addr->ai_addr)[0]);
LOG_DBG("   addr[1]: 0x%lx", ((uint32_t *)addr->ai_addr)[1]);

if (addr->ai_next != 0) {
addr = addr->ai_next;
goto top;
}

a = &net_sin(addr->ai_addr)->sin_addr;
LOG_INF("  Got %s",
log_strdup(net_addr_ntop(addr->ai_family, a,
hr_addr, sizeof(hr_addr))));

}

void do_sntp(struct addrinfo *addr)
{
struct sntp_ctx ctx;
int rc;
s64_t stamp;
struct sntp_time sntp_time;
char time_str[sizeof("1970-01-01T00:00:00")];

LOG_INF("Sending NTP request for current time:");

/* Initialize sntp */
rc = sntp_init(&ctx, addr->ai_addr, sizeof(struct sockaddr_in));
if (rc < 0) {
LOG_ERR("Unable to init sntp context: %d", rc);
return;
}
rc = sntp_query(&ctx, K_FOREVER, &sntp_time);
if (rc == 0) {
stamp = k_uptime_get();
time_base = sntp_time.seconds * MSEC_PER_SEC - stamp;

/* Convert time to make sure. */
time_t now = sntp_time.seconds;
struct tm now_tm;

gmtime_r(&now, &now_tm);
strftime(time_str, sizeof(time_str), "%FT%T", &now_tm);
LOG_INF("  Acquired time: %s", log_strdup(time_str));

} else {
LOG_ERR("  Failed to acquire SNTP, code %d\n", rc);
}

sntp_close(&ctx);
}


void main(void)
{
static struct addrinfo hints;
struct addrinfo *haddr;
int res;
int cnt = 0;
        int rc;


app_dhcpv4_startup();

LOG_INF("Should have DHCPv4 lease at this point.");
hints.ai_family = AF_INET;
hints.ai_socktype = SOCK_DGRAM;
hints.ai_protocol = 0;
//while ((res = getaddrinfo("console.aws.amazon.com", "80", &hints,
while ((res = getaddrinfo("time.google.com", "123", &hints,
&haddr)) && cnt < 3) {
LOG_ERR("Unable to get address for NTP server, retrying");
cnt++;
}

if (res != 0) {
LOG_ERR("Unable to get address of NTP server, exiting %d", res);
return;
}


LOG_INF("DNS resolved for console.aws.amazon.com:80");
show_addrinfo(haddr);
do_sntp(haddr);

#if defined(CONFIG_MQTT_LIB_TLS)

        rc = tls_init();
        PRINT_RESULT("tls_init", rc);
#endif

mqtt_startup("agwgaprlb6xdl-ats.iot.us-west-2.amazonaws.com", 8883);

}

Console Logs:

[00:00:09.666,000] <inf> aws_mqtt: tls_init: 0 <OK>
[00:00:09.706,000] <inf> aws_mqtt: DNS resolved for agwgaprlb6xdl-ats.iot.us-west-2.amazonaws.com:8833
[00:00:09.718,000] <dbg> aws_mqtt.try_to_connect: attempting to connect...
[00:00:09.727,000] <dbg> net_mqtt_sock_tls.mqtt_client_tls_connect: (0x20401bac): Created socket 0
[00:00:09.739,000] <dbg> net_mqtt_sock_tls.mqtt_client_tls_connect: (0x20401bac): Before Connect completed


Zephyr 2.2.0-rc3 tagged

Johan Hedberg
 

Hi Zephyr developers,

We have now tagged Zephyr 2.2.0-rc3, i.e. we’re getting close to the final release. We’re currently at 15 medium priority bugs and no high priority bugs, so the release criteria are met (at least for now).

From now on I’ll handle all merges until the release. The focus should now be on testing, documentation updates and release notes. If all goes well the final release will be done later in the coming week.

The full release log can be found here: https://github.com/zephyrproject-rtos/zephyr/releases/tag/v2.2.0-rc3

More details about Zephyr releases is found here: https://github.com/zephyrproject-rtos/zephyr/wiki/Program-Management

Thanks to everybody who has contributed to this release!

Johan


Re: ARMv7 Cortex-A port for Xilinx Zynq7000

Jukka Rissanen
 

Hi Immo,

the networking unit tests under tests/net directory should be self
contained i.e., they should not need SLIP to be able to run. The
sanitychecker also compiles samples/net/ programs and those indeed need
SLIP or other network connectivity, but these are not run by
sanitychecker (unless you flash them to the actual device).


Cheers,
Jukka

On Fri, 2020-02-28 at 02:53 -0800, Immo Birnbaum wrote:
Hi Jukka,

thanks for the info, I looked at the YAML files of other platforms
and eventually came across the "-netif:eth" switch. Once I had that
integrated, I had a bit of a fight against the QEMU system
configuration in conjunction with the UART pipe and SLIP drivers used
by the networking tests, I eventually came up with a configuration in
which both the UART console and the UART pipe driver work after
fixing a minor bug in one of the instantiation macros of the Xilinx
UART driver. Also, having the Ethernet controller driver perform
polling reads/writes to a PHY that is non-existent in QEMU doesn't
help the system booting. Fortunately, I had the PHY initialization as
an optional switch in the driver's Kconfig file right from the
start.

I don't have the exact number of tests performed available right now,
but after all those changes, running sanitycheck for the tests/net
branch resulted in a significant number of test cases being executed,
of which only 2 or 3 failed - the actual tests all passed, but the
test cases failed due to assertions. Obviously, more interfaces than
expected are being created, in particular for test cases involving
VLANs. I'll leave that branch as it is for now, as I'm currently
doing my research regarding the two test cases in tests/kernel that
currently fail.

Best regards,
Immo


Re: ARMv7 Cortex-A port for Xilinx Zynq7000

Immo Birnbaum
 

Hi Jukka,

thanks for the info, I looked at the YAML files of other platforms and eventually came across the "-netif:eth" switch. Once I had that integrated, I had a bit of a fight against the QEMU system configuration in conjunction with the UART pipe and SLIP drivers used by the networking tests, I eventually came up with a configuration in which both the UART console and the UART pipe driver work after fixing a minor bug in one of the instantiation macros of the Xilinx UART driver. Also, having the Ethernet controller driver perform polling reads/writes to a PHY that is non-existent in QEMU doesn't help the system booting. Fortunately, I had the PHY initialization as an optional switch in the driver's Kconfig file right from the start.

I don't have the exact number of tests performed available right now, but after all those changes, running sanitycheck for the tests/net branch resulted in a significant number of test cases being executed, of which only 2 or 3 failed - the actual tests all passed, but the test cases failed due to assertions. Obviously, more interfaces than expected are being created, in particular for test cases involving VLANs. I'll leave that branch as it is for now, as I'm currently doing my research regarding the two test cases in tests/kernel that currently fail.

Best regards,
Immo


Re: ARMv7 Cortex-A port for Xilinx Zynq7000

Jukka Rissanen
 

Hi Immo,

for networking tests to run, I think you need to say

- netif:eth

in board yaml file (instead of just "- net")


Cheers,
Jukka

On Wed, 2020-02-26 at 04:54 -0800, Immo Birnbaum wrote:
Hi all,

here's my first update on the topic of the Zynq-7000 port, this is
the progress so far:

- Set up a fresh development VM which now uses the Zephyr SDK, which
works fine for the Cortex-A9.
- Forked the Zephyr repository and set up a feature branch, which can
be found here:
https://github.com/ibirnbaum/zephyr/tree/armv7_cortex_a
- Merged all of the changes/additions described above into the
current code base.
- Updated the AXI GPIO driver to match the GPIO driver API which was
heavily modified in the meantime.
- Kicked out my own GIC PL-390 interrupt controller driver and
switched over to Stephanos Ionannidis' GICv1 implementation,
including updated IRQ descriptors in the device tree files.
- I looked into the testsuite and ran tests on the QEMU Cortex-A9
target, plus a hand full of test cases on the actual hardware (as
downloading the binary to the board is still a manual process using
the Lauterbach TRACE software). The results don't look too bad, for
example, these are the results of the 'kernel' test suite:
* 86 test configurations selected, 8 configurations discarded due to
filters
* 24 tests skipped (e.g. SMP/ARMv8/userspace related test cases)
* Out of the 62 remaining test cases, 60 pass. One
(kernel.timer.tickless) fails to build due to an unresolved symbol
(z_clock_uptime). This is odd for two reasons: one, all other
'tickless'-related tests are skipped and two, the Local APIC timer
driver seems to be the only timer driver implementing this function.
To me, this looks more like a testsuite configuration issue? The
other failure is the arch.interrupt test case, which actually runs
but fails due to an assertion regarding the expected state of an IRQ
to be tested. This is due to the target IRQ selection logic only
being implemented for Cortex-M when it comes to the ARM architecture.
The following testsuites pass all test cases on the QEMU target which
aren't filtered out for whatever reason (I didn't blacklist anything
myself):
- lib
- misc
- portability
- posix
- shell
- subsys
- ztest
I'll have to look into the details as to why in some cases, more test
cases are filtered out than executed. In some cases, e.g. ARMv8-
specific stuff, it's pretty obvious, but in others I'm suspecting
that I ought to whitelist testcases or subsystems for testing, likely
in the target's YAML files? For example, despite having full Ethernet
support, the 'net' testsuite in its current state does pretty much
nothing.

I'll keep you updated and I'll look into the ongoing discussions and
the mechanics of pull requests, I could start simple, as for example,
the Xilinx TTC timer driver had a faulty prescaler calculation
routine. As this source file is already in the main repository, this
might be a good exercise for a pull request. Until then, I'd
appreciate any feedback if anyone feels like experimenting with my
fork of the repository.

Best regards,
Immo


Upcoming Event: Zephyr Project: Dev Meeting - Thu, 02/27/2020 8:00am-9:00am, Please RSVP #cal-reminder

devel@lists.zephyrproject.org Calendar <devel@...>
 

Reminder: Zephyr Project: Dev Meeting

When: Thursday, 27 February 2020, 8:00am to 9:00am, (GMT-08:00) America/Los Angeles

Where:https://zoom.us/j/993312203

An RSVP is requested. Click here to RSVP

Organizer: devel@...

Description: Join Zoom Meeting
https://zoom.us/j/993312203

One tap mobile
+16699006833,,993312203# US (San Jose)
+16465588656,,993312203# US (New York)

Dial by your location
        +1 669 900 6833 US (San Jose)
        +1 646 558 8656 US (New York)
        +1 877 369 0926 US Toll-free
        +1 855 880 1246 US Toll-free
Meeting ID: 993 312 203
Find your local number: https://zoom.us/u/ankEMRagf


Re: ARMv7 Cortex-A port for Xilinx Zynq7000

Stephanos Ioannidis
 

Hi Immo,

 

Thanks for looking into this.

 

For the time being, I believe focusing on the following issues would help in getting these changes upstream-ed:

 

  1. Getting all applicable tests to pass
    1. At least, all applicable `kernel` tests must pass.
    2. Some tests (e.g. `benchmark` and `interrupt`) may require additional work to pass (see #22669 and #22670).
  2. Cleaning up commits (all the usual stuff)
    1. Breaking changes into more manageable chunks/commits
    2. Squashing commits that should really be one commit

 

The following are some ongoing issues that could be noteworthy:

 

  • Refactor ARM interrupt system (Cortex-A & Cortex-R) (#22718)
  • Implement benchmark tests for Cortex-R and Cortex-A (#22669)
  • Implement GIC-based ARM interrupt tests (#22670)
  • arch: arm: aarch32: Allow selecting compiler instruction set (#22741)
  • AArch64 / Cortex-A port improvements / TODO (#22411)
  • soc: arm64: Add support for Xilinx ZynqMP APU (#22418)

 

There is also the #arch-arm channel on the Slack where we discuss ARM arch development topics.

 

Regards,

 

Stephanos

 

From: devel@... <devel@...> On Behalf Of Immo Birnbaum via Lists.Zephyrproject.Org
Sent: Wednesday, February 26, 2020 9:55 PM
To: devel@...
Cc: devel@...
Subject: Re: [Zephyr-devel] ARMv7 Cortex-A port for Xilinx Zynq7000

 

Hi all,

here's my first update on the topic of the Zynq-7000 port, this is the progress so far:

- Set up a fresh development VM which now uses the Zephyr SDK, which works fine for the Cortex-A9.
- Forked the Zephyr repository and set up a feature branch, which can be found here: https://github.com/ibirnbaum/zephyr/tree/armv7_cortex_a
- Merged all of the changes/additions described above into the current code base.
- Updated the AXI GPIO driver to match the GPIO driver API which was heavily modified in the meantime.
- Kicked out my own GIC PL-390 interrupt controller driver and switched over to Stephanos Ionannidis' GICv1 implementation, including updated IRQ descriptors in the device tree files.
- I looked into the testsuite and ran tests on the QEMU Cortex-A9 target, plus a hand full of test cases on the actual hardware (as downloading the binary to the board is still a manual process using the Lauterbach TRACE software). The results don't look too bad, for example, these are the results of the 'kernel' test suite:
* 86 test configurations selected, 8 configurations discarded due to filters
* 24 tests skipped (e.g. SMP/ARMv8/userspace related test cases)
* Out of the 62 remaining test cases, 60 pass. One (kernel.timer.tickless) fails to build due to an unresolved symbol (z_clock_uptime). This is odd for two reasons: one, all other 'tickless'-related tests are skipped and two, the Local APIC timer driver seems to be the only timer driver implementing this function. To me, this looks more like a testsuite configuration issue? The other failure is the arch.interrupt test case, which actually runs but fails due to an assertion regarding the expected state of an IRQ to be tested. This is due to the target IRQ selection logic only being implemented for Cortex-M when it comes to the ARM architecture.
The following testsuites pass all test cases on the QEMU target which aren't filtered out for whatever reason (I didn't blacklist anything myself):
- lib
- misc
- portability
- posix
- shell
- subsys
- ztest
I'll have to look into the details as to why in some cases, more test cases are filtered out than executed. In some cases, e.g. ARMv8-specific stuff, it's pretty obvious, but in others I'm suspecting that I ought to whitelist testcases or subsystems for testing, likely in the target's YAML files? For example, despite having full Ethernet support, the 'net' testsuite in its current state does pretty much nothing.

I'll keep you updated and I'll look into the ongoing discussions and the mechanics of pull requests, I could start simple, as for example, the Xilinx TTC timer driver had a faulty prescaler calculation routine. As this source file is already in the main repository, this might be a good exercise for a pull request. Until then, I'd appreciate any feedback if anyone feels like experimenting with my fork of the repository.

Best regards,
Immo


Re: ARMv7 Cortex-A port for Xilinx Zynq7000

Immo Birnbaum
 

Hi all,

here's my first update on the topic of the Zynq-7000 port, this is the progress so far:

- Set up a fresh development VM which now uses the Zephyr SDK, which works fine for the Cortex-A9.
- Forked the Zephyr repository and set up a feature branch, which can be found here: https://github.com/ibirnbaum/zephyr/tree/armv7_cortex_a
- Merged all of the changes/additions described above into the current code base.
- Updated the AXI GPIO driver to match the GPIO driver API which was heavily modified in the meantime.
- Kicked out my own GIC PL-390 interrupt controller driver and switched over to Stephanos Ionannidis' GICv1 implementation, including updated IRQ descriptors in the device tree files.
- I looked into the testsuite and ran tests on the QEMU Cortex-A9 target, plus a hand full of test cases on the actual hardware (as downloading the binary to the board is still a manual process using the Lauterbach TRACE software). The results don't look too bad, for example, these are the results of the 'kernel' test suite:
* 86 test configurations selected, 8 configurations discarded due to filters
* 24 tests skipped (e.g. SMP/ARMv8/userspace related test cases)
* Out of the 62 remaining test cases, 60 pass. One (kernel.timer.tickless) fails to build due to an unresolved symbol (z_clock_uptime). This is odd for two reasons: one, all other 'tickless'-related tests are skipped and two, the Local APIC timer driver seems to be the only timer driver implementing this function. To me, this looks more like a testsuite configuration issue? The other failure is the arch.interrupt test case, which actually runs but fails due to an assertion regarding the expected state of an IRQ to be tested. This is due to the target IRQ selection logic only being implemented for Cortex-M when it comes to the ARM architecture.
The following testsuites pass all test cases on the QEMU target which aren't filtered out for whatever reason (I didn't blacklist anything myself):
- lib
- misc
- portability
- posix
- shell
- subsys
- ztest
I'll have to look into the details as to why in some cases, more test cases are filtered out than executed. In some cases, e.g. ARMv8-specific stuff, it's pretty obvious, but in others I'm suspecting that I ought to whitelist testcases or subsystems for testing, likely in the target's YAML files? For example, despite having full Ethernet support, the 'net' testsuite in its current state does pretty much nothing.

I'll keep you updated and I'll look into the ongoing discussions and the mechanics of pull requests, I could start simple, as for example, the Xilinx TTC timer driver had a faulty prescaler calculation routine. As this source file is already in the main repository, this might be a good exercise for a pull request. Until then, I'd appreciate any feedback if anyone feels like experimenting with my fork of the repository.

Best regards,
Immo


Re: How to use DTLS with offloaded socket if the underlying modem does not support DTLS

Jukka Rissanen
 

Hi Holger,

one option is use the generic GSM modem, which uses PPP to connect to
modem, instead of offloading the IP stack to the modem. In that case
one can send DTLS data via the modem. Unfortunately the modem you
mentioned (Quectel BC68) does not seem to support PPP mode.

Cheers,
Jukka

On Wed, 2020-02-26 at 02:04 -0800, Holger Gräf wrote:
Hi Billy,

thanks for the reply. I still have to clean up the driver a bit, then
I will create the PR.

With regard to the second message, thanks for the hint. I have
already stumbled upon these commands, but according to the manual
they are specific to Huawei's IoT platform, which I don't use. I have
the impression that it's based on LwM2M, but I would like to be able
to use DTLS encryption regardless of the protocol I use (UDP, TCP or
the higher level COAPS or LwM2M).

That's why I'm looking for a way to use Zephyr's mbedtls with my
offloaded sockets. Any help would be very much appreciated :-)

All the best,

Holger


Re: How to use DTLS with offloaded socket if the underlying modem does not support DTLS

Holger Gräf
 

Hi Billy,

thanks for the reply. I still have to clean up the driver a bit, then I will create the PR.

With regard to the second message, thanks for the hint. I have already stumbled upon these commands, but according to the manual they are specific to Huawei's IoT platform, which I don't use. I have the impression that it's based on LwM2M, but I would like to be able to use DTLS encryption regardless of the protocol I use (UDP, TCP or the higher level COAPS or LwM2M).

That's why I'm looking for a way to use Zephyr's mbedtls with my offloaded sockets. Any help would be very much appreciated :-)

All the best,

Holger


Zephyr 2.2.0-rc2 tagged

Johan Hedberg
 

Hi Zephyr developers,

We have now tagged the second release candidate for Zephyr 2.2: 2.2.0-rc2.

We’re currently at 0 high priority bugs and 21 medium priority bugs. This is already close to the requirements for rc3 and the final release, which are 0 and 20 respectively.

Developers are requested to continue testing the release, filing bugs, and addressing any remaining bugs that are assigned to you. I would also encourage subsystem owners to take a look at their respective sections in doc/releases/release-notes-2.2.rst and submit updates in case your subsystem is still missing a change summary since the last release.

Looking at the original release schedule, it seems likely that we’ll need to push the final release from the end of this week to some time next week - we will discuss this in this week’s TSC call.

The full release log for 2.2.0-rc2 can be found here:
https://github.com/zephyrproject-rtos/zephyr/releases/tag/v2.2.0-rc2

More details about Zephyr releases is found here:
https://github.com/zephyrproject-rtos/zephyr/wiki/Program-Management

Thanks to everybody who has contributed to this release!

Johan


Re: How do I get to know about plans on on-going or future features?

Carles Cufi
 

Hi Alex,

 

Thanks for your interest in Zephyr.

I think you should begin by defining an area you want to contribute in: kernel, filesystems, drivers, protocol stacks, etc.

In order to find out which features are missing I think one good way is to look through the “Enhancements” and “Feature Requests” GitHub issues:

 

Enhancements:

https://github.com/zephyrproject-rtos/zephyr/issues?q=is%3Aissue+is%3Aopen+label%3Aenhancement

 

Feature Requests:

https://github.com/zephyrproject-rtos/zephyr/issues?q=is%3Aissue+is%3Aopen+label%3A%22feature+request%22

 

Once you define the area you want to contribute in, you can combine the above labels with an area label and browse through the issues.

As soon as you find an issue you would like to work on, you can then write on the mailing list asking if there is someone else planning to work or working already on it.

 

Another category that might be of interest to you is the “Good first issue”, which we have tried to use for issues that are not overly complicated and that can serve as a starting point to someone like you looking to become a contributor:

https://github.com/zephyrproject-rtos/zephyr/issues?utf8=%E2%9C%93&q=is%3Aissue+is%3Aopen++label%3A%22Good+first+issue%22+

 

Thanks,

 

Carles

 

From: devel@... <devel@...> On Behalf Of Alexander Syvak via Lists.Zephyrproject.Org
Sent: 24 February 2020 14:11
To: devel@...
Cc: devel@...
Subject: [Zephyr-devel] How do I get to know about plans on on-going or future features?

 

Hi!

 

I am new to Zephyr projet, and I'd like to contribute.

 

There are many features had been implemented by the moment.

There are features are being implemented at the moment.

Finally, there are features to be implemented.

 

How do I know about the last two groups of features? About plans on them?

 

Where do I start?

 

Regards,

Alex.