Skip to content

Commit 782f3fb

Browse files
Juha HeiskanenMika Leppänen
authored andcommitted
Relay message flow optimization
Service and KMP store now header size which is allocated for message relay purpose Socket send message API is enabled which reduce temporary memory allocation. MPX send store now 2 pointer: data pointer which is used at send and buffer which can be freed.
1 parent bbd6ee1 commit 782f3fb

15 files changed

+136
-182
lines changed

source/6LoWPAN/ws/ws_eapol_auth_relay.c

Lines changed: 48 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -34,8 +34,7 @@
3434
#include "6LoWPAN/ws/ws_eapol_pdu.h"
3535
#include "6LoWPAN/ws/ws_eapol_relay.h"
3636
#include "6LoWPAN/ws/ws_eapol_auth_relay.h"
37-
#include "Security/kmp/kmp_socket_api.h"
38-
37+
#include "common_functions.h"
3938
#ifdef HAVE_WS
4039

4140
#define TRACE_GROUP "wspsu"
@@ -45,12 +44,6 @@ static int8_t ws_eapol_auth_relay_eapol_pdu_receive(const uint8_t *eui_64, const
4544
static int8_t ws_eapol_auth_relay_socket_pdu_receive(const ns_address_t *src_addr, void *data, uint16_t len);
4645
static int8_t ws_eapol_auth_relay_send_to_kmp(const uint8_t *eui_64, const uint8_t *ip_addr, uint16_t port, const void *data, uint16_t data_len);
4746

48-
// Wi-Sun EAPOL relay UDP data format
49-
typedef struct {
50-
uint8_t eui_64[8]; /**< Supplicant EUI-64 */
51-
uint8_t kmp_id; /**< KMP id */
52-
} eapol_relay_udp_pdu_t;
53-
5447
int8_t ws_eapol_auth_relay_init(protocol_interface_info_entry_t *interface_ptr)
5548
{
5649
ws_eapol_relay_init(interface_ptr);
@@ -93,64 +86,76 @@ static int8_t ws_eapol_auth_relay_socket_pdu_receive(const ns_address_t *src_add
9386

9487
// KMP message from source port 10254
9588
if (src_addr->identifier == 10254) {
96-
kmp_udp_pdu_t *pdu = data;
97-
uint16_t data_len = len - sizeof(kmp_udp_pdu_t) + 2 * sizeof(uint8_t);
98-
89+
uint8_t *ptr = data;
90+
uint8_t *relay_ip_addr, *eui_64;
91+
uint16_t relay_port;
92+
relay_ip_addr = ptr;
93+
ptr += 16;
94+
relay_port = common_read_16_bit(ptr);
95+
ptr += 2;
96+
eui_64 = ptr;
97+
ptr += 8;
98+
uint16_t data_len = len - 26;
9999
// KMP protocol to relay -> packet with IP relay address -> to IP relay of node
100-
if (memcmp(pdu->relay_ip_addr, ADDR_UNSPECIFIED, 16) != 0) {
101-
res = ws_eapol_relay_send_to_relay(pdu->eui_64, pdu->relay_ip_addr, pdu->relay_port,
102-
&pdu->kmp_id, data_len);
103-
ns_dyn_mem_free(pdu);
100+
if (memcmp(relay_ip_addr, ADDR_UNSPECIFIED, 16) != 0) {
101+
res = ws_eapol_relay_send_to_relay(eui_64, relay_ip_addr, relay_port,
102+
ptr, data_len);
103+
ns_dyn_mem_free(data);
104104

105105
// KMP protocol to relay -> no IP relay address -> to MPX
106106
} else {
107-
void *eapol_pdu = ns_dyn_mem_temporary_alloc(data_len);
108-
if (!eapol_pdu) {
109-
ns_dyn_mem_free(pdu);
110-
return -1;
111-
}
112-
memcpy(eapol_pdu, &pdu->kmp_id, data_len);
113-
114-
res = ws_eapol_pdu_send_to_mpx(pdu->eui_64, eapol_pdu, data_len);
115-
ns_dyn_mem_free(pdu);
107+
res = ws_eapol_pdu_send_to_mpx(eui_64, ptr, data_len, data);
116108
}
117109

110+
118111
// Other source port (either 10253 or node relay source port)
119112
} else {
120-
eapol_relay_udp_pdu_t *pdu = data;
121-
uint16_t data_len = len - sizeof(eapol_relay_udp_pdu_t) + sizeof(uint8_t);
122-
res = ws_eapol_auth_relay_send_to_kmp(pdu->eui_64, src_addr->address, src_addr->identifier,
123-
&pdu->kmp_id, data_len);
124-
ns_dyn_mem_free(pdu);
113+
uint8_t *ptr = data;
114+
res = ws_eapol_auth_relay_send_to_kmp(ptr, src_addr->address, src_addr->identifier,
115+
ptr + 8, len -8);
116+
ns_dyn_mem_free(data);
125117
}
126118

127119
return res;
128120
}
129121

130122
static int8_t ws_eapol_auth_relay_send_to_kmp(const uint8_t *eui_64, const uint8_t *ip_addr, uint16_t port, const void *data, uint16_t data_len)
131123
{
132-
uint16_t pdu_len = data_len + sizeof(kmp_udp_pdu_t) - 2 * sizeof(uint8_t);
133-
kmp_udp_pdu_t *pdu = ns_dyn_mem_temporary_alloc(pdu_len);
134-
if (!pdu) {
135-
return -1;
136-
}
137124

138-
memcpy(pdu->relay_ip_addr, ip_addr, 16);
139-
pdu->relay_port = port;
140-
141-
memcpy(&pdu->eui_64[0], eui_64, 8);
142-
memcpy(&pdu->kmp_id, data, data_len);
143125

144126
ns_address_t dest_addr;
145127
if (ws_eapol_relay_kmp_ll_address_get(&dest_addr) < 0) {
146-
ns_dyn_mem_free(pdu);
147128
return -1;
148129
}
149130

150-
ws_eapol_relay_socket_pdu_send(&dest_addr, pdu, pdu_len);
151-
ns_dyn_mem_free(pdu);
152131

153-
return 0;
132+
int8_t socket_id = ws_eapol_relay_socket_id_get();
133+
if (socket_id >= 0) {
134+
uint8_t temp_array[26];
135+
ns_iovec_t msg_iov[2];
136+
ns_msghdr_t msghdr;
137+
//Set messages name buffer
138+
msghdr.msg_name = &dest_addr;
139+
msghdr.msg_namelen = sizeof(dest_addr);
140+
msghdr.msg_iov = &msg_iov[0];
141+
msghdr.msg_iovlen = 2;
142+
msghdr.msg_control = NULL;
143+
msghdr.msg_controllen = 0;
144+
uint8_t *ptr = temp_array;
145+
memcpy(ptr, ip_addr, 16);
146+
ptr += 16;
147+
ptr = common_write_16_bit(port, ptr);
148+
memcpy(ptr, eui_64, 8);
149+
msg_iov[0].iov_base = temp_array;
150+
msg_iov[0].iov_len = 26;
151+
msg_iov[1].iov_base = (void*)data;
152+
msg_iov[1].iov_len = data_len;
153+
socket_sendmsg(socket_id, &msghdr, NS_MSG_LEGACY0);
154+
return 0;
155+
156+
}
157+
158+
return -1;
154159
}
155160

156161
#endif /* HAVE_WS */

source/6LoWPAN/ws/ws_eapol_pdu.c

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ static void ws_eapol_pdu_data_request_primitiv_set(mcps_data_req_t *dataReq, pro
4343
typedef struct {
4444
uint8_t handle;
4545
void *data_ptr;
46+
void *buffer;
4647
ns_list_link_t link;
4748
} eapol_pdu_msdu_entry_t;
4849

@@ -110,17 +111,18 @@ int8_t ws_eapol_pdu_cb_register(eapol_pdu_recv_cb_data_t *cb_data)
110111
return 0;
111112
}
112113

113-
int8_t ws_eapol_pdu_send_to_mpx(const uint8_t *eui_64, void *data, uint16_t data_len)
114+
int8_t ws_eapol_pdu_send_to_mpx(const uint8_t *eui_64, void *data, uint16_t data_len, void *buffer)
114115
{
115116
mcps_data_req_t data_request;
116117
ws_eapol_pdu_data_request_primitiv_set(&data_request, eapol_pdu_data->interface_ptr);
117118

118119
eapol_pdu_msdu_entry_t *msdu_entry = ns_dyn_mem_temporary_alloc(sizeof(eapol_pdu_msdu_entry_t));
119120
if (!msdu_entry) {
120-
ns_dyn_mem_free(data);
121+
ns_dyn_mem_free(buffer);
121122
return -1;
122123
}
123124
msdu_entry->data_ptr = data;
125+
msdu_entry->buffer = buffer;
124126
msdu_entry->handle = eapol_pdu_data->msdu_handle++;
125127
ns_list_add_to_start(&eapol_pdu_data->msdu_list, msdu_entry);
126128

@@ -164,7 +166,7 @@ static void ws_eapol_pdu_mpx_data_confirm(const mpx_api_t* api, const struct mcp
164166

165167
ns_list_foreach(eapol_pdu_msdu_entry_t, msdu, &eapol_pdu_data->msdu_list) {
166168
if (msdu->handle == data->msduHandle) {
167-
ns_dyn_mem_free(msdu->data_ptr);
169+
ns_dyn_mem_free(msdu->buffer);
168170
ns_list_remove(&eapol_pdu_data->msdu_list, msdu);
169171
ns_dyn_mem_free(msdu);
170172
return;

source/6LoWPAN/ws/ws_eapol_pdu.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ typedef int8_t ws_eapol_pdu_address_check(const uint8_t *eui_64);
2424

2525
typedef int8_t ws_eapol_pdu_receive(const uint8_t *eui_64, const void *pdu, uint16_t size);
2626

27-
int8_t ws_eapol_pdu_send_to_mpx(const uint8_t *eui_64, void *data, uint16_t data_len);
27+
int8_t ws_eapol_pdu_send_to_mpx(const uint8_t *eui_64, void *data, uint16_t data_len, void *buffer);
2828

2929
typedef enum {
3030
EAPOL_PDU_RECV_HIGH_PRIORITY = 0,

source/6LoWPAN/ws/ws_eapol_relay.c

Lines changed: 23 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -36,20 +36,13 @@
3636
#include "6LoWPAN/ws/ws_config.h"
3737
#include "6LoWPAN/ws/ws_eapol_pdu.h"
3838
#include "6LoWPAN/ws/ws_eapol_relay.h"
39-
#include "Security/kmp/kmp_socket_api.h"
4039

4140
#ifdef HAVE_WS
4241

4342
#define TRACE_GROUP "wserel"
4443

4544
static void ws_eapol_relay_socket_cb(void *ptr);
4645

47-
// Wi-Sun EAPOL relay UDP data format
48-
typedef struct {
49-
uint8_t eui_64[8]; /**< Supplicant EUI-64 */
50-
uint8_t kmp_id; /**< KMP id */
51-
} eapol_relay_udp_pdu_t;
52-
5346
typedef struct {
5447
ws_eapol_relay_socket_pdu_receive *sock_pdu_recv; /**< Socket pdu receive callback */
5548
protocol_interface_info_entry_t *interface_ptr; /**< Interface pointer */
@@ -105,22 +98,26 @@ int8_t ws_eapol_relay_border_router_addr_get(uint8_t *addr)
10598

10699
int8_t ws_eapol_relay_send_to_relay(const uint8_t *eui_64, const uint8_t *ip_addr, uint16_t port, const void *data, uint16_t data_len)
107100
{
108-
uint16_t pdu_len = data_len + sizeof(eapol_relay_udp_pdu_t) - sizeof(uint8_t);
109-
eapol_relay_udp_pdu_t *pdu = ns_dyn_mem_temporary_alloc(pdu_len);
110-
if (!pdu) {
111-
return -1;
112-
}
113-
memcpy(pdu->eui_64, eui_64, 8);
114-
memcpy(&pdu->kmp_id, data, data_len);
115101

116102
ns_address_t dest_addr;
117103
dest_addr.type = ADDRESS_IPV6;
118104
dest_addr.identifier = port;
119105
memcpy(&dest_addr.address[0], ip_addr, 16);
120106

121-
socket_sendto(eapol_relay_data->relay_socket_id , &dest_addr, pdu, pdu_len);
122-
ns_dyn_mem_free(pdu);
123-
107+
ns_iovec_t msg_iov[2];
108+
ns_msghdr_t msghdr;
109+
//Set messages name buffer
110+
msghdr.msg_name = &dest_addr;
111+
msghdr.msg_namelen = sizeof(dest_addr);
112+
msghdr.msg_iov = &msg_iov[0];
113+
msghdr.msg_iovlen = 2;
114+
msghdr.msg_control = NULL;
115+
msghdr.msg_controllen = 0;
116+
msg_iov[0].iov_base = (void*)eui_64;
117+
msg_iov[0].iov_len = 8;
118+
msg_iov[1].iov_base = (void*)data;
119+
msg_iov[1].iov_len = data_len;
120+
socket_sendmsg(eapol_relay_data->relay_socket_id, &msghdr, NS_MSG_LEGACY0);
124121
return 0;
125122
}
126123

@@ -147,6 +144,15 @@ int8_t ws_eapol_relay_socket_pdu_send(const ns_address_t *addr, const void *data
147144
return 0;
148145
}
149146

147+
int8_t ws_eapol_relay_socket_id_get(void)
148+
{
149+
if (!eapol_relay_data) {
150+
return -1;
151+
}
152+
153+
return eapol_relay_data->relay_socket_id;
154+
}
155+
150156
static void ws_eapol_relay_socket_cb(void *cb)
151157
{
152158
if (!eapol_relay_data || !eapol_relay_data->sock_pdu_recv) {

source/6LoWPAN/ws/ws_eapol_relay.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ int8_t ws_eapol_relay_cb_register(ws_eapol_relay_socket_pdu_receive *sock_pdu_re
2626
int8_t ws_eapol_relay_border_router_addr_get(uint8_t *addr);
2727
int8_t ws_eapol_relay_kmp_ll_address_get(ns_address_t *addr);
2828
int8_t ws_eapol_relay_socket_pdu_send(const ns_address_t *addr, const void *data, uint16_t len);
29+
int8_t ws_eapol_relay_socket_id_get(void);
2930

3031
int8_t ws_eapol_relay_send_to_relay(const uint8_t *eui_64, const uint8_t *ip_addr, uint16_t port, const void *data, uint16_t data_len);
3132

source/6LoWPAN/ws/ws_eapol_supp_relay.c

Lines changed: 3 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,6 @@
3434
#include "6LoWPAN/ws/ws_eapol_pdu.h"
3535
#include "6LoWPAN/ws/ws_eapol_relay.h"
3636
#include "6LoWPAN/ws/ws_eapol_supp_relay.h"
37-
#include "Security/kmp/kmp_socket_api.h"
3837

3938
#ifdef HAVE_WS
4039

@@ -44,12 +43,6 @@ static int8_t ws_eapol_supp_relay_eapol_pdu_address_check(const uint8_t *eui_64)
4443
static int8_t ws_eapol_supp_relay_eapol_pdu_receive(const uint8_t *eui_64, const void *pdu, uint16_t size);
4544
static int8_t ws_eapol_supp_relay_socket_pdu_receive(const ns_address_t *src_addr, void *data, uint16_t len);
4645

47-
// Wi-Sun EAPOL relay UDP data format
48-
typedef struct {
49-
uint8_t eui_64[8]; /**< Supplicant EUI-64 */
50-
uint8_t kmp_id; /**< KMP id */
51-
} eapol_relay_udp_pdu_t;
52-
5346
static ws_eapol_supp_relay_address_get *br_relay_addr_get;
5447

5548
int8_t ws_eapol_supp_relay_init(protocol_interface_info_entry_t *interface_ptr)
@@ -119,20 +112,10 @@ static int8_t ws_eapol_supp_relay_socket_pdu_receive(const ns_address_t *src_add
119112
{
120113
(void) src_addr;
121114

122-
eapol_relay_udp_pdu_t *pdu = data;
123-
uint16_t data_len = len - sizeof(eapol_relay_udp_pdu_t) + sizeof(uint8_t);
124-
125-
void *eapol_pdu = ns_dyn_mem_temporary_alloc(data_len);
126-
if (!eapol_pdu) {
127-
ns_dyn_mem_free(data);
128-
return -1;
129-
}
130-
131-
memcpy(eapol_pdu, &pdu->kmp_id, data_len);
132-
ws_eapol_pdu_send_to_mpx(pdu->eui_64, eapol_pdu, data_len);
115+
uint8_t *pdu = data;
116+
//First 8 byte is EUID64 and rsr payload
117+
return ws_eapol_pdu_send_to_mpx(pdu, pdu + 8, len - 8, data);
133118

134-
ns_dyn_mem_free(data);
135-
return 0;
136119
}
137120

138121
#endif /* HAVE_WS */

source/6LoWPAN/ws/ws_pae_auth.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,7 @@ void ws_pae_auth_init(protocol_interface_info_entry_t *interface_ptr)
125125

126126
kmp_socket_if_init(interface_ptr);
127127

128-
kmp_service_init(interface_ptr);
128+
kmp_service_init(interface_ptr, 27);
129129
kmp_service_cb_register(ws_pae_auth_kmp_incoming_ind, kmp_socket_if_send);
130130
}
131131

source/6LoWPAN/ws/ws_pae_supp.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,7 @@ int8_t ws_pae_supp_init(protocol_interface_info_entry_t *interface_ptr)
108108
return -1;
109109
}
110110

111-
if (kmp_service_init(interface_ptr) < 0) {
111+
if (kmp_service_init(interface_ptr, 1) < 0) {
112112
return -1;
113113
}
114114

source/Security/kmp/key_sec_prot.c

Lines changed: 4 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -85,17 +85,12 @@ static void key_sec_prot_create_request(sec_prot_t *prot, sec_prot_keys_t *sec_k
8585
key_sec_prot_int_t *data = key_sec_prot_get(prot);
8686
(void) sec_keys;
8787

88-
uint8_t kmpid_test[22];
89-
kmpid_test[0] = 0xdd;
90-
kmpid_test[1] = 20;
91-
common_write_24_bit(0x0C5A9E, &kmpid_test[2]);
92-
kmpid_test[5] = 1;
9388

9489
eapol_pdu_t eapol_pdu;
9590

96-
uint16_t eapol_pdu_size = eapol_pdu_key_frame_init(&eapol_pdu, 22, kmpid_test);
91+
uint16_t eapol_pdu_size = eapol_pdu_key_frame_init(&eapol_pdu, 0, NULL);
9792

98-
uint8_t *eapol_decoded_data = ns_dyn_mem_temporary_alloc(eapol_pdu_size); // In future fill with data that defines eapol message
93+
uint8_t *eapol_decoded_data = ns_dyn_mem_temporary_alloc(eapol_pdu_size + prot->header_size); // In future fill with data that defines eapol message
9994

10095

10196
if (!eapol_decoded_data) {
@@ -106,9 +101,9 @@ static void key_sec_prot_create_request(sec_prot_t *prot, sec_prot_keys_t *sec_k
106101
eapol_pdu.msg.key.key_information.pairwise_key = true;
107102
eapol_pdu.msg.key.replay_counter = 10;
108103
eapol_pdu.msg.key.key_length = 32;
109-
eapol_write_pdu_frame(eapol_decoded_data, &eapol_pdu);
104+
eapol_write_pdu_frame(eapol_decoded_data+prot->header_size, &eapol_pdu);
110105

111-
if (prot->send(prot, eapol_decoded_data, eapol_pdu_size) < 0) {
106+
if (prot->send(prot, eapol_decoded_data, eapol_pdu_size + prot->header_size) < 0) {
112107
data->result = SEC_RESULT_ERR_NO_MEM;
113108
}
114109
}
@@ -130,12 +125,10 @@ static int8_t key_sec_prot_receive(sec_prot_t *prot, void *pdu, uint16_t size)
130125
eapol_pdu_t eapol_pdu;
131126
// Decoding is successful
132127
if (eapol_parse_pdu_header(pdu, size, &eapol_pdu)) {
133-
ns_dyn_mem_free(pdu);
134128
prot->create_ind(prot);
135129
return 0;
136130
} else {
137131
// No error handling yet, indicate just that ready to be deleted
138-
ns_dyn_mem_free(pdu);
139132
prot->finished(prot);
140133
return -1;
141134
}

0 commit comments

Comments
 (0)