@@ -461,16 +461,19 @@ void ieee802154_compute_header_and_authtag_len(struct net_if *iface, struct net_
461461 hdr_len += src -> addr ? src -> len : dst -> len ;
462462
463463#ifdef CONFIG_NET_L2_IEEE802154_SECURITY
464+ struct ieee802154_security_ctx * sec_ctx ;
465+ struct ieee802154_context * ctx ;
466+
464467 if (broadcast ) {
465468 NET_DBG ("Broadcast packets are not being encrypted." );
466469 goto done ;
467470 }
468471
469- struct ieee802154_context * ctx = (struct ieee802154_context * )net_if_l2_data (iface );
472+ ctx = (struct ieee802154_context * )net_if_l2_data (iface );
470473
471474 k_sem_take (& ctx -> ctx_lock , K_FOREVER );
472475
473- struct ieee802154_security_ctx * sec_ctx = & ctx -> sec_ctx ;
476+ sec_ctx = & ctx -> sec_ctx ;
474477 if (sec_ctx -> level == IEEE802154_SECURITY_LEVEL_NONE ) {
475478 goto release ;
476479 }
@@ -594,6 +597,7 @@ static uint8_t *generate_addressing_fields(struct ieee802154_context *ctx,
594597 struct ieee802154_frame_params * params , uint8_t * p_buf )
595598{
596599 struct ieee802154_address_field * address_field ;
600+ struct ieee802154_address * src_addr ;
597601
598602 /* destination address */
599603 if (fs -> fc .dst_addr_mode != IEEE802154_ADDR_MODE_NONE ) {
@@ -619,7 +623,6 @@ static uint8_t *generate_addressing_fields(struct ieee802154_context *ctx,
619623 }
620624
621625 address_field = (struct ieee802154_address_field * )p_buf ;
622- struct ieee802154_address * src_addr ;
623626
624627 if (fs -> fc .pan_id_comp ) {
625628 src_addr = & address_field -> comp .addr ;
@@ -691,12 +694,12 @@ bool ieee802154_create_data_frame(struct ieee802154_context *ctx, struct net_lin
691694 goto out ;
692695 }
693696 } else {
697+ uint8_t ext_addr_le [IEEE802154_EXT_ADDR_LENGTH ];
698+
694699 if (src -> len != IEEE802154_EXT_ADDR_LENGTH ) {
695700 goto out ;
696701 }
697702
698- uint8_t ext_addr_le [IEEE802154_EXT_ADDR_LENGTH ];
699-
700703 sys_memcpy_swap (ext_addr_le , src -> addr , IEEE802154_EXT_ADDR_LENGTH );
701704 if (memcmp (ctx -> ext_addr , ext_addr_le , src -> len )) {
702705 goto out ;
@@ -708,6 +711,8 @@ bool ieee802154_create_data_frame(struct ieee802154_context *ctx, struct net_lin
708711 p_buf = generate_addressing_fields (ctx , fs , & params , p_buf );
709712
710713#ifdef CONFIG_NET_L2_IEEE802154_SECURITY
714+ uint8_t level , authtag_len , payload_len ;
715+
711716 if (broadcast ) {
712717 /* TODO: This may not always be correct. */
713718 NET_DBG ("No security hdr needed: broadcasting" );
@@ -727,16 +732,14 @@ bool ieee802154_create_data_frame(struct ieee802154_context *ctx, struct net_lin
727732 goto out ;
728733 }
729734
730- uint8_t level = ctx -> sec_ctx .level ;
731-
735+ level = ctx -> sec_ctx .level ;
732736 if (level >= IEEE802154_SECURITY_LEVEL_ENC ) {
733737 level -= 4U ;
734738 }
735739
736- uint8_t authtag_len = level_2_authtag_len [level ];
737- uint8_t payload_len = buf -> len - ll_hdr_len - authtag_len ;
738-
739740 /* Let's encrypt/auth only in the end, if needed */
741+ authtag_len = level_2_authtag_len [level ];
742+ payload_len = buf -> len - ll_hdr_len - authtag_len ;
740743 if (!ieee802154_encrypt_auth (& ctx -> sec_ctx , buf_start , ll_hdr_len ,
741744 payload_len , authtag_len , ctx -> ext_addr )) {
742745 goto out ;
@@ -930,36 +933,38 @@ bool ieee802154_decipher_data_frame(struct net_if *iface, struct net_pkt *pkt,
930933 struct ieee802154_mpdu * mpdu )
931934{
932935 struct ieee802154_context * ctx = net_if_l2_data (iface );
936+ uint8_t level , authtag_len , ll_hdr_len , payload_len ;
937+ int8_t ext_addr_le [IEEE802154_EXT_ADDR_LENGTH ];
938+ struct ieee802154_mhr * mhr = & mpdu -> mhr ;
933939 bool ret = false;
934940
935941 k_sem_take (& ctx -> ctx_lock , K_FOREVER );
936942
937- uint8_t level = ctx -> sec_ctx .level ;
938-
939- if (!mpdu -> mhr .fs -> fc .security_enabled ) {
943+ if (!mhr -> fs -> fc .security_enabled ) {
940944 ret = true;
941945 goto out ;
942946 }
943947
948+ level = ctx -> sec_ctx .level ;
949+
944950 /* Section 9.2.4: Incoming frame security procedure, Security Enabled field is set to one
945951 *
946952 * [...]
947953 *
948954 * a) Legacy security. If the Frame Version field of the frame to be unsecured is set to
949955 * zero, the procedure shall return with a Status of UNSUPPORTED_LEGACY.
950956 */
951- if (mpdu -> mhr . aux_sec -> control .security_level != level ) {
957+ if (mhr -> aux_sec -> control .security_level != level ) {
952958 goto out ;
953959 }
954960
955961 if (level >= IEEE802154_SECURITY_LEVEL_ENC ) {
956962 level -= 4U ;
957963 }
958964
959- uint8_t authtag_len = level_2_authtag_len [level ];
960- uint8_t ll_hdr_len = (uint8_t * )mpdu -> payload - net_pkt_data (pkt );
961- uint8_t payload_len = net_pkt_get_len (pkt ) - ll_hdr_len - authtag_len ;
962- uint8_t ext_addr_le [IEEE802154_EXT_ADDR_LENGTH ];
965+ authtag_len = level_2_authtag_len [level ];
966+ ll_hdr_len = (uint8_t * )mpdu -> payload - net_pkt_data (pkt );
967+ payload_len = net_pkt_get_len (pkt ) - ll_hdr_len - authtag_len ;
963968
964969 /* TODO: Handle src short address.
965970 * This will require to look up in nbr cache with short addr
@@ -973,7 +978,7 @@ bool ieee802154_decipher_data_frame(struct net_if *iface, struct net_pkt *pkt,
973978 sys_memcpy_swap (ext_addr_le , net_pkt_lladdr_src (pkt )-> addr , net_pkt_lladdr_src (pkt )-> len );
974979 if (!ieee802154_decrypt_auth (& ctx -> sec_ctx , net_pkt_data (pkt ), ll_hdr_len , payload_len ,
975980 authtag_len , ext_addr_le ,
976- sys_le32_to_cpu (mpdu -> mhr . aux_sec -> frame_counter ))) {
981+ sys_le32_to_cpu (mhr -> aux_sec -> frame_counter ))) {
977982 NET_ERR ("Could not decipher the frame" );
978983 goto out ;
979984 }
0 commit comments