Don't adjust_linklocal() when pulling a sockaddr out of an ncpaddr or

ncprange structure.

Don't write() the netmask for IPv6 sockaddrs to the routing socket if
the prefixlen is 128.

It seems that messages written to the routing socket with the scopeid
set for link local addresses are not understood.  Instead, we have to
put the scopeid in the 5th and 6th bytes of the address (see
adjust_linklocal() in ncpaddr.c).  I think this may be a bug in the
KAME implementation - it should really understand both forms.
This commit is contained in:
brian 2001-11-23 12:39:20 +00:00
parent d2d81413e2
commit 274cbc8854
3 changed files with 18 additions and 10 deletions

View File

@ -324,7 +324,6 @@ ncpaddr_getsa(const struct ncpaddr *addr, struct sockaddr_storage *host)
host6->sin6_family = AF_INET6;
host6->sin6_len = sizeof(*host6);
host6->sin6_addr = addr->ncpaddr_ip6addr;
adjust_linklocal(host6);
break;
#endif
@ -609,6 +608,21 @@ ncprange_sethost(struct ncprange *range, const struct ncpaddr *from)
}
}
int
ncprange_ishost(const struct ncprange *range)
{
switch (range->ncprange_family) {
case AF_INET:
return range->ncprange_ip4width == 32;
#ifndef NOINET6
case AF_INET6:
return range->ncprange_ip6width == 128;
#endif
}
return (0);
}
int
ncprange_setwidth(struct ncprange *range, int width)
{
@ -733,7 +747,6 @@ ncprange_getsa(const struct ncprange *range, struct sockaddr_storage *host,
host6->sin6_family = AF_INET6;
host6->sin6_len = sizeof(*host6);
host6->sin6_addr = range->ncprange_ip6addr;
adjust_linklocal(host6);
if (mask6) {
mask6->sin6_family = AF_INET6;
mask6->sin6_len = sizeof(*host6);

View File

@ -86,6 +86,7 @@ extern int ncprange_containsip4(const struct ncprange *, struct in_addr);
extern void ncprange_copy(struct ncprange *, const struct ncprange *);
extern void ncprange_set(struct ncprange *, const struct ncpaddr *, int);
extern void ncprange_sethost(struct ncprange *, const struct ncpaddr *);
extern int ncprange_ishost(const struct ncprange *);
extern int ncprange_setwidth(struct ncprange *, int);
extern void ncprange_setip4(struct ncprange *, struct in_addr, struct in_addr);
extern void ncprange_setip4host(struct ncprange *, struct in_addr);

View File

@ -698,7 +698,7 @@ rt_Set(struct bundle *bundle, int cmd, const struct ncprange *dst,
const struct ncpaddr *gw, int bang, int quiet)
{
struct rtmsg rtmes;
int domask, s, nb, wb, width;
int s, nb, wb, width;
char *cp;
const char *cmdstr;
struct sockaddr_storage sadst, samask, sagw;
@ -757,13 +757,7 @@ rt_Set(struct bundle *bundle, int cmd, const struct ncprange *dst,
}
}
domask = 1;
if (ncprange_family(dst) == AF_INET) {
ncprange_getwidth(dst, &width);
if (width == 32)
domask = 0;
}
if (domask) {
if (!ncprange_ishost(dst)) {
memcpy(cp, &samask, samask.ss_len);
cp += samask.ss_len;
rtmes.m_rtm.rtm_addrs |= RTA_NETMASK;