added LLSEC attributes form packetbuf to uipbuf when receiving IP packet, and a few other minor fixes

This commit is contained in:
Joakim Eriksson 2018-10-30 13:38:16 +01:00
parent 008cffe81a
commit 42dfc81af2
7 changed files with 31 additions and 20 deletions

View File

@ -59,7 +59,8 @@ PROCESS_THREAD(udp_client_process, ev, data)
LOG_INFO("Sending request %u to ", count); LOG_INFO("Sending request %u to ", count);
LOG_INFO_6ADDR(&dest_ipaddr); LOG_INFO_6ADDR(&dest_ipaddr);
LOG_INFO_("\n"); LOG_INFO_("\n");
snprintf(str, sizeof(str), "hello %d", count); /* avoid the risk of not fitting the '\0' in the string */
snprintf(str, sizeof(str) - 1, "hello %d", count);
simple_udp_sendto(&udp_conn, str, strlen(str), &dest_ipaddr); simple_udp_sendto(&udp_conn, str, strlen(str), &dest_ipaddr);
count++; count++;
} else { } else {

View File

@ -2012,6 +2012,19 @@ input(void)
callback->input_callback(); callback->input_callback();
} }
#if LLSEC802154_USES_AUX_HEADER
/*
* Assuming that the last packet in packetbuf is containing
* the LLSEC state so that it can be copied to uipbuf.
*/
uipbuf_set_attr(UIPBUF_ATTR_LLSEC_LEVEL,
packetbuf_attr(PACKETBUF_ATTR_SECURITY_LEVEL));
#if LLSEC802154_USES_EXPLICIT_KEYS
uipbuf_set_attr(UIPBUF_ATTR_LLSEC_KEY_ID,
packetbuf_attr(PACKETBUF_ATTR_KEY_INDEX));
#endif /* LLSEC802154_USES_EXPLICIT_KEYS */
#endif /* LLSEC802154_USES_AUX_HEADER */
tcpip_input(); tcpip_input();
#if SICSLOWPAN_CONF_FRAG #if SICSLOWPAN_CONF_FRAG
} }

View File

@ -171,11 +171,9 @@ send_one_packet(void *ptr)
packetbuf_set_attr(PACKETBUF_ATTR_MAC_ACK, 1); packetbuf_set_attr(PACKETBUF_ATTR_MAC_ACK, 1);
#if LLSEC802154_ENABLED #if LLSEC802154_ENABLED
/* These should possibly be taken from upper layers in the future */
packetbuf_set_attr(PACKETBUF_ATTR_SECURITY_LEVEL, CSMA_LLSEC_SECURITY_LEVEL);
#if LLSEC802154_USES_EXPLICIT_KEYS #if LLSEC802154_USES_EXPLICIT_KEYS
/* This should possibly be taken from upper layers in the future */
packetbuf_set_attr(PACKETBUF_ATTR_KEY_ID_MODE, CSMA_LLSEC_KEY_ID_MODE); packetbuf_set_attr(PACKETBUF_ATTR_KEY_ID_MODE, CSMA_LLSEC_KEY_ID_MODE);
packetbuf_set_attr(PACKETBUF_ATTR_KEY_INDEX, CSMA_LLSEC_KEY_INDEX);
#endif /* LLSEC802154_USES_EXPLICIT_KEYS */ #endif /* LLSEC802154_USES_EXPLICIT_KEYS */
#endif /* LLSEC802154_ENABLED */ #endif /* LLSEC802154_ENABLED */

View File

