- /* location to write to in the packet */
- u8 *p0 = packet0 - h0->dst_mcast_offset;
- u8 *p1 = p0;
- /* location to write from in the L3 dest address */
- u8 *a0 = addr + addr_len - h0->dst_mcast_n_bytes;
-
- clib_memcpy (p0, a0, h0->dst_mcast_n_bytes);
- if (clear_first_bit)
- *p1 &= 0x7f;
+ if (PREDICT_TRUE (h0->dst_mcast_mask))
+ {
+ /* location to write to in the packet */
+ u8 *p0 = packet0 - h0->dst_mcast_offset;
+ u32 *p1 = (u32 *) p0;
+ /* location to copy from in the L3 dest address */
+ u32 *a0 = (u32 *) (addr + addr_len - sizeof (h0->dst_mcast_mask));
+
+ *p1 |= (*a0 & h0->dst_mcast_mask);
+ }