Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/usr.sbin/route6d sync with recent KAME.
details: https://anonhg.NetBSD.org/src/rev/5819fd0a93a8
branches: trunk
changeset: 476003:5819fd0a93a8
user: itojun <itojun%NetBSD.org@localhost>
date: Fri Sep 03 04:04:22 1999 +0000
description:
sync with recent KAME.
- fix 64bit alignment issue in routing socket.
- avoid s6_addr8 (nonstandard), use s6_addr instead.
diffstat:
usr.sbin/route6d/route6d.c | 74 +++++++++++++++++++++++++--------------------
usr.sbin/route6d/route6d.h | 4 +-
2 files changed, 43 insertions(+), 35 deletions(-)
diffs (240 lines):
diff -r eb62e959caca -r 5819fd0a93a8 usr.sbin/route6d/route6d.c
--- a/usr.sbin/route6d/route6d.c Fri Sep 03 03:54:47 1999 +0000
+++ b/usr.sbin/route6d/route6d.c Fri Sep 03 04:04:22 1999 +0000
@@ -1,7 +1,7 @@
-/* $NetBSD: route6d.c,v 1.7 1999/07/26 01:31:47 itohy Exp $ */
+/* $NetBSD: route6d.c,v 1.8 1999/09/03 04:04:22 itojun Exp $ */
/*
- * KAME Header: /cvsroot/hydrangea-freebsd/kit/src/route6d/Attic/route6d.c,v 1.1.2.12.2.5.2.8.2.10.2.32 1999/07/06 09:23:36 itojun Exp
+ * KAME Header: /cvsroot/kame/kame/kame/kame/route6d/route6d.c,v 1.4 1999/09/02 12:18:10 itojun Exp
*/
/*
@@ -35,7 +35,7 @@
#include <sys/cdefs.h>
#ifndef lint
-__RCSID("$NetBSD: route6d.c,v 1.7 1999/07/26 01:31:47 itohy Exp $");
+__RCSID("$NetBSD: route6d.c,v 1.8 1999/09/03 04:04:22 itojun Exp $");
#endif
#include <stdio.h>
@@ -88,17 +88,22 @@
#define INIT_INTERVAL6 10 /* Wait to submit a initial riprequest */
#endif
+/* alignment constraint for routing socket */
+#define ROUNDUP(a) \
+ ((a) > 0 ? (1 + (((a) - 1) | (sizeof(long) - 1))) : sizeof(long))
+#define ADVANCE(x, n) (x += ROUNDUP((n)->sa_len))
+
/*
* Following two macros are highly depending on KAME Release
*/
#define IN6_LINKLOCAL_IFINDEX(addr) \
- ((addr).s6_addr8[2] << 8 | (addr).s6_addr8[3])
+ ((addr).s6_addr[2] << 8 | (addr).s6_addr[3])
#define SET_IN6_LINKLOCAL_IFINDEX(addr, index) \
- { \
- (addr).s6_addr8[2] = ((index) >> 8) & 0xff; \
- (addr).s6_addr8[3] = (index) & 0xff; \
- }
+ do { \
+ (addr).s6_addr[2] = ((index) >> 8) & 0xff; \
+ (addr).s6_addr[3] = (index) & 0xff; \
+ } while (0)
struct ifc { /* Configuration of an interface */
char *ifc_name; /* if name */
@@ -589,7 +594,7 @@
np = ripbuf->rip6_nets;
for (i = 0; i < nrt; i++, np++) {
if (np->rip6_metric == NEXTHOP_METRIC) {
- if (IN6_IS_ADDR_ANY(&np->rip6_dest))
+ if (IN6_IS_ADDR_UNSPECIFIED(&np->rip6_dest))
trace(2, " NextHop reset");
else {
trace(2, " NextHop %s",
@@ -724,7 +729,7 @@
continue;
/* Check nexthop */
if (rrt->rrt_index == ifcp->ifc_index &&
- !IN6_IS_ADDR_ANY(&rrt->rrt_gw) &&
+ !IN6_IS_ADDR_UNSPECIFIED(&rrt->rrt_gw) &&
(rrt->rrt_flags & RTF_NH_NOT_LLADDR) == 0) {
if (nh == NULL || !IN6_ARE_ADDR_EQUAL(nh, &rrt->rrt_gw)) {
if (nrt == maxrte - 2)
@@ -972,7 +977,7 @@
nh = np->rip6_dest;
SET_IN6_LINKLOCAL_IFINDEX(nh, index);
trace(1, "\tNexthop: %s\n", inet6_n2p(&nh));
- } else if (IN6_IS_ADDR_ANY(&np->rip6_dest)) {
+ } else if (IN6_IS_ADDR_UNSPECIFIED(&np->rip6_dest)) {
nh = fsock.sin6_addr;
trace(1, "\tNexthop: %s\n", inet6_n2p(&nh));
} else {
@@ -1167,7 +1172,7 @@
int i;
struct riprt *rrt;
- if (!(nn == 1 && IN6_IS_ADDR_ANY(&np->rip6_dest) &&
+ if (!(nn == 1 && IN6_IS_ADDR_UNSPECIFIED(&np->rip6_dest) &&
np->rip6_plen == 0 && np->rip6_metric == HOPCNT_INFINITY6)) {
/* Specific response, don't split-horizon */
trace(1, "\tRIP Request\n");
@@ -1424,7 +1429,7 @@
for (i = 0; i < RTAX_MAX; i++) {
if (addrs & (1 << i)) {
rta[i] = (struct sockaddr_in6 *)q;
- q += rta[i]->sin6_len;
+ q += ROUNDUP(rta[i]->sin6_len);
}
}
@@ -2024,19 +2029,19 @@
rtmp += sin6_dst->sin6_len;
if (rtm->rtm_addrs & RTA_GATEWAY) {
sin6_gw = (struct sockaddr_in6 *)rtmp;
- rtmp += sin6_gw->sin6_len;
+ rtmp += ROUNDUP(sin6_gw->sin6_len);
}
if (rtm->rtm_addrs & RTA_NETMASK) {
sin6_mask = (struct sockaddr_in6 *)rtmp;
- rtmp += sin6_mask->sin6_len;
+ rtmp += ROUNDUP(sin6_mask->sin6_len);
}
if (rtm->rtm_addrs & RTA_GENMASK) {
sin6_genmask = (struct sockaddr_in6 *)rtmp;
- rtmp += sin6_genmask->sin6_len;
+ rtmp += ROUNDUP(sin6_genmask->sin6_len);
}
if (rtm->rtm_addrs & RTA_IFP) {
sin6_ifp = (struct sockaddr_in6 *)rtmp;
- rtmp += sin6_ifp->sin6_len;
+ rtmp += ROUNDUP(sin6_ifp->sin6_len);
}
/* Destination */
@@ -2157,16 +2162,14 @@
if (nflag)
return 0;
+ memset(buf, 0, sizeof(buf));
rtm = (struct rt_msghdr *)buf;
- len = sizeof(struct rt_msghdr) + 3 * sizeof(struct sockaddr_in6);
- memset(rtm, 0, len);
rtm->rtm_type = RTM_ADD;
rtm->rtm_version = RTM_VERSION;
rtm->rtm_seq = ++seq;
rtm->rtm_pid = pid;
rtm->rtm_flags = rrt->rrt_flags & RTF_ROUTE_H;
rtm->rtm_addrs = RTA_DST | RTA_GATEWAY | RTA_NETMASK;
- rtm->rtm_msglen = len;
rtm->rtm_rmx.rmx_hopcount = np->rip6_metric - 1;
rtm->rtm_inits = RTV_HOPCOUNT;
sin = (struct sockaddr_in6 *)&buf[sizeof(struct rt_msghdr)];
@@ -2174,21 +2177,23 @@
sin->sin6_len = sizeof(struct sockaddr_in6);
sin->sin6_family = AF_INET6;
sin->sin6_addr = np->rip6_dest;
- sin++;
+ sin = (struct sockaddr_in6 *)((char *)sin + ROUNDUP(sin->sin6_len));
/* Gateway */
sin->sin6_len = sizeof(struct sockaddr_in6);
sin->sin6_family = AF_INET6;
sin->sin6_addr = *gw;
- sin++;
+ sin = (struct sockaddr_in6 *)((char *)sin + ROUNDUP(sin->sin6_len));
/* Netmask */
sin->sin6_len = sizeof(struct sockaddr_in6);
sin->sin6_family = AF_INET6;
sin->sin6_addr = *(plen2mask(np->rip6_plen));
- sin++;
+ sin = (struct sockaddr_in6 *)((char *)sin + ROUNDUP(sin->sin6_len));
+
+ len = (char *)sin - (char *)buf;
+ rtm->rtm_msglen = len;
if (write(rtsock, buf, len) > 0)
return 0;
-
if (errno == EEXIST) {
trace(0, "ADD: Route already exists %s/%d gw %s\n",
inet6_n2p(&np->rip6_dest), np->rip6_plen, buf1);
@@ -2224,32 +2229,33 @@
if (nflag)
return 0;
+ memset(buf, 0, sizeof(buf));
rtm = (struct rt_msghdr *)buf;
- len = sizeof(struct rt_msghdr) + 3 * sizeof(struct sockaddr_in6);
- memset(rtm, 0, len);
rtm->rtm_type = RTM_DELETE;
rtm->rtm_version = RTM_VERSION;
rtm->rtm_seq = ++seq;
rtm->rtm_pid = pid;
rtm->rtm_flags = RTF_UP | RTF_GATEWAY;
rtm->rtm_addrs = RTA_DST | RTA_GATEWAY | RTA_NETMASK;
- rtm->rtm_msglen = len;
sin = (struct sockaddr_in6 *)&buf[sizeof(struct rt_msghdr)];
/* Destination */
sin->sin6_len = sizeof(struct sockaddr_in6);
sin->sin6_family = AF_INET6;
sin->sin6_addr = np->rip6_dest;
- sin++;
+ sin = (struct sockaddr_in6 *)((char *)sin + ROUNDUP(sin->sin6_len));
/* Gateway */
sin->sin6_len = sizeof(struct sockaddr_in6);
sin->sin6_family = AF_INET6;
sin->sin6_addr = *gw;
- sin++;
+ sin = (struct sockaddr_in6 *)((char *)sin + ROUNDUP(sin->sin6_len));
/* Netmask */
sin->sin6_len = sizeof(struct sockaddr_in6);
sin->sin6_family = AF_INET6;
sin->sin6_addr = *(plen2mask(np->rip6_plen));
- sin++;
+ sin = (struct sockaddr_in6 *)((char *)sin + ROUNDUP(sin->sin6_len));
+
+ len = (char *)sin - (char *)buf;
+ rtm->rtm_msglen = len;
if (write(rtsock, buf, len) >= 0)
return 0;
@@ -2307,8 +2313,10 @@
rtm = (struct rt_msghdr *)buf;
} while (rtm->rtm_seq != myseq || rtm->rtm_pid != pid);
sin = (struct sockaddr_in6 *)&buf[sizeof(struct rt_msghdr)];
- if (rtm->rtm_addrs & RTA_DST)
- sin++;
+ if (rtm->rtm_addrs & RTA_DST) {
+ sin = (struct sockaddr_in6 *)
+ ((char *)sin + ROUNDUP(sin->sin6_len));
+ }
if (rtm->rtm_addrs & RTA_GATEWAY) {
*gw = sin->sin6_addr;
return gw;
@@ -2661,7 +2669,7 @@
u_char *p;
int i;
- p = ia->s6_addr8;
+ p = ia->s6_addr;
for (i = 0; i < 16; i++) {
if (plen <= 0)
*p = 0;
diff -r eb62e959caca -r 5819fd0a93a8 usr.sbin/route6d/route6d.h
--- a/usr.sbin/route6d/route6d.h Fri Sep 03 03:54:47 1999 +0000
+++ b/usr.sbin/route6d/route6d.h Fri Sep 03 04:04:22 1999 +0000
@@ -1,7 +1,7 @@
-/* $NetBSD: route6d.h,v 1.2 1999/07/04 14:45:54 itojun Exp $ */
+/* $NetBSD: route6d.h,v 1.3 1999/09/03 04:04:22 itojun Exp $ */
/*
- * KAME Header: /cvsroot/hydrangea-freebsd/kit/src/route6d/Attic/route6d.h,v 1.1.2.4.4.1.4.1.4.2 1999/06/17 13:00:41 itojun Exp
+ * KAME Header: /cvsroot/kame/kame/kame/kame/route6d/route6d.h,v 1.1.1.1 1999/08/08 23:31:35 itojun Exp
*/
/*
Home |
Main Index |
Thread Index |
Old Index