static int ip6_na_build(uint8_t *buffer,
size_t buflen,
const struct sockaddr_in6 *addr,
- const struct ether_addr *hwaddr,
+ const struct sockaddr_ll *hardware_addr,
size_t *len)
{
struct ip6_hdr *ip6;
* There is probably a cleverer way of writing the following,
* but listen to Kernighan's Law and aim for clarity.
*/
- nd_oh->nd_opt_len = (2 + ETH_ALEN) / 8;
- leftover = (2 + ETH_ALEN) % 8;
+ nd_oh->nd_opt_len = (2 + hardware_addr->sll_halen) / 8;
+ leftover = (2 + hardware_addr->sll_halen) % 8;
padding = 0;
if (leftover != 0) {
nd_oh->nd_opt_len += 1;
p += padding;
}
- memcpy(p, hwaddr, ETH_ALEN);
- p += ETH_ALEN;
+ memcpy(p, hardware_addr->sll_addr, hardware_addr->sll_halen);
+ p += hardware_addr->sll_halen;
/*
* This is either buried down here (with a helpful comment in
*/
ip6->ip6_plen = htons(sizeof(struct nd_neighbor_advert) +
sizeof(struct nd_opt_hdr) +
- ETH_ALEN +
+ hardware_addr->sll_halen +
padding);
nd_na->nd_na_cksum = ip6_checksum((uint8_t *)nd_na,
struct sockaddr_storage sas = {0};
socklen_t dest_len = 0;
uint8_t buffer[MAX(ARP_BUFFER_SIZE, IP6_NA_BUFFER_SIZE)];
- struct ether_addr *hwaddr = NULL;
size_t len = 0;
int ret = 0;
goto done;
}
- /* For clarity */
- hwaddr = (struct ether_addr *)hardware_addr_ll->sll_addr;
-
s = socket(AF_PACKET, SOCK_DGRAM, 0);
if (s == -1) {
ret = errno;
ret = ip6_na_build(buffer,
sizeof(buffer),
&addr->ip6,
- hwaddr,
+ hardware_addr_ll,
&len);
if (ret != 0) {
DBG_ERR("Failed to build IPv6 neighbor advertisement\n");
ctdb_sock_addr addr;
struct sockaddr_storage hardware_addr = {};
struct sockaddr_ll *sall = (struct sockaddr_ll *)&hardware_addr;
- /* Temporarily used for IPv6 - it still takes an ethernet address */
- struct ether_addr *hw = (struct ether_addr *)&sall->sll_addr[0];
uint8_t buf[512];
size_t buflen = sizeof(buf);
size_t len;
ret = arp_build(buf, buflen, &addr.ip, sall, arpop, &len);
break;
case AF_INET6:
- ret = ip6_na_build(buf, buflen, &addr.ip6, hw, &len);
+ ret = ip6_na_build(buf, buflen, &addr.ip6, sall, &len);
break;
default:
abort();