Tidying radv

This commit is contained in:
Simon Kelley
2012-03-30 15:10:28 +01:00
parent 1e02a85970
commit 5ef33279f2
2 changed files with 28 additions and 37 deletions

View File

@@ -373,6 +373,9 @@ static int find_interface_v6(struct in6_addr *local, int prefix,
void lease_ping_reply(struct in6_addr *sender, unsigned char *packet, char *interface) void lease_ping_reply(struct in6_addr *sender, unsigned char *packet, char *interface)
{ {
/* We may be doing RA but not DHCPv4, in which case the lease
database may not exist and we have nothing to do anyway */
if (daemon->dhcp)
slaac_ping_reply(sender, packet, interface, leases); slaac_ping_reply(sender, packet, interface, leases);
} }

View File

@@ -116,8 +116,7 @@ void icmp6_packet(void)
char control6[CMSG_SPACE(sizeof(struct in6_pktinfo))]; char control6[CMSG_SPACE(sizeof(struct in6_pktinfo))];
} control_u; } control_u;
struct sockaddr_in6 from; struct sockaddr_in6 from;
unsigned char *p; unsigned char *packet;
char *mac = "";
struct iname *tmp; struct iname *tmp;
struct dhcp_context *context; struct dhcp_context *context;
@@ -133,6 +132,8 @@ void icmp6_packet(void)
if ((sz = recv_dhcp_packet(daemon->icmp6fd, &msg)) == -1 || sz < 8) if ((sz = recv_dhcp_packet(daemon->icmp6fd, &msg)) == -1 || sz < 8)
return; return;
packet = (unsigned char *)daemon->outpacket.iov_base;
for (cmptr = CMSG_FIRSTHDR(&msg); cmptr; cmptr = CMSG_NXTHDR(&msg, cmptr)) for (cmptr = CMSG_FIRSTHDR(&msg); cmptr; cmptr = CMSG_NXTHDR(&msg, cmptr))
if (cmptr->cmsg_level == IPPROTO_IPV6 && cmptr->cmsg_type == daemon->v6pktinfo) if (cmptr->cmsg_level == IPPROTO_IPV6 && cmptr->cmsg_type == daemon->v6pktinfo)
{ {
@@ -160,37 +161,26 @@ void icmp6_packet(void)
if (!context->interface || strcmp(context->interface, interface) == 0) if (!context->interface || strcmp(context->interface, interface) == 0)
break; break;
if (!context) if (!context || packet[1] != 0)
return; return;
p = (unsigned char *)daemon->outpacket.iov_base; if (packet[0] == ICMP6_ECHO_REPLY)
lease_ping_reply(&from.sin6_addr, packet, interface);
if (p[1] != 0) else if (packet[0] == ND_ROUTER_SOLICIT)
return;
if (p[0] == ICMP6_ECHO_REPLY)
{ {
/* We may be doing RA but not DHCPv4, in which case the lease char *mac = "";
database may not exist and we have nothing to do anyway */
if (daemon->dhcp)
lease_ping_reply(&from.sin6_addr, p, interface);
return;
}
if (p[0] != ND_ROUTER_SOLICIT)
return;
/* look for link-layer address option for logging */ /* look for link-layer address option for logging */
if (sz >= 16 && p[8] == ICMP6_OPT_SOURCE_MAC && (p[9] * 8) + 8 <= sz) if (sz >= 16 && packet[8] == ICMP6_OPT_SOURCE_MAC && (packet[9] * 8) + 8 <= sz)
{ {
print_mac(daemon->namebuff, &p[10], (p[9] * 8) - 2); print_mac(daemon->namebuff, &packet[10], (packet[9] * 8) - 2);
mac = daemon->namebuff; mac = daemon->namebuff;
} }
my_syslog(MS_DHCP | LOG_INFO, "RTR-SOLICIT(%s) %s", interface, mac); my_syslog(MS_DHCP | LOG_INFO, "RTR-SOLICIT(%s) %s", interface, mac);
send_ra(if_index, interface, &from.sin6_addr); send_ra(if_index, interface, &from.sin6_addr);
} }
}
static void send_ra(int iface, char *iface_name, struct in6_addr *dest) static void send_ra(int iface, char *iface_name, struct in6_addr *dest)
{ {
@@ -343,8 +333,8 @@ static int add_prefixes(struct in6_addr *local, int prefix,
if ((opt = expand(sizeof(struct prefix_opt)))) if ((opt = expand(sizeof(struct prefix_opt))))
{ {
u64 addrpart = addr6part(local); /* zero net part of address */
u64 mask = (prefix == 64) ? (u64)-1LL : (1LLU << (128 - prefix)) - 1LLU; setaddr6part(local, addr6part(local) & ~((prefix == 64) ? (u64)-1LL : (1LLU << (128 - prefix)) - 1LLU));
/* lifetimes must be min 2 hrs, by RFC 2462 */ /* lifetimes must be min 2 hrs, by RFC 2462 */
if (time < 7200) if (time < 7200)
@@ -353,16 +343,14 @@ static int add_prefixes(struct in6_addr *local, int prefix,
opt->type = ICMP6_OPT_PREFIX; opt->type = ICMP6_OPT_PREFIX;
opt->len = 4; opt->len = 4;
opt->prefix_len = prefix; opt->prefix_len = prefix;
/* autonomous only is we're not doing dhcp */ /* autonomous only if we're not doing dhcp */
opt->flags = do_slaac ? 0x40 : 0x00; opt->flags = do_slaac ? 0x40 : 0x00;
opt->valid_lifetime = htonl(time); opt->valid_lifetime = htonl(time);
opt->preferred_lifetime = htonl(deprecate ? 0 : time); opt->preferred_lifetime = htonl(deprecate ? 0 : time);
opt->reserved = 0; opt->reserved = 0;
opt->prefix = *local; opt->prefix = *local;
setaddr6part(&opt->prefix, addrpart & ~mask);
inet_ntop(AF_INET6, &opt->prefix, daemon->addrbuff, ADDRSTRLEN); inet_ntop(AF_INET6, local, daemon->addrbuff, ADDRSTRLEN);
my_syslog(MS_DHCP | LOG_INFO, "RTR-ADVERT(%s) %s", param->if_name, daemon->addrbuff); my_syslog(MS_DHCP | LOG_INFO, "RTR-ADVERT(%s) %s", param->if_name, daemon->addrbuff);
} }
} }