mesh: provide mesh_pdu_control_opcode

This commit is contained in:
Matthias Ringwald 2019-08-13 18:26:40 +02:00
parent 89714ad07e
commit e9292fe87e
7 changed files with 30 additions and 10 deletions

View File

@ -445,6 +445,17 @@ uint8_t * mesh_pdu_data(mesh_pdu_t * pdu){
} }
} }
uint8_t mesh_pdu_control_opcode(mesh_pdu_t * pdu){
switch (pdu->pdu_type){
case MESH_PDU_TYPE_TRANSPORT:
return mesh_transport_control_opcode((mesh_transport_pdu_t*) pdu);
case MESH_PDU_TYPE_NETWORK:
return mesh_network_control_opcode((mesh_network_pdu_t *) pdu);
default:
return 0xff;
}
}
// message parser // message parser
static int mesh_access_get_opcode(uint8_t * buffer, uint16_t buffer_size, uint32_t * opcode, uint16_t * opcode_size){ static int mesh_access_get_opcode(uint8_t * buffer, uint16_t buffer_size, uint32_t * opcode, uint16_t * opcode_size){

View File

@ -220,6 +220,7 @@ uint16_t mesh_pdu_netkey_index(mesh_pdu_t * pdu);
uint16_t mesh_pdu_appkey_index(mesh_pdu_t * pdu); uint16_t mesh_pdu_appkey_index(mesh_pdu_t * pdu);
uint16_t mesh_pdu_len(mesh_pdu_t * pdu); uint16_t mesh_pdu_len(mesh_pdu_t * pdu);
uint8_t * mesh_pdu_data(mesh_pdu_t * pdu); uint8_t * mesh_pdu_data(mesh_pdu_t * pdu);
uint8_t mesh_pdu_control_opcode(mesh_pdu_t * pdu);
// Mesh Access Parser // Mesh Access Parser
int mesh_access_pdu_get_opcode(mesh_pdu_t * pdu, uint32_t * opcode, uint16_t * opcode_size); int mesh_access_pdu_get_opcode(mesh_pdu_t * pdu, uint32_t * opcode, uint16_t * opcode_size);

View File

@ -84,6 +84,9 @@ uint16_t mesh_transport_src(mesh_transport_pdu_t * transport_pdu){
uint16_t mesh_transport_dst(mesh_transport_pdu_t * transport_pdu){ uint16_t mesh_transport_dst(mesh_transport_pdu_t * transport_pdu){
return big_endian_read_16(transport_pdu->network_header, 7); return big_endian_read_16(transport_pdu->network_header, 7);
} }
uint8_t mesh_transport_control_opcode(mesh_transport_pdu_t * transport_pdu){
return transport_pdu->akf_aid_control & 0x7f;
}
void mesh_transport_set_nid_ivi(mesh_transport_pdu_t * transport_pdu, uint8_t nid_ivi){ void mesh_transport_set_nid_ivi(mesh_transport_pdu_t * transport_pdu, uint8_t nid_ivi){
transport_pdu->network_header[0] = nid_ivi; transport_pdu->network_header[0] = nid_ivi;
} }
@ -370,8 +373,8 @@ static void mesh_lower_transport_process_segment( mesh_transport_pdu_t * transpo
uint8_t lower_transport_pdu_len = mesh_network_pdu_len(network_pdu); uint8_t lower_transport_pdu_len = mesh_network_pdu_len(network_pdu);
// get akf_aid & transmic // get akf_aid & transmic
transport_pdu->akf_aid = lower_transport_pdu[0]; transport_pdu->akf_aid_control = lower_transport_pdu[0] & 0x7f;
transport_pdu->transmic_len = lower_transport_pdu[1] & 0x80 ? 8 : 4; transport_pdu->transmic_len = lower_transport_pdu[1] & 0x80 ? 8 : 4;
// get seq_zero // get seq_zero
uint16_t seq_zero = ( big_endian_read_16(lower_transport_pdu, 1) >> 2) & 0x1fff; uint16_t seq_zero = ( big_endian_read_16(lower_transport_pdu, 1) >> 2) & 0x1fff;
@ -486,7 +489,7 @@ static void mesh_lower_transport_setup_segment(mesh_transport_pdu_t *transport_p
uint16_t seg_offset = seg_o * max_segment_len; uint16_t seg_offset = seg_o * max_segment_len;
uint8_t lower_transport_pdu_data[16]; uint8_t lower_transport_pdu_data[16];
lower_transport_pdu_data[0] = 0x80 | transport_pdu->akf_aid; lower_transport_pdu_data[0] = 0x80 | transport_pdu->akf_aid_control;
big_endian_store_24(lower_transport_pdu_data, 1, (szmic << 23) | (seq_zero << 10) | (seg_o << 5) | seg_n); big_endian_store_24(lower_transport_pdu_data, 1, (szmic << 23) | (seq_zero << 10) | (seg_o << 5) | seg_n);
uint16_t segment_len = btstack_min(transport_pdu->len - seg_offset, max_segment_len); uint16_t segment_len = btstack_min(transport_pdu->len - seg_offset, max_segment_len);
memcpy(&lower_transport_pdu_data[4], &transport_pdu->data[seg_offset], segment_len); memcpy(&lower_transport_pdu_data[4], &transport_pdu->data[seg_offset], segment_len);

View File

@ -85,6 +85,7 @@ uint32_t mesh_transport_seq(mesh_transport_pdu_t * transport_pdu);
uint32_t mesh_transport_seq_zero(mesh_transport_pdu_t * transport_pdu); uint32_t mesh_transport_seq_zero(mesh_transport_pdu_t * transport_pdu);
uint16_t mesh_transport_src(mesh_transport_pdu_t * transport_pdu); uint16_t mesh_transport_src(mesh_transport_pdu_t * transport_pdu);
uint16_t mesh_transport_dst(mesh_transport_pdu_t * transport_pdu); uint16_t mesh_transport_dst(mesh_transport_pdu_t * transport_pdu);
uint8_t mesh_transport_control_opcode(mesh_transport_pdu_t * transport_pdu);
void mesh_transport_set_nid_ivi(mesh_transport_pdu_t * transport_pdu, uint8_t nid_ivi); void mesh_transport_set_nid_ivi(mesh_transport_pdu_t * transport_pdu, uint8_t nid_ivi);
void mesh_transport_set_ctl_ttl(mesh_transport_pdu_t * transport_pdu, uint8_t ctl_ttl); void mesh_transport_set_ctl_ttl(mesh_transport_pdu_t * transport_pdu, uint8_t ctl_ttl);

View File

@ -1022,6 +1022,9 @@ uint16_t mesh_network_dst(mesh_network_pdu_t * network_pdu){
int mesh_network_segmented(mesh_network_pdu_t * network_pdu){ int mesh_network_segmented(mesh_network_pdu_t * network_pdu){
return network_pdu->data[9] & 0x80; return network_pdu->data[9] & 0x80;
} }
uint8_t mesh_network_control_opcode(mesh_network_pdu_t * network_pdu){
return network_pdu->data[9] & 0x7f;
}
uint8_t * mesh_network_pdu_data(mesh_network_pdu_t * network_pdu){ uint8_t * mesh_network_pdu_data(mesh_network_pdu_t * network_pdu){
return &network_pdu->data[9]; return &network_pdu->data[9];
} }

View File

@ -121,8 +121,8 @@ typedef struct {
uint16_t appkey_index; uint16_t appkey_index;
// transmic size // transmic size
uint8_t transmic_len; uint8_t transmic_len;
// akf - aid // akf - aid for access, opcode for control
uint8_t akf_aid; uint8_t akf_aid_control;
// network pdu header // network pdu header
uint8_t network_header[9]; uint8_t network_header[9];
// acknowledgement timer active // acknowledgement timer active
@ -371,6 +371,7 @@ uint32_t mesh_network_seq(mesh_network_pdu_t * network_pdu);
uint16_t mesh_network_src(mesh_network_pdu_t * network_pdu); uint16_t mesh_network_src(mesh_network_pdu_t * network_pdu);
uint16_t mesh_network_dst(mesh_network_pdu_t * network_pdu); uint16_t mesh_network_dst(mesh_network_pdu_t * network_pdu);
int mesh_network_segmented(mesh_network_pdu_t * network_pdu); int mesh_network_segmented(mesh_network_pdu_t * network_pdu);
uint8_t mesh_network_control_opcode(mesh_network_pdu_t * network_pdu);
uint8_t * mesh_network_pdu_data(mesh_network_pdu_t * network_pdu); uint8_t * mesh_network_pdu_data(mesh_network_pdu_t * network_pdu);
uint8_t mesh_network_pdu_len(mesh_network_pdu_t * network_pdu); uint8_t mesh_network_pdu_len(mesh_network_pdu_t * network_pdu);

View File

@ -317,7 +317,7 @@ static void mesh_upper_transport_validate_segmented_message_ccm(void * arg){
printf("\n"); printf("\n");
} else { } else {
uint8_t akf = transport_pdu->akf_aid & 0x40; uint8_t akf = transport_pdu->akf_aid_control & 0x40;
if (akf){ if (akf){
printf("TransMIC does not match, try next key\n"); printf("TransMIC does not match, try next key\n");
mesh_upper_transport_validate_segmented_message(transport_pdu); mesh_upper_transport_validate_segmented_message(transport_pdu);
@ -475,8 +475,8 @@ static void mesh_upper_transport_process_message(mesh_transport_pdu_t * transpor
uint8_t upper_transport_pdu_len = transport_pdu->len - transport_pdu->transmic_len; uint8_t upper_transport_pdu_len = transport_pdu->len - transport_pdu->transmic_len;
mesh_print_hex("Upper Transport pdu", upper_transport_pdu, upper_transport_pdu_len); mesh_print_hex("Upper Transport pdu", upper_transport_pdu, upper_transport_pdu_len);
uint8_t aid = transport_pdu->akf_aid & 0x3f; uint8_t aid = transport_pdu->akf_aid_control & 0x3f;
uint8_t akf = (transport_pdu->akf_aid & 0x40) >> 6; uint8_t akf = (transport_pdu->akf_aid_control & 0x40) >> 6;
printf("AKF: %u\n", akf); printf("AKF: %u\n", akf);
printf("AID: %02x\n", aid); printf("AID: %02x\n", aid);
@ -591,7 +591,7 @@ static uint8_t mesh_upper_transport_setup_segmented_control_pdu(mesh_transport_p
memcpy(transport_pdu->data, control_pdu_data, control_pdu_len); memcpy(transport_pdu->data, control_pdu_data, control_pdu_len);
transport_pdu->len = control_pdu_len; transport_pdu->len = control_pdu_len;
transport_pdu->netkey_index = netkey_index; transport_pdu->netkey_index = netkey_index;
transport_pdu->akf_aid = opcode; transport_pdu->akf_aid_control = opcode;
transport_pdu->transmic_len = 0; // no TransMIC for control transport_pdu->transmic_len = 0; // no TransMIC for control
mesh_transport_set_nid_ivi(transport_pdu, network_key->nid); mesh_transport_set_nid_ivi(transport_pdu, network_key->nid);
mesh_transport_set_seq(transport_pdu, seq); mesh_transport_set_seq(transport_pdu, seq);
@ -679,7 +679,7 @@ static uint8_t mesh_upper_transport_setup_segmented_access_pdu_header(mesh_trans
transport_pdu->transmic_len = trans_mic_len; transport_pdu->transmic_len = trans_mic_len;
transport_pdu->netkey_index = netkey_index; transport_pdu->netkey_index = netkey_index;
transport_pdu->appkey_index = appkey_index; transport_pdu->appkey_index = appkey_index;
transport_pdu->akf_aid = akf_aid; transport_pdu->akf_aid_control = akf_aid;
mesh_transport_set_nid_ivi(transport_pdu, network_key->nid | ((mesh_get_iv_index_for_tx() & 1) << 7)); mesh_transport_set_nid_ivi(transport_pdu, network_key->nid | ((mesh_get_iv_index_for_tx() & 1) << 7));
mesh_transport_set_seq(transport_pdu, seq); mesh_transport_set_seq(transport_pdu, seq);
mesh_transport_set_src(transport_pdu, src); mesh_transport_set_src(transport_pdu, src);