const uint8_t ethernet_multicast[ETH_ALEN] = {
0x33, 0x33, 0x00, 0x00, 0x00, 0x01
};
- struct sockaddr_ll *out_sall = (struct sockaddr_ll *)out;
+ uint8_t *in_sll_addr = (uint8_t *)in + offsetof(struct sockaddr_ll,
+ sll_addr);
+ uint8_t *out_sll_addr = (uint8_t *)out + offsetof(struct sockaddr_ll,
+ sll_addr);
- *out_sall = (struct sockaddr_ll) {
+ *(struct sockaddr_ll *)out = (struct sockaddr_ll) {
.sll_family = AF_PACKET,
.sll_halen = in->sll_halen,
.sll_protocol = htons(ETH_P_IPV6),
if (SOCKADDR_LL_ADDR_LEN < sizeof(ethernet_multicast)) {
return EMSGSIZE;
}
- memcpy(&out_sall->sll_addr[0],
+ memcpy(&out_sll_addr[0],
ethernet_multicast,
sizeof(ethernet_multicast));
break;
* appear to be the last 4 octets of the IPv6
* multicast address (see all_nodes_ll_multicast).
*/
- memcpy(&out_sall->sll_addr[0],
- &in->sll_addr[0],
- in->sll_halen);
- out_sall->sll_addr[6] = 0x60;
- out_sall->sll_addr[16] = 0x00;
- out_sall->sll_addr[17] = 0x00;
- out_sall->sll_addr[18] = 0x00;
- out_sall->sll_addr[19] = 0x01;
+ memcpy(&out_sll_addr[0], &in_sll_addr[0], in->sll_halen);
+ out_sll_addr[6] = 0x60;
+ out_sll_addr[16] = 0x00;
+ out_sll_addr[17] = 0x00;
+ out_sll_addr[18] = 0x00;
+ out_sll_addr[19] = 0x01;
break;
default:
return EPROTONOSUPPORT;
char in[strlen(asc) + 1];
char *t = NULL;
char *tok = NULL;
+ uint8_t *sll_addr = (uint8_t *)sall + offsetof(struct sockaddr_ll,
+ sll_addr);
*sall = (struct sockaddr_ll) {
.sll_family = AF_PACKET,
char *end = NULL;
unsigned long octet = strtoul(tok, &end, 16);
+ assert(sall->sll_halen < SOCKADDR_LL_ADDR_LEN);
assert(end != NULL && *end == '\0');
assert(octet <= 0xff);
- sall->sll_addr[sall->sll_halen] = (uint8_t)octet;
+ sll_addr[sall->sll_halen] = (uint8_t)octet;
sall->sll_halen++;
t = NULL;