diff options
-rw-r--r-- | src/router.c | 20 | ||||
-rw-r--r-- | src/router.h | 18 |
2 files changed, 17 insertions, 21 deletions
diff --git a/src/router.c b/src/router.c index 86726be..fffdc4c 100644 --- a/src/router.c +++ b/src/router.c @@ -265,7 +265,7 @@ static void send_router_advert(struct uloop_timeout *event) struct { struct nd_router_advert h; - struct nd_opt_slla lladdr; + struct icmpv6_opt lladdr; struct nd_opt_mtu mtu; struct nd_opt_prefix_info prefix[RELAYD_MAX_PREFIXES]; } adv = { @@ -284,7 +284,7 @@ static void send_router_advert(struct uloop_timeout *event) 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.addr); + odhcpd_get_mac(iface, adv.lladdr.data); // If not currently shutting down struct odhcpd_ipaddr addrs[RELAYD_MAX_PREFIXES]; @@ -376,7 +376,14 @@ static void send_router_advert(struct uloop_timeout *event) if (!dns_addr) dns_cnt = 0; - struct nd_opt_recursive_dns dns = {ND_OPT_RECURSIVE_DNS, (1 + (2 * dns_cnt)), 0, 0, htonl(dns_time)}; + 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)}; + // DNS Search options @@ -505,12 +512,11 @@ static void forward_router_advertisement(uint8_t *data, size_t len) icmpv6_for_each_option(opt, &adv[1], end) { if (opt->type == ND_OPT_SOURCE_LINKADDR) { // Store address of source MAC-address - mac_ptr = ((struct nd_opt_slla *)opt)->addr; + mac_ptr = opt->data; } 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 *)&dns[1]; - dns_count = (dns->len - 1) / 2; + dns_ptr = (struct in6_addr*)&opt->data[6]; + dns_count = (opt->len - 1) / 2; } } diff --git a/src/router.h b/src/router.h index 8d74967..1e8649c 100644 --- a/src/router.h +++ b/src/router.h @@ -20,25 +20,15 @@ struct icmpv6_opt { uint8_t type; uint8_t len; + uint8_t data[6]; }; -struct nd_opt_slla { - uint8_t type; - uint8_t len; - uint8_t addr[6]; -}; - -struct nd_opt_recursive_dns { - uint8_t type; - uint8_t len; - uint8_t pad; - uint8_t pad2; - uint32_t lifetime; -}; #define icmpv6_for_each_option(opt, start, end)\ for (opt = (struct icmpv6_opt*)(start);\ - (void*)(opt + (opt->len << 3)) <= (void*)(end); opt += (opt->len << 3)) + (void*)(opt + 1) <= (void*)(end) && opt->len > 0 &&\ + (void*)(opt + opt->len) <= (void*)(end); opt += opt->len) + #define MaxRtrAdvInterval 600 #define MinRtrAdvInterval (MaxRtrAdvInterval / 3) |