@ -88,12 +88,14 @@ typedef struct {
static aes_key_t keys[CSMA_LLSEC_MAXKEYS]; static aes_key_t keys[CSMA_LLSEC_MAXKEYS];
/* assumed to be 16 bytes */ /* assumed to be 16 bytes */
void int
csma_security_set_key(uint8_t index, uint8_t *key) csma_security_set_key(uint8_t index, const uint8_t *key)
{ {
if(key != NULL && index < CSMA_LLSEC_MAXKEYS) { if(key != NULL && index < CSMA_LLSEC_MAXKEYS) {
memcpy(keys[index].u8, key, 16); memcpy(keys[index].u8, key, 16);
return 1;
} }
return 0;
} }
#define N_KEYS (sizeof(keys) / sizeof(aes_key)) #define N_KEYS (sizeof(keys) / sizeof(aes_key))
@ -116,7 +118,7 @@ aead(uint8_t hdrlen, int forward)
uint8_t with_encryption; uint8_t with_encryption;
key_index = LLSEC_KEY_INDEX; key_index = LLSEC_KEY_INDEX;
if(key_index > CSMA_LLSEC_MAXKEYS) { if(key_index >= CSMA_LLSEC_MAXKEYS) {
LOG_ERR("Key not available: %u\n", key_index); LOG_ERR("Key not available: %u\n", key_index);
return 0; return 0;
} }
@ -197,8 +199,8 @@ csma_security_create_frame(void)
LOG_INFO_LLADDR(packetbuf_addr(PACKETBUF_ADDR_SENDER)); LOG_INFO_LLADDR(packetbuf_addr(PACKETBUF_ADDR_SENDER));
LOG_INFO_(" "); LOG_INFO_(" ");
LOG_INFO_LLADDR(packetbuf_addr(PACKETBUF_ADDR_RECEIVER)); LOG_INFO_LLADDR(packetbuf_addr(PACKETBUF_ADDR_RECEIVER));
LOG_INFO_(" %u (%u) KEY:0x%02x\n", packetbuf_datalen(), packetbuf_totlen(), LOG_INFO_(" %u (%u) LV:%d, KEY:0x%02x\n", packetbuf_datalen(), packetbuf_totlen(),
LLSEC_KEY_INDEX); packetbuf_attr(PACKETBUF_ATTR_SECURITY_LEVEL), LLSEC_KEY_INDEX);
#if LOG_LEVEL == LOG_LEVEL_DBG #if LOG_LEVEL == LOG_LEVEL_DBG
LOG_DBG(" Payload after: (%d)", packetbuf_totlen()); LOG_DBG(" Payload after: (%d)", packetbuf_totlen());

View File

@ -71,6 +71,4 @@
#define CSMA_LLSEC_MAXKEYS 1 #define CSMA_LLSEC_MAXKEYS 1
#endif #endif
void csma_security_set_key(uint8_t index, uint8_t *key);
#endif /* CSMA_SECURITY_H_ */ #endif /* CSMA_SECURITY_H_ */

View File

@ -83,7 +83,7 @@ int csma_security_create_frame(void);
int csma_security_parse_frame(void); int csma_security_parse_frame(void);
/* key management for CSMA */ /* key management for CSMA */
void csma_security_set_key(uint8_t index, uint8_t *key); int csma_security_set_key(uint8_t index, const uint8_t *key);
#endif /* CSMA_H_ */ #endif /* CSMA_H_ */

View File

@ -55,6 +55,9 @@
#if MAC_CONF_WITH_TSCH #if MAC_CONF_WITH_TSCH
#include "net/mac/tsch/tsch.h" #include "net/mac/tsch/tsch.h"
#endif /* MAC_CONF_WITH_TSCH */ #endif /* MAC_CONF_WITH_TSCH */
#if MAC_CONF_WITH_CSMA
#include "net/mac/csma/csma.h"
#endif
#include "net/routing/routing.h" #include "net/routing/routing.h"
#include "net/mac/llsec802154.h" #include "net/mac/llsec802154.h"
@ -424,7 +427,7 @@ PT_THREAD(cmd_rpl_global_repair(struct pt *pt, shell_output_func output, char *a
{ {
PT_BEGIN(pt); PT_BEGIN(pt);
SHELL_OUTPUT(output, "Triggering routing global repair\n") SHELL_OUTPUT(output, "Triggering routing global repair\n");
NETSTACK_ROUTING.global_repair("Shell"); NETSTACK_ROUTING.global_repair("Shell");
PT_END(pt); PT_END(pt);
@ -447,7 +450,7 @@ PT_THREAD(cmd_rpl_refresh_routes(struct pt *pt, shell_output_func output, char *
{ {
PT_BEGIN(pt); PT_BEGIN(pt);
SHELL_OUTPUT(output, "Triggering routes refresh\n") SHELL_OUTPUT(output, "Triggering routes refresh\n");
rpl_refresh_routes("Shell"); rpl_refresh_routes("Shell");
PT_END(pt); PT_END(pt);
@ -733,12 +736,9 @@ PT_THREAD(cmd_6top(struct pt *pt, shell_output_func output, char *args))
static static
PT_THREAD(cmd_llsec_setlv(struct pt *pt, shell_output_func output, char *args)) PT_THREAD(cmd_llsec_setlv(struct pt *pt, shell_output_func output, char *args))
{ {
char *next_args;
PT_BEGIN(pt); PT_BEGIN(pt);
SHELL_ARGS_INIT(args, next_args);
if(args == NULL) { if(args == NULL) {
SHELL_OUTPUT(output, "Default LLSEC level is %d\n", SHELL_OUTPUT(output, "Default LLSEC level is %d\n",
uipbuf_get_attr(UIPBUF_ATTR_LLSEC_LEVEL)); uipbuf_get_attr(UIPBUF_ATTR_LLSEC_LEVEL));
@ -754,7 +754,6 @@ PT_THREAD(cmd_llsec_setlv(struct pt *pt, shell_output_func output, char *args))
SHELL_OUTPUT(output, "LLSEC default level set %d\n", lv); SHELL_OUTPUT(output, "LLSEC default level set %d\n", lv);
} }
} }
SHELL_ARGS_NEXT(args, next_args);
PT_END(pt); PT_END(pt);
} }
@ -775,7 +774,7 @@ PT_THREAD(cmd_llsec_setkey(struct pt *pt, shell_output_func output, char *args))
int key; int key;
SHELL_ARGS_NEXT(args, next_args); SHELL_ARGS_NEXT(args, next_args);
key = atoi(args); key = atoi(args);
if(key < 0 || key > 16) { if(key < 0) {
SHELL_OUTPUT(output, "Illegal LLSEC Key index %d\n", key); SHELL_OUTPUT(output, "Illegal LLSEC Key index %d\n", key);
PT_EXIT(pt); PT_EXIT(pt);
} else { } else {
@ -783,7 +782,7 @@ PT_THREAD(cmd_llsec_setkey(struct pt *pt, shell_output_func output, char *args))
/* Get next arg (key-string) */ /* Get next arg (key-string) */
SHELL_ARGS_NEXT(args, next_args); SHELL_ARGS_NEXT(args, next_args);
if(args != NULL && strlen(args) == 16) { if(args != NULL && strlen(args) == 16) {
csma_security_set_key(key, (uint8_t *) args); csma_security_set_key(key, (const uint8_t *) args);
SHELL_OUTPUT(output, "Set key for index %d\n", key); SHELL_OUTPUT(output, "Set key for index %d\n", key);
} else { } else {
SHELL_OUTPUT(output, "Wrong length of key: '%s' (%d)\n", args, strlen(args)); SHELL_OUTPUT(output, "Wrong length of key: '%s' (%d)\n", args, strlen(args));