char line[512], ifname[16];
bool found_default = false;
- struct odhcpd_ipaddr p = {IN6ADDR_ANY_INIT, 0, 0, 0};
+ struct odhcpd_ipaddr p = {IN6ADDR_ANY_INIT, 0, false, 0, 0, 0};
while (fgets(line, sizeof(line), fp_route)) {
uint32_t rflags;
if (sscanf(line, "00000000000000000000000000000000 00 "
struct {
struct nd_router_advert h;
- struct icmpv6_opt lladdr;
+ struct nd_opt_slla lladdr;
struct nd_opt_mtu mtu;
struct nd_opt_prefix_info prefix[RELAYD_MAX_PREFIXES];
} adv = {
adv.h.nd_ra_flags_reserved |= ND_RA_PREF_LOW;
else if (iface->route_preference > 0)
adv.h.nd_ra_flags_reserved |= ND_RA_PREF_HIGH;
- odhcpd_get_mac(iface, adv.lladdr.data);
+ odhcpd_get_mac(iface, adv.lladdr.addr);
// If not currently shutting down
struct odhcpd_ipaddr addrs[RELAYD_MAX_PREFIXES];
for (ssize_t i = 0; i < ipcnt; ++i) {
struct odhcpd_ipaddr *addr = &addrs[i];
- if (addr->prefix > 64)
+ if (addr->prefix > 64 || addr->has_class)
continue; // Address not suitable
if (addr->preferred > MaxPreferredTime)
if (!dns_addr)
dns_cnt = 0;
- struct {
- uint8_t type;
- uint8_t len;
- uint8_t pad;
- uint8_t pad2;
- uint32_t lifetime;
- } dns = {ND_OPT_RECURSIVE_DNS, (1 + (2 * dns_cnt)), 0, 0, htonl(dns_time)};
-
+ struct nd_opt_recursive_dns dns = {ND_OPT_RECURSIVE_DNS, (1 + (2 * dns_cnt)), 0, 0, htonl(dns_time)};
// DNS Search options
uint32_t lifetime;
uint8_t name[];
} *search = alloca(sizeof(*search) + search_padded);
+
+ if (!search) {
+ syslog(LOG_ERR, "Alloca failed for dns search on interface %s", iface->ifname);
+ return;
+ }
search->type = ND_OPT_DNS_SEARCH;
search->len = search_len ? ((sizeof(*search) + search_padded) / 8) : 0;
search->pad = 0;
icmpv6_for_each_option(opt, &adv[1], end) {
if (opt->type == ND_OPT_SOURCE_LINKADDR) {
// Store address of source MAC-address
- mac_ptr = opt->data;
+ mac_ptr = ((struct nd_opt_slla *)opt)->addr;
} else if (opt->type == ND_OPT_RECURSIVE_DNS && opt->len > 1) {
+ struct nd_opt_recursive_dns *dns = (struct nd_opt_recursive_dns *)opt;
// Check if we have to rewrite DNS
- dns_ptr = (struct in6_addr*)&opt->data[6];
- dns_count = (opt->len - 1) / 2;
+ dns_ptr = (struct in6_addr *)&dns[1];
+ dns_count = (dns->len - 1) / 2;
}
}