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
4544static int8_t ws_eapol_auth_relay_socket_pdu_receive (const ns_address_t * src_addr , void * data , uint16_t len );
4645static 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-
5447int8_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
130122static 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 */
0 commit comments