s
には(uint16_t*)
が使用されていますが、w
には(uint32_t*)
が使用されています。どうして?この機能はパケット内の宛先MACアドレスと送信元MACアドレスを入れ替えるために使用されますか?(uint16_t *)と(uint32_t *)の違いは何ですか?
static inline void
swap_mac_addr(uint64_t pkt_ptr)
{
uint16_t s;
uint32_t w;
/* assuming an IP/IPV6 pkt i.e. L2 header is 2 byte aligned, 4 byte non-aligned */
s = *(uint16_t*)pkt_ptr;
w = *(uint32_t*)(pkt_ptr+2);
*(uint16_t*)pkt_ptr = *(uint16_t*)(pkt_ptr+6);
*(uint32_t*)(pkt_ptr+2) = *(uint32_t*)(pkt_ptr+8);
*(uint16_t*)(pkt_ptr+6) = s;
*(uint32_t*)(pkt_ptr+8) = w;
}
このコードは厳密なエイリアシング規則に違反しているため、未定義の動作を示すものと見なす必要があります。 –
@EugeneSh .:コメントに書かれていることを考慮に入れても(「*仮定していますか?」)? – alk
@それでしょ? 16/32ビット整数へのポインタを持つ64ビット整数にアクセスする。これらは互換性のない型AFAIKへのポインタです。 –