- CXGBE_FILL_FS((vtc_flow & RTE_IPV6_HDR_TC_MASK) >>
- RTE_IPV6_HDR_TC_SHIFT,
- (vtc_flow_mask & RTE_IPV6_HDR_TC_MASK) >>
- RTE_IPV6_HDR_TC_SHIFT,
- tos);
-
- CXGBE_FILL_FS_MEMCPY(val->hdr.dst_addr, mask->hdr.dst_addr, lip);
- CXGBE_FILL_FS_MEMCPY(val->hdr.src_addr, mask->hdr.src_addr, fip);
+ if (val->hdr.vtc_flow || (umask && umask->hdr.vtc_flow))
+ CXGBE_FILL_FS((vtc_flow & RTE_IPV6_HDR_TC_MASK) >>
+ RTE_IPV6_HDR_TC_SHIFT,
+ (vtc_flow_mask & RTE_IPV6_HDR_TC_MASK) >>
+ RTE_IPV6_HDR_TC_SHIFT,
+ tos);
+
+ if (memcmp(val->hdr.dst_addr, z, sizeof(val->hdr.dst_addr)) ||
+ (umask &&
+ memcmp(umask->hdr.dst_addr, z, sizeof(umask->hdr.dst_addr))))
+ CXGBE_FILL_FS_MEMCPY(val->hdr.dst_addr, mask->hdr.dst_addr,
+ lip);
+
+ if (memcmp(val->hdr.src_addr, z, sizeof(val->hdr.src_addr)) ||
+ (umask &&
+ memcmp(umask->hdr.src_addr, z, sizeof(umask->hdr.src_addr))))
+ CXGBE_FILL_FS_MEMCPY(val->hdr.src_addr, mask->hdr.src_addr,
+ fip);