27
27
* POSSIBILITY OF SUCH DAMAGE.
28
28
*/
29
29
30
-
31
30
#include "nsconfig.h"
32
31
#include <ns_types.h>
33
32
#include <string.h>
68
67
69
68
#define TRACE_GROUP "comm"
70
69
71
- #define SECURITY_POLICY_CCM_DISABLED 0x04 /* Thread Commercial Commissioning Mode is enabled when this bit is set. This is Thread 1.2 feature. */
70
+ /* See thread_management_if.h for reserved Thread 1.1 bits */
71
+ #define SECURITY_POLICY_CCM_DISABLED 0x04 /* M-bit, Commercial Commissioning Mode is disabled when this bit is set. This is Thread 1.2 feature. */
72
+ #define SECURITY_POLICY_AUTONOMOUS_ENROLLMENT_DISABLED 0x02 /* A-bit, Autonomous enrollement disabled when this bit is set */
73
+ #define SECURITY_POLICY_NMKP_DISABLED 0x01 /* P-bit, NMKP is disabled when bit is set */
72
74
73
75
typedef struct thread_extension_info {
74
76
int8_t coap_service_id ;
@@ -976,75 +978,100 @@ static void thread_extension_relay_socket_cb(void *cb_res)
976
978
ns_dyn_mem_free (data_ptr );
977
979
}
978
980
979
- static void thread_extension_joiner_router_deinit (protocol_interface_info_entry_t * cur )
981
+ static void thread_extension_joiner_router_ae_deinit (protocol_interface_info_entry_t * cur )
980
982
{
983
+ if (cur -> thread_info -> extension_info -> relay_port_ae > 0 ) {
984
+ tr_debug ("deinit AE" );
985
+ coap_service_unregister_uri (cur -> thread_info -> extension_info -> coap_service_id , THREAD_URI_BBR_TRI_TX_NTF );
986
+ socket_close (cur -> thread_info -> extension_info -> listen_socket_ae );
987
+ cur -> thread_info -> extension_info -> listen_socket_ae = -1 ;
988
+ cur -> thread_info -> extension_info -> relay_port_ae = 0 ;
989
+ }
990
+ }
981
991
982
- tr_debug ("deinit joiner router" );
983
- coap_service_unregister_uri (cur -> thread_info -> extension_info -> coap_service_id , THREAD_URI_BBR_TRI_TX_NTF );
984
- coap_service_unregister_uri (cur -> thread_info -> extension_info -> coap_service_id , THREAD_URI_BBR_NMK_TX_NTF );
985
-
986
- socket_close (cur -> thread_info -> extension_info -> listen_socket_ae );
987
- socket_close (cur -> thread_info -> extension_info -> listen_socket_nmkp );
988
- cur -> thread_info -> extension_info -> listen_socket_ae = -1 ;
989
- cur -> thread_info -> extension_info -> listen_socket_nmkp = -1 ;
990
- cur -> thread_info -> extension_info -> relay_port_ae = 0 ;
991
- cur -> thread_info -> extension_info -> relay_port_nmkp = 0 ;
992
- return ;
992
+ static void thread_extension_joiner_router_nmkp_deinit (protocol_interface_info_entry_t * cur )
993
+ {
994
+ if (cur -> thread_info -> extension_info -> relay_port_nmkp > 0 ) {
995
+ tr_debug ("deinit NMKP" );
996
+ coap_service_unregister_uri (cur -> thread_info -> extension_info -> coap_service_id , THREAD_URI_BBR_NMK_TX_NTF );
997
+ socket_close (cur -> thread_info -> extension_info -> listen_socket_nmkp );
998
+ cur -> thread_info -> extension_info -> listen_socket_nmkp = -1 ;
999
+ cur -> thread_info -> extension_info -> relay_port_nmkp = 0 ;
1000
+ }
993
1001
}
994
1002
995
1003
static int thread_extension_joiner_router_init (protocol_interface_info_entry_t * cur )
996
1004
{
1005
+
997
1006
int8_t securityLinkLayer = 0 ;
998
1007
999
- if (!cur -> thread_info -> extension_info ) {
1008
+ if (!cur -> thread_info -> extension_info || thread_info ( cur ) -> version < THREAD_VERSION_1_2 ) {
1000
1009
return -1 ;
1001
1010
}
1002
1011
1003
1012
if (0 != thread_extension_primary_bbr_get (cur , NULL , NULL , NULL , NULL )) {
1004
- if (cur -> thread_info -> extension_info -> relay_port_ae ||
1005
- cur -> thread_info -> extension_info -> relay_port_nmkp ) {
1006
- // Need to disable Joiner router either because port changed or moving to disabled
1007
- tr_info ("Commercial Joiner router Disable joining" );
1008
- thread_extension_joiner_router_deinit (cur );
1009
- }
1013
+ // Need to disable Joiner router either because port changed or moving to disabled
1014
+ thread_extension_joiner_router_ae_deinit (cur );
1015
+ thread_extension_joiner_router_nmkp_deinit (cur );
1010
1016
// Joiner router should be disabled
1011
1017
return 0 ;
1012
1018
}
1013
- // Primary border router is present Enable relays to AE and NMKP
1014
- if (cur -> thread_info -> extension_info -> relay_port_ae ||
1015
- cur -> thread_info -> extension_info -> relay_port_nmkp ) {
1016
- // Setup is OK
1019
+
1020
+ // Is this a CCM network?
1021
+ uint16_t securityPolicy = thread_joiner_application_security_policy_get (cur -> id );
1022
+ if (securityPolicy & SECURITY_POLICY_CCM_DISABLED ) {
1023
+ // Not a CCM network, de-initialize
1024
+ thread_extension_joiner_router_ae_deinit (cur );
1025
+ thread_extension_joiner_router_nmkp_deinit (cur );
1017
1026
return 0 ;
1027
+ }
1018
1028
1029
+ if (thread_extension_bootstrap_network_certificate_available (cur ) == false) {
1030
+ // No domain certificate available
1031
+ return 0 ;
1019
1032
}
1020
1033
1021
- if (cur -> thread_info -> extension_info -> listen_socket_ae < 0 ) {
1022
- // Start AE relay
1023
- cur -> thread_info -> extension_info -> relay_port_ae = THREAD_DEFAULT_AE_PORT ;
1024
- cur -> thread_info -> extension_info -> listen_socket_ae = socket_open (SOCKET_UDP , cur -> thread_info -> extension_info -> relay_port_ae , thread_extension_relay_socket_cb );
1025
- socket_setsockopt (cur -> thread_info -> extension_info -> listen_socket_ae , SOCKET_IPPROTO_IPV6 , SOCKET_LINK_LAYER_SECURITY , & securityLinkLayer , sizeof (int8_t ));
1034
+ if (!(securityPolicy & SECURITY_POLICY_AUTONOMOUS_ENROLLMENT_DISABLED )) {
1026
1035
if (cur -> thread_info -> extension_info -> listen_socket_ae < 0 ) {
1027
- tr_warn ("Commercial Joiner router ae failed" );
1028
- cur -> thread_info -> extension_info -> relay_port_ae = 0 ;
1036
+ // Start AE relay
1037
+ cur -> thread_info -> extension_info -> listen_socket_ae = socket_open (SOCKET_UDP , THREAD_DEFAULT_AE_PORT , thread_extension_relay_socket_cb );
1038
+ if (cur -> thread_info -> extension_info -> listen_socket_ae >= 0 ) {
1039
+ cur -> thread_info -> extension_info -> relay_port_ae = THREAD_DEFAULT_AE_PORT ;
1040
+ socket_setsockopt (cur -> thread_info -> extension_info -> listen_socket_ae , SOCKET_IPPROTO_IPV6 , SOCKET_LINK_LAYER_SECURITY , & securityLinkLayer , sizeof (int8_t ));
1041
+ // The regular TX is usable from joiner router, because it is stateless, but it neds to be forced on
1042
+ coap_service_register_uri (cur -> thread_info -> extension_info -> coap_service_id , THREAD_URI_BBR_TRI_TX_NTF , COAP_SERVICE_ACCESS_POST_ALLOWED , thread_extension_relay_tx_cb );
1043
+ } else {
1044
+ tr_warn ("Joiner AE failed" );
1045
+ cur -> thread_info -> extension_info -> relay_port_ae = 0 ;
1046
+ }
1029
1047
}
1048
+ } else {
1049
+ thread_extension_joiner_router_ae_deinit (cur );
1030
1050
}
1031
- if (cur -> thread_info -> extension_info -> listen_socket_nmkp < 0 ) {
1032
- // Start nmkp relay
1033
- cur -> thread_info -> extension_info -> relay_port_nmkp = THREAD_DEFAULT_NMKP_PORT ;
1034
- cur -> thread_info -> extension_info -> listen_socket_nmkp = socket_open (SOCKET_UDP , cur -> thread_info -> extension_info -> relay_port_nmkp , thread_extension_relay_socket_cb );
1035
- socket_setsockopt (cur -> thread_info -> extension_info -> listen_socket_nmkp , SOCKET_IPPROTO_IPV6 , SOCKET_LINK_LAYER_SECURITY , & securityLinkLayer , sizeof (int8_t ));
1051
+
1052
+ if (!(securityPolicy & SECURITY_POLICY_NMKP_DISABLED )) {
1036
1053
if (cur -> thread_info -> extension_info -> listen_socket_nmkp < 0 ) {
1037
- tr_warn ("Commercial Joiner router nmkp failed" );
1038
- cur -> thread_info -> extension_info -> relay_port_nmkp = 0 ;
1054
+ // Start nmkp relay
1055
+ cur -> thread_info -> extension_info -> listen_socket_nmkp = socket_open (SOCKET_UDP , THREAD_DEFAULT_NMKP_PORT , thread_extension_relay_socket_cb );
1056
+ if (cur -> thread_info -> extension_info -> listen_socket_nmkp >= 0 ) {
1057
+ cur -> thread_info -> extension_info -> relay_port_nmkp = THREAD_DEFAULT_NMKP_PORT ;
1058
+ socket_setsockopt (cur -> thread_info -> extension_info -> listen_socket_nmkp , SOCKET_IPPROTO_IPV6 , SOCKET_LINK_LAYER_SECURITY , & securityLinkLayer , sizeof (int8_t ));
1059
+ // The regular TX is usable from joiner router, because it is stateless, but it neds to be forced on
1060
+ coap_service_register_uri (cur -> thread_info -> extension_info -> coap_service_id , THREAD_URI_BBR_NMK_TX_NTF , COAP_SERVICE_ACCESS_POST_ALLOWED , thread_extension_relay_tx_cb );
1061
+ } else {
1062
+ tr_warn ("Joiner NMKP failed" );
1063
+ cur -> thread_info -> extension_info -> relay_port_nmkp = 0 ;
1064
+ }
1039
1065
}
1066
+ } else {
1067
+ thread_extension_joiner_router_nmkp_deinit (cur );
1040
1068
}
1069
+
1041
1070
tr_info ("init commercial joiner router ae:%d nmkp:%d" , cur -> thread_info -> extension_info -> relay_port_ae , cur -> thread_info -> extension_info -> relay_port_nmkp );
1042
1071
1043
- // The regular TX is usable from joiner router, because it is stateless, but it neds to be forced on
1044
- coap_service_register_uri (cur -> thread_info -> extension_info -> coap_service_id , THREAD_URI_BBR_TRI_TX_NTF , COAP_SERVICE_ACCESS_POST_ALLOWED , thread_extension_relay_tx_cb );
1045
- coap_service_register_uri (cur -> thread_info -> extension_info -> coap_service_id , THREAD_URI_BBR_NMK_TX_NTF , COAP_SERVICE_ACCESS_POST_ALLOWED , thread_extension_relay_tx_cb );
1046
1072
return 0 ;
1047
1073
}
1074
+
1048
1075
bool thread_extension_joining_enabled (int8_t interface_id )
1049
1076
{
1050
1077
protocol_interface_info_entry_t * cur = protocol_stack_interface_info_get_by_id (interface_id );
@@ -1120,7 +1147,7 @@ uint8_t thread_extension_discover_response_len(protocol_interface_info_entry_t *
1120
1147
length += 4 ;
1121
1148
}
1122
1149
/* Thread 1.2 CCM add-ons */
1123
- if (cur -> thread_info -> version = = THREAD_VERSION_1_2 && thread_info (cur )-> extension_credentials_ptr ) {
1150
+ if (cur -> thread_info -> version > = THREAD_VERSION_1_2 && thread_info (cur )-> extension_credentials_ptr ) {
1124
1151
// Calculate also following optional TLV's:
1125
1152
// Thread domain name TLV
1126
1153
domain_name_len = thread_extension_bootstrap_thread_name_length_get (cur );
@@ -1146,7 +1173,7 @@ uint8_t *thread_extension_discover_response_write(protocol_interface_info_entry_
1146
1173
ptr = thread_meshcop_tlv_data_write_uint16 (ptr , MESHCOP_TLV_NMKP_PORT , cur -> thread_info -> extension_info -> relay_port_nmkp );
1147
1174
}
1148
1175
/* Thread 1.2 CCM add-ons */
1149
- if (cur -> thread_info -> version = = THREAD_VERSION_1_2 && thread_info (cur )-> extension_credentials_ptr ) {
1176
+ if (cur -> thread_info -> version > = THREAD_VERSION_1_2 && thread_info (cur )-> extension_credentials_ptr ) {
1150
1177
// Thread domain name TLV
1151
1178
if (thread_extension_bootstrap_thread_name_length_get (cur )) {
1152
1179
ptr = thread_meshcop_tlv_data_write (ptr , MESHCOP_TLV_DOMAIN_NAME , thread_extension_bootstrap_thread_name_length_get (cur ), thread_extension_bootstrap_thread_name_ptr_get (cur ));
0 commit comments