* Prepare and load IPv6 addresses (src and dst) * into target tuple * @param orig * Pointer to ipv6 header of the original packet * @param targ * Pointer to rte_ipv6_tuple structure */
| 135 | * Pointer to rte_ipv6_tuple structure |
| 136 | */ |
| 137 | static inline void |
| 138 | rte_thash_load_v6_addrs(const struct rte_ipv6_hdr *orig, |
| 139 | union rte_thash_tuple *targ) |
| 140 | { |
| 141 | #ifdef RTE_ARCH_X86 |
| 142 | __m128i ipv6 = _mm_loadu_si128((const __m128i *)orig->src_addr); |
| 143 | *(__m128i *)targ->v6.src_addr = |
| 144 | _mm_shuffle_epi8(ipv6, rte_thash_ipv6_bswap_mask); |
| 145 | ipv6 = _mm_loadu_si128((const __m128i *)orig->dst_addr); |
| 146 | *(__m128i *)targ->v6.dst_addr = |
| 147 | _mm_shuffle_epi8(ipv6, rte_thash_ipv6_bswap_mask); |
| 148 | #elif defined(__ARM_NEON) |
| 149 | uint8x16_t ipv6 = vld1q_u8((uint8_t const *)orig->src_addr); |
| 150 | vst1q_u8((uint8_t *)targ->v6.src_addr, vrev32q_u8(ipv6)); |
| 151 | ipv6 = vld1q_u8((uint8_t const *)orig->dst_addr); |
| 152 | vst1q_u8((uint8_t *)targ->v6.dst_addr, vrev32q_u8(ipv6)); |
| 153 | #else |
| 154 | int i; |
| 155 | for (i = 0; i < 4; i++) { |
| 156 | *((uint32_t *)targ->v6.src_addr + i) = |
| 157 | rte_be_to_cpu_32(*((const uint32_t *)orig->src_addr + i)); |
| 158 | *((uint32_t *)targ->v6.dst_addr + i) = |
| 159 | rte_be_to_cpu_32(*((const uint32_t *)orig->dst_addr + i)); |
| 160 | } |
| 161 | #endif |
| 162 | } |
| 163 | |
| 164 | /** |
| 165 | * Generic implementation. Can be used with original rss_key |
no outgoing calls