summaryrefslogtreecommitdiffstats
path: root/usr.sbin/rtsold/rtsol.c
diff options
context:
space:
mode:
authorume <ume@FreeBSD.org>2003-08-17 11:11:32 +0000
committerume <ume@FreeBSD.org>2003-08-17 11:11:32 +0000
commite63e485957ca75728d14f0f841a255c547024105 (patch)
tree71f0ce4c364fa35219a41194d4e21717734ebb58 /usr.sbin/rtsold/rtsol.c
parentd21c6d5071dfec3042de4b42f1f7754eeb80247b (diff)
downloadFreeBSD-src-e63e485957ca75728d14f0f841a255c547024105.zip
FreeBSD-src-e63e485957ca75728d14f0f841a255c547024105.tar.gz
- improved the -a option. it can probe a interface automatically when
the interface wake up. it can be started anytime even when there is no network interface on the list of intarfaces in the kernel. - get a correct link ID for each interface at initialization (using scope libraries if HAVE_SCOPELIB is defined). - fill in sin6_scope_id correctly before sendmsg(). Obtained from: KAME MFC after: 1 week
Diffstat (limited to 'usr.sbin/rtsold/rtsol.c')
-rw-r--r--usr.sbin/rtsold/rtsol.c34
1 files changed, 18 insertions, 16 deletions
diff --git a/usr.sbin/rtsold/rtsol.c b/usr.sbin/rtsold/rtsol.c
index cbcad8a..4605016 100644
--- a/usr.sbin/rtsold/rtsol.c
+++ b/usr.sbin/rtsold/rtsol.c
@@ -1,4 +1,4 @@
-/* $KAME: rtsol.c,v 1.12 2001/11/12 11:47:11 jinmei Exp $ */
+/* $KAME: rtsol.c,v 1.26 2003/05/27 06:48:27 jinmei Exp $ */
/*
* Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
@@ -35,7 +35,6 @@
#include <sys/socket.h>
#include <sys/uio.h>
#include <sys/time.h>
-#include <fcntl.h>
#include <sys/queue.h>
#include <sys/wait.h>
#include <sys/stat.h>
@@ -52,6 +51,7 @@
#include <arpa/inet.h>
#include <time.h>
+#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
#include <err.h>
@@ -68,6 +68,7 @@ static struct msghdr sndmhdr;
static struct iovec rcviov[2];
static struct iovec sndiov[2];
static struct sockaddr_in6 from;
+static int rcvcmsglen;
int rssock;
@@ -80,11 +81,10 @@ static int safefile __P((const char *));
int
sockopen()
{
- int on;
- struct icmp6_filter filt;
- static u_char answer[1500];
- int rcvcmsglen, sndcmsglen;
static u_char *rcvcmsgbuf = NULL, *sndcmsgbuf = NULL;
+ int sndcmsglen, on;
+ static u_char answer[1500];
+ struct icmp6_filter filt;
sndcmsglen = rcvcmsglen = CMSG_SPACE(sizeof(struct in6_pktinfo)) +
CMSG_SPACE(sizeof(int));
@@ -163,11 +163,9 @@ sockopen()
rcviov[0].iov_base = (caddr_t)answer;
rcviov[0].iov_len = sizeof(answer);
rcvmhdr.msg_name = (caddr_t)&from;
- rcvmhdr.msg_namelen = sizeof(from);
rcvmhdr.msg_iov = rcviov;
rcvmhdr.msg_iovlen = 1;
rcvmhdr.msg_control = (caddr_t) rcvcmsgbuf;
- rcvmhdr.msg_controllen = rcvcmsglen;
/* initialize msghdr for sending packets */
sndmhdr.msg_namelen = sizeof(struct sockaddr_in6);
@@ -186,8 +184,12 @@ sendpacket(struct ifinfo *ifinfo)
struct cmsghdr *cm;
int hoplimit = 255;
int i;
+ struct sockaddr_in6 dst;
+
+ dst = sin6_allrouters;
+ dst.sin6_scope_id = ifinfo->linkid;
- sndmhdr.msg_name = (caddr_t)&sin6_allrouters;
+ sndmhdr.msg_name = (caddr_t)&dst;
sndmhdr.msg_iov[0].iov_base = (caddr_t)ifinfo->rs_data;
sndmhdr.msg_iov[0].iov_len = ifinfo->rs_datalen;
@@ -228,17 +230,17 @@ sendpacket(struct ifinfo *ifinfo)
void
rtsol_input(int s)
{
- int i;
- int *hlimp = NULL;
- struct icmp6_hdr *icp;
- int ifindex = 0;
- struct cmsghdr *cm;
+ u_char ntopbuf[INET6_ADDRSTRLEN], ifnamebuf[IFNAMSIZ];
+ int ifindex = 0, i, *hlimp = NULL;
struct in6_pktinfo *pi = NULL;
struct ifinfo *ifi = NULL;
+ struct icmp6_hdr *icp;
struct nd_router_advert *nd_ra;
- u_char ntopbuf[INET6_ADDRSTRLEN], ifnamebuf[IFNAMSIZ];
+ struct cmsghdr *cm;
- /* get message */
+ /* get message. namelen and controllen must always be initialized. */
+ rcvmhdr.msg_namelen = sizeof(from);
+ rcvmhdr.msg_controllen = rcvcmsglen;
if ((i = recvmsg(s, &rcvmhdr, 0)) < 0) {
warnmsg(LOG_ERR, __func__, "recvmsg: %s", strerror(errno));
return;
OpenPOWER on IntegriCloud