Skip to content

Commit

Permalink
ice: switch: add and use u16[] aliases to ice_adv_lkup_elem::{h, m}_u
Browse files Browse the repository at this point in the history
ice_adv_lkup_elem fields h_u and m_u are being accessed as raw u16
arrays in several places.
To reduce cast and braces burden, add permanent array-of-u16 aliases
with the same size as the `union ice_prot_hdr` itself via anonymous
unions to the actual struct declaration, and just access them
directly.

This:
 - removes the need to cast the union to u16[] and then dereference
   it each time -> reduces the horizon for potential bugs;
 - improves -Warray-bounds coverage -- the array size is now known
   at compilation time;
 - addresses cppcheck complaints.

Signed-off-by: Alexander Lobakin <alexandr.lobakin@intel.com>
Reviewed-by: Michal Swiatkowski <michal.swiatkowski@linux.intel.com>
Tested-by: Marcin Szycik <marcin.szycik@linux.intel.com>
Tested-by: Sandeep Penigalapati <sandeep.penigalapati@intel.com>
Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com>
  • Loading branch information
Alexander Lobakin authored and Tony Nguyen committed Apr 7, 2022
1 parent e8bd702 commit 135a161
Show file tree
Hide file tree
Showing 2 changed files with 17 additions and 10 deletions.
15 changes: 7 additions & 8 deletions drivers/net/ethernet/intel/ice/ice_switch.c
Original file line number Diff line number Diff line change
Expand Up @@ -5811,12 +5811,12 @@ ice_fill_adv_dummy_packet(struct ice_adv_lkup_elem *lkups, u16 lkups_cnt,
* over any significant packet data.
*/
for (j = 0; j < len / sizeof(u16); j++)
if (((u16 *)&lkups[i].m_u)[j])
if (lkups[i].m_raw[j])
((u16 *)(pkt + offset))[j] =
(((u16 *)(pkt + offset))[j] &
~((u16 *)&lkups[i].m_u)[j]) |
(((u16 *)&lkups[i].h_u)[j] &
((u16 *)&lkups[i].m_u)[j]);
~lkups[i].m_raw[j]) |
(lkups[i].h_raw[j] &
lkups[i].m_raw[j]);
}

s_rule->pdata.lkup_tx_rx.hdr_len = cpu_to_le16(pkt_len);
Expand Down Expand Up @@ -6065,11 +6065,10 @@ ice_add_adv_rule(struct ice_hw *hw, struct ice_adv_lkup_elem *lkups,
/* get # of words we need to match */
word_cnt = 0;
for (i = 0; i < lkups_cnt; i++) {
u16 j, *ptr;
u16 j;

ptr = (u16 *)&lkups[i].m_u;
for (j = 0; j < sizeof(lkups->m_u) / sizeof(u16); j++)
if (ptr[j] != 0)
for (j = 0; j < ARRAY_SIZE(lkups->m_raw); j++)
if (lkups[i].m_raw[j])
word_cnt++;
}

Expand Down
12 changes: 10 additions & 2 deletions drivers/net/ethernet/intel/ice/ice_switch.h
Original file line number Diff line number Diff line change
Expand Up @@ -138,8 +138,16 @@ struct ice_update_recipe_lkup_idx_params {

struct ice_adv_lkup_elem {
enum ice_protocol_type type;
union ice_prot_hdr h_u; /* Header values */
union ice_prot_hdr m_u; /* Mask of header values to match */
union {
union ice_prot_hdr h_u; /* Header values */
/* Used to iterate over the headers */
u16 h_raw[sizeof(union ice_prot_hdr) / sizeof(u16)];
};
union {
union ice_prot_hdr m_u; /* Mask of header values to match */
/* Used to iterate over header mask */
u16 m_raw[sizeof(union ice_prot_hdr) / sizeof(u16)];
};
};

struct ice_sw_act_ctrl {
Expand Down

0 comments on commit 135a161

Please sign in to comment.