Skip to content

Commit 564d3fe

Browse files
author
Tero Heinonen
authored
Added filter callback for MLE messages (#1638)
Added test API to set callback to filter received MLE messages.
1 parent 9f85599 commit 564d3fe

File tree

5 files changed

+59
-1
lines changed

5 files changed

+59
-1
lines changed

nanostack/net_test_api.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
#define NET_TEST_API_H_
2525

2626
#include "ns_types.h"
27+
#include "Service_Libs/mle_service/mle_service_api.h"
2728

2829
/**
2930
* \brief Makes TCP protocol drop given number of packets from a particular state (TX side).
@@ -56,4 +57,11 @@ int8_t arm_nwk_test_tcp_drop_rx(int state, uint8_t count);
5657
*/
5758
void arm_nwk_test_tcp_drop_reset(void);
5859

60+
/**
61+
* \brief Set callback for MLE message receiving filter.
62+
*
63+
* Testing API for setting MLE receive callback for message filtering purposes.
64+
*/
65+
void arm_nwk_test_mle_receive_filter_set(mle_service_filter_cb *response_filter_cb);
66+
5967
#endif //NET_TEST_API_H_

source/Service_Libs/mle_service/mle_service.c

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,10 @@ typedef struct {
6868

6969
mle_service_class_t *mle_service = NULL;
7070

71+
#ifdef MLE_TEST
72+
static mle_service_filter_cb *receive_filter_cb = NULL;
73+
#endif
74+
7175
static uint8_t *mle_security_aux_header_write(uint8_t *ptr, const mle_security_header_t *auxHeader);
7276
static void mle_security_aux_ccm_nonce_set(uint8_t *noncePtr, uint8_t *mac64, uint32_t securityFrameCounter, uint8_t securityLevel);
7377
static uint8_t mle_security_aux_header_size(uint8_t keyIdMode);
@@ -802,6 +806,13 @@ static void mle_service_socket_callback(void *cb)
802806
mle_msg.dbm = buf->options.dbm;
803807
mle_msg.lqi = buf->options.lqi;
804808

809+
#ifdef MLE_TEST
810+
if (receive_filter_cb) {
811+
if (!receive_filter_cb(service_handler->interface_id, &mle_msg, &securityHeader)) {
812+
goto error_handler;
813+
}
814+
}
815+
#endif
805816
if (security_bypass) {
806817
/* Security by pass message handler call */
807818
service_handler->recv_security_bypass_cb(service_handler->interface_id, &mle_msg);
@@ -812,7 +823,7 @@ static void mle_service_socket_callback(void *cb)
812823
}
813824
}
814825

815-
error_handler:
826+
error_handler:
816827
if (buf) {
817828
buffer_free(buf);
818829
}
@@ -1497,3 +1508,10 @@ void mle_service_set_accept_invalid_frame_counter(bool value)
14971508
}
14981509
}
14991510

1511+
#ifdef MLE_TEST
1512+
void mle_service_receive_filter_cb_set(mle_service_filter_cb *filter_cb)
1513+
{
1514+
receive_filter_cb = filter_cb;
1515+
}
1516+
1517+
#endif

source/Service_Libs/mle_service/mle_service_api.h

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -189,6 +189,21 @@ typedef uint8_t * (mle_service_security_notify_cb)(int8_t interface_id, mle_secu
189189
*/
190190
typedef bool (mle_service_message_timeout_cb)(int8_t interface_id, uint16_t msgId, bool usedAllRetries);
191191

192+
/**
193+
* A callback for receive MLE message filtering
194+
*
195+
* This function will be called when MLE message is received. Only for testing purposes.
196+
*
197+
* \param interface_id define interface id for receiver
198+
* \param mle_msg received MLE message
199+
* \param security_headers messages security parameters
200+
*
201+
* \return true continue MLE packet processing
202+
* \return false drop MLE packet
203+
*
204+
*/
205+
typedef bool (mle_service_filter_cb)(int8_t interface_id, mle_message_t *mle_msg, mle_security_header_t *security_headers);
206+
192207
/*
193208
* Initialise server instance.
194209
* Creates and shares socket for other mle services.
@@ -704,4 +719,14 @@ void mle_service_set_fragmented_msg_ll_security(bool value);
704719
*/
705720
void mle_service_set_accept_invalid_frame_counter(bool value);
706721

722+
#ifdef MLE_TEST
723+
/**
724+
* Set callback for MLE receiving packet filtering.
725+
*
726+
* If this is set, all received MLE messages will be passed to given callback.
727+
*/
728+
void mle_service_receive_filter_cb_set(mle_service_filter_cb *filter_cb);
729+
#else
730+
#define mle_service_receive_filter_cb_set(filter_cb) ((void) 0)
731+
#endif /* MLE_TEST */
707732
#endif /* MLE_SERVICE_API_H_ */

source/configs/generic.cfg

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,3 +30,4 @@
3030
#define HAVE_DHCPV6_SERVER
3131
#define TCP_TEST
3232
#define THREAD_THCI_SUPPORT
33+
#define MLE_TEST

source/libNET/src/net_test.c

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
#include <string.h>
2121
#include "nsdynmemLIB.h"
2222
#include "NWK_INTERFACE/Include/protocol.h"
23+
#include "Service_Libs/mle_service/mle_service_api.h"
2324

2425
#include "net_test_api.h"
2526
#include "Common_Protocols/tcp.h"
@@ -76,3 +77,8 @@ int8_t arm_nwk_test_tcp_drop_rx(int state, uint8_t count)
7677
void arm_nwk_test_tcp_drop_reset() {
7778
tcp_test_drop_reset();
7879
}
80+
81+
void arm_nwk_test_mle_receive_filter_set(mle_service_filter_cb *response_filter_cb)
82+
{
83+
mle_service_receive_filter_cb_set(response_filter_cb);
84+
}

0 commit comments

Comments
 (0)