The function rte_ether_addr_copy() checks for __INTEL_COMPILER and has a 
comment about "a strange gcc warning". It says:

static inline void rte_ether_addr_copy(const struct rte_ether_addr *ea_from,
                                   struct rte_ether_addr *ea_to)
{
#ifdef __INTEL_COMPILER
        uint16_t *from_words = (uint16_t *)(ea_from->addr_bytes);
        uint16_t *to_words   = (uint16_t *)(ea_to->addr_bytes);

        to_words[0] = from_words[0];
        to_words[1] = from_words[1];
        to_words[2] = from_words[2];
#else
        /*
         * Use the common way, because of a strange gcc warning.
         */
        *ea_to = *ea_from;
#endif
}

I can see that from_words discards the const qualifier. Is that the "strange" 
gcc warning the comment is referring to?

This goes back to before the first public release of DPDK in 2013, ref. 
https://git.dpdk.org/dpdk/log/lib/librte_ether/rte_ether.h


It should be fixed as follows:

-       uint16_t *from_words = (uint16_t *)(ea_from->addr_bytes);
-       uint16_t *to_words   = (uint16_t *)(ea_to->addr_bytes);
+       const uint16_t *from_words = (const uint16_t *)ea_from;
+       uint16_t       *to_words   = (uint16_t *)ea_to;

And the consequential question: Is copying the three shorts faster than copying 
the struct? In other words: Should we get rid of the #ifdef and use the first 
method only?

PS: I will provide a patch which improves rte_is_broadcast_ether_addr() too. 
The magic formula here is: return (w[0] & w[1] & w[2]) == 0xFFFF;


Med venlig hilsen / kind regards
- Morten Brørup


Reply via email to