Deleted Added
full compact
rrenumd.c (68905) rrenumd.c (78064)
1/* $KAME$ */
1/* $KAME: rrenumd.c,v 1.20 2000/11/08 02:40:53 itojun Exp $ */
2
3/*
4 * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
5 * All rights reserved.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
9 * are met:

--- 13 unchanged lines hidden (view full) ---

23 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
25 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
26 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
27 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
28 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
29 * SUCH DAMAGE.
30 *
2
3/*
4 * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
5 * All rights reserved.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
9 * are met:

--- 13 unchanged lines hidden (view full) ---

23 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
25 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
26 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
27 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
28 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
29 * SUCH DAMAGE.
30 *
31 * $FreeBSD: head/usr.sbin/rrenumd/rrenumd.c 68905 2000-11-19 13:30:36Z kris $
31 * $FreeBSD: head/usr.sbin/rrenumd/rrenumd.c 78064 2001-06-11 12:39:29Z ume $
32 */
33
34#include <sys/param.h>
35#include <sys/socket.h>
36#include <sys/uio.h>
37#include <sys/time.h>
38
39#include <string.h>

--- 19 unchanged lines hidden (view full) ---

59#include <unistd.h>
60#include <syslog.h>
61
62#include "rrenumd.h"
63
64#define LL_ALLROUTERS "ff02::2"
65#define SL_ALLROUTERS "ff05::2"
66
32 */
33
34#include <sys/param.h>
35#include <sys/socket.h>
36#include <sys/uio.h>
37#include <sys/time.h>
38
39#include <string.h>

--- 19 unchanged lines hidden (view full) ---

59#include <unistd.h>
60#include <syslog.h>
61
62#include "rrenumd.h"
63
64#define LL_ALLROUTERS "ff02::2"
65#define SL_ALLROUTERS "ff05::2"
66
67#define RR_MCHLIM_DEFAULT 64
68
67#ifndef IN6_IS_SCOPE_LINKLOCAL
68#define IN6_IS_SCOPE_LINKLOCAL(a) \
69 ((IN6_IS_ADDR_LINKLOCAL(a)) || \
70 (IN6_IS_ADDR_MC_LINKLOCAL(a)))
71#endif /* IN6_IS_SCOPE_LINKLOCAL */
72
73struct flags {
74 u_long debug : 1;

--- 13 unchanged lines hidden (view full) ---

88struct sockaddr_in6 from;
89struct sockaddr_in6 sin6_ll_allrouters;
90
91int s4, s6;
92int with_v4dest, with_v6dest;
93struct in6_addr prefix; /* ADHOC */
94int prefixlen = 64; /* ADHOC */
95
69#ifndef IN6_IS_SCOPE_LINKLOCAL
70#define IN6_IS_SCOPE_LINKLOCAL(a) \
71 ((IN6_IS_ADDR_LINKLOCAL(a)) || \
72 (IN6_IS_ADDR_MC_LINKLOCAL(a)))
73#endif /* IN6_IS_SCOPE_LINKLOCAL */
74
75struct flags {
76 u_long debug : 1;

--- 13 unchanged lines hidden (view full) ---

90struct sockaddr_in6 from;
91struct sockaddr_in6 sin6_ll_allrouters;
92
93int s4, s6;
94int with_v4dest, with_v6dest;
95struct in6_addr prefix; /* ADHOC */
96int prefixlen = 64; /* ADHOC */
97
96extern int parse(FILE **fp);
98extern int parse __P((FILE **));
97
99
100static void show_usage __P((void));
101static void init_sin6 __P((struct sockaddr_in6 *, const char *));
102#if 0
103static void join_multi __P((const char *));
104#endif
105static void init_globals __P((void));
106static void config __P((FILE **));
107#ifdef IPSEC_POLICY_IPSEC
108static void sock6_open __P((struct flags *, char *));
109static void sock4_open __P((struct flags *, char *));
110#else
111static void sock6_open __P((struct flags *));
112static void sock4_open __P((struct flags *));
113#endif
114static void rrenum_output __P((struct payload_list *, struct dst_list *));
115static void rrenum_snd_eachdst __P((struct payload_list *));
116#if 0
117static void rrenum_snd_fullsequence __P((void));
118#endif
119static void rrenum_input __P((int));
120int main __P((int, char *[]));
121
122
98/* Print usage. Don't call this after daemonized. */
99static void
100show_usage()
101{
102 fprintf(stderr, "usage: rrenumd [-c conf_file|-s] [-df"
103#ifdef IPSEC
104#ifdef IPSEC_POLICY_IPSEC
105 "] [-P policy"
106#else /* IPSEC_POLICY_IPSEC */
107 "AE"
108#endif /* IPSEC_POLICY_IPSEC */
109#endif /* IPSEC */
110 "]\n");
111 exit(1);
112}
113
123/* Print usage. Don't call this after daemonized. */
124static void
125show_usage()
126{
127 fprintf(stderr, "usage: rrenumd [-c conf_file|-s] [-df"
128#ifdef IPSEC
129#ifdef IPSEC_POLICY_IPSEC
130 "] [-P policy"
131#else /* IPSEC_POLICY_IPSEC */
132 "AE"
133#endif /* IPSEC_POLICY_IPSEC */
134#endif /* IPSEC */
135 "]\n");
136 exit(1);
137}
138
114void
139static void
115init_sin6(struct sockaddr_in6 *sin6, const char *addr_ascii)
116{
117 memset(sin6, 0, sizeof(*sin6));
118 sin6->sin6_len = sizeof(*sin6);
119 sin6->sin6_family = AF_INET6;
120 if (inet_pton(AF_INET6, addr_ascii, &sin6->sin6_addr) != 1)
121 ; /* XXX do something */
122}
123
124#if 0 /* XXX: not necessary ?? */
140init_sin6(struct sockaddr_in6 *sin6, const char *addr_ascii)
141{
142 memset(sin6, 0, sizeof(*sin6));
143 sin6->sin6_len = sizeof(*sin6);
144 sin6->sin6_family = AF_INET6;
145 if (inet_pton(AF_INET6, addr_ascii, &sin6->sin6_addr) != 1)
146 ; /* XXX do something */
147}
148
149#if 0 /* XXX: not necessary ?? */
125void
150static void
126join_multi(const char *addrname)
127{
128 struct ipv6_mreq mreq;
129
130 if (inet_pton(AF_INET6, addrname, &mreq.ipv6mr_multiaddr.s6_addr)
131 != 1) {
132 syslog(LOG_ERR, "<%s> inet_pton failed(library bug?)",
133 __FUNCTION__);

--- 12 unchanged lines hidden (view full) ---

146 syslog(LOG_ERR, "<%s> IPV6_JOIN_GROUP on %s: %s",
147 __FUNCTION__, ifname, strerror(errno));
148 exit(1);
149 }
150 }
151}
152#endif
153
151join_multi(const char *addrname)
152{
153 struct ipv6_mreq mreq;
154
155 if (inet_pton(AF_INET6, addrname, &mreq.ipv6mr_multiaddr.s6_addr)
156 != 1) {
157 syslog(LOG_ERR, "<%s> inet_pton failed(library bug?)",
158 __FUNCTION__);

--- 12 unchanged lines hidden (view full) ---

171 syslog(LOG_ERR, "<%s> IPV6_JOIN_GROUP on %s: %s",
172 __FUNCTION__, ifname, strerror(errno));
173 exit(1);
174 }
175 }
176}
177#endif
178
154void
179static void
155init_globals()
156{
157 static struct iovec rcviov;
158 static u_char rprdata[4500]; /* maximal MTU of connected links */
159 static u_char *rcvcmsgbuf = NULL;
160 static u_char *sndcmsgbuf = NULL;
161 int sndcmsglen, rcvcmsglen;
162

--- 25 unchanged lines hidden (view full) ---

188 (sndcmsgbuf = (u_char *)malloc(sndcmsglen)) == NULL) {
189 syslog(LOG_ERR, "<%s>: malloc failed", __FUNCTION__);
190 exit(1);
191 }
192 sndmhdr.msg_control = (caddr_t)sndcmsgbuf;
193 sndmhdr.msg_controllen = sndcmsglen;
194}
195
180init_globals()
181{
182 static struct iovec rcviov;
183 static u_char rprdata[4500]; /* maximal MTU of connected links */
184 static u_char *rcvcmsgbuf = NULL;
185 static u_char *sndcmsgbuf = NULL;
186 int sndcmsglen, rcvcmsglen;
187

--- 25 unchanged lines hidden (view full) ---

213 (sndcmsgbuf = (u_char *)malloc(sndcmsglen)) == NULL) {
214 syslog(LOG_ERR, "<%s>: malloc failed", __FUNCTION__);
215 exit(1);
216 }
217 sndmhdr.msg_control = (caddr_t)sndcmsgbuf;
218 sndmhdr.msg_controllen = sndcmsglen;
219}
220
196void
221static void
197config(FILE **fpp)
198{
199 struct payload_list *pl;
200 struct iovec *iov;
201 struct icmp6_router_renum *irr;
202 struct rr_pco_match *rpm;
203
204 if (parse(fpp) < 0) {

--- 26 unchanged lines hidden (view full) ---

231 rpm->rpm_ordinal = 0;
232 iov->iov_base = (caddr_t)irr;
233 iov->iov_len = sizeof(struct icmp6_router_renum)
234 + sizeof(struct rr_pco_match)
235 + sizeof(struct rr_pco_use);
236 }
237}
238
222config(FILE **fpp)
223{
224 struct payload_list *pl;
225 struct iovec *iov;
226 struct icmp6_router_renum *irr;
227 struct rr_pco_match *rpm;
228
229 if (parse(fpp) < 0) {

--- 26 unchanged lines hidden (view full) ---

256 rpm->rpm_ordinal = 0;
257 iov->iov_base = (caddr_t)irr;
258 iov->iov_len = sizeof(struct icmp6_router_renum)
259 + sizeof(struct rr_pco_match)
260 + sizeof(struct rr_pco_use);
261 }
262}
263
239void
264static void
240sock6_open(struct flags *flags
241#ifdef IPSEC_POLICY_IPSEC
242 , char *policy
243#endif /* IPSEC_POLICY_IPSEC */
244 )
245{
246 struct icmp6_filter filt;
247 int on;

--- 44 unchanged lines hidden (view full) ---

292 if (flags->policy) {
293 char *buf;
294 buf = ipsec_set_policy(policy, strlen(policy));
295 if (buf == NULL)
296 errx(1, "%s", ipsec_strerror());
297 /* XXX should handle in/out bound policy. */
298 if (setsockopt(s6, IPPROTO_IPV6, IPV6_IPSEC_POLICY,
299 buf, ipsec_get_policylen(buf)) < 0)
265sock6_open(struct flags *flags
266#ifdef IPSEC_POLICY_IPSEC
267 , char *policy
268#endif /* IPSEC_POLICY_IPSEC */
269 )
270{
271 struct icmp6_filter filt;
272 int on;

--- 44 unchanged lines hidden (view full) ---

317 if (flags->policy) {
318 char *buf;
319 buf = ipsec_set_policy(policy, strlen(policy));
320 if (buf == NULL)
321 errx(1, "%s", ipsec_strerror());
322 /* XXX should handle in/out bound policy. */
323 if (setsockopt(s6, IPPROTO_IPV6, IPV6_IPSEC_POLICY,
324 buf, ipsec_get_policylen(buf)) < 0)
300 err(1, NULL);
325 err(1, "setsockopt(IPV6_IPSEC_POLICY)");
301 free(buf);
302 }
303#else /* IPSEC_POLICY_IPSEC */
304 if (flags->auth) {
305 optval = IPSEC_LEVEL_REQUIRE;
306 if (setsockopt(s6, IPPROTO_IPV6, IPV6_AUTH_TRANS_LEVEL,
307 &optval, sizeof(optval)) == -1) {
308 syslog(LOG_ERR, "<%s> IPV6_AUTH_TRANS_LEVEL: %s",

--- 11 unchanged lines hidden (view full) ---

320 }
321 }
322#endif /* IPSEC_POLICY_IPSEC */
323#endif /* IPSEC */
324
325 return;
326}
327
326 free(buf);
327 }
328#else /* IPSEC_POLICY_IPSEC */
329 if (flags->auth) {
330 optval = IPSEC_LEVEL_REQUIRE;
331 if (setsockopt(s6, IPPROTO_IPV6, IPV6_AUTH_TRANS_LEVEL,
332 &optval, sizeof(optval)) == -1) {
333 syslog(LOG_ERR, "<%s> IPV6_AUTH_TRANS_LEVEL: %s",

--- 11 unchanged lines hidden (view full) ---

345 }
346 }
347#endif /* IPSEC_POLICY_IPSEC */
348#endif /* IPSEC */
349
350 return;
351}
352
328void
353static void
329sock4_open(struct flags *flags
330#ifdef IPSEC_POLICY_IPSEC
331 , char *policy
332#endif /* IPSEC_POLICY_IPSEC */
333 )
334{
335#ifdef IPSEC
336#ifndef IPSEC_POLICY_IPSEC

--- 21 unchanged lines hidden (view full) ---

358 if (flags->policy) {
359 char *buf;
360 buf = ipsec_set_policy(policy, strlen(policy));
361 if (buf == NULL)
362 errx(1, "%s", ipsec_strerror());
363 /* XXX should handle in/out bound policy. */
364 if (setsockopt(s4, IPPROTO_IP, IP_IPSEC_POLICY,
365 buf, ipsec_get_policylen(buf)) < 0)
354sock4_open(struct flags *flags
355#ifdef IPSEC_POLICY_IPSEC
356 , char *policy
357#endif /* IPSEC_POLICY_IPSEC */
358 )
359{
360#ifdef IPSEC
361#ifndef IPSEC_POLICY_IPSEC

--- 21 unchanged lines hidden (view full) ---

383 if (flags->policy) {
384 char *buf;
385 buf = ipsec_set_policy(policy, strlen(policy));
386 if (buf == NULL)
387 errx(1, "%s", ipsec_strerror());
388 /* XXX should handle in/out bound policy. */
389 if (setsockopt(s4, IPPROTO_IP, IP_IPSEC_POLICY,
390 buf, ipsec_get_policylen(buf)) < 0)
366 err(1, NULL);
391 err(1, "setsockopt(IP_IPSEC_POLICY)");
367 free(buf);
368 }
369#else /* IPSEC_POLICY_IPSEC */
370 if (flags->auth) {
371 optval = IPSEC_LEVEL_REQUIRE;
372 if (setsockopt(s4, IPPROTO_IP, IP_AUTH_TRANS_LEVEL,
373 &optval, sizeof(optval)) == -1) {
374 syslog(LOG_ERR, "<%s> IP_AUTH_TRANS_LEVEL: %s",

--- 11 unchanged lines hidden (view full) ---

386 }
387 }
388#endif /* IPSEC_POLICY_IPSEC */
389#endif /* IPSEC */
390
391 return;
392}
393
392 free(buf);
393 }
394#else /* IPSEC_POLICY_IPSEC */
395 if (flags->auth) {
396 optval = IPSEC_LEVEL_REQUIRE;
397 if (setsockopt(s4, IPPROTO_IP, IP_AUTH_TRANS_LEVEL,
398 &optval, sizeof(optval)) == -1) {
399 syslog(LOG_ERR, "<%s> IP_AUTH_TRANS_LEVEL: %s",

--- 11 unchanged lines hidden (view full) ---

411 }
412 }
413#endif /* IPSEC_POLICY_IPSEC */
414#endif /* IPSEC */
415
416 return;
417}
418
394void
419static void
395rrenum_output(struct payload_list *pl, struct dst_list *dl)
396{
397 int i, msglen = 0;
398 struct cmsghdr *cm;
399 struct in6_pktinfo *pi;
400 struct sockaddr_in6 *sin6 = NULL;
401
402 sndmhdr.msg_name = (caddr_t)dl->dl_dst;
403 if (dl->dl_dst->sa_family == AF_INET6)
404 sin6 = (struct sockaddr_in6 *)dl->dl_dst;
405
406 if (sin6 != NULL &&
420rrenum_output(struct payload_list *pl, struct dst_list *dl)
421{
422 int i, msglen = 0;
423 struct cmsghdr *cm;
424 struct in6_pktinfo *pi;
425 struct sockaddr_in6 *sin6 = NULL;
426
427 sndmhdr.msg_name = (caddr_t)dl->dl_dst;
428 if (dl->dl_dst->sa_family == AF_INET6)
429 sin6 = (struct sockaddr_in6 *)dl->dl_dst;
430
431 if (sin6 != NULL &&
407 IN6_IS_SCOPE_LINKLOCAL(&sin6->sin6_addr)) {
408 int hoplimit = 255;
432 IN6_IS_ADDR_MULTICAST(&sin6->sin6_addr)) {
433 int hoplimit = RR_MCHLIM_DEFAULT;
409
410 cm = CMSG_FIRSTHDR(&sndmhdr);
411 /* specify the outgoing interface */
412 cm->cmsg_level = IPPROTO_IPV6;
413 cm->cmsg_type = IPV6_PKTINFO;
414 cm->cmsg_len = CMSG_LEN(sizeof(struct in6_pktinfo));
415 pi = (struct in6_pktinfo *)CMSG_DATA(cm);
416 memset(&pi->ipi6_addr, 0, sizeof(pi->ipi6_addr)); /*XXX*/

--- 16 unchanged lines hidden (view full) ---

433 sndmhdr.msg_iov = &pl->pl_sndiov;
434 i = sendmsg(dl->dl_dst->sa_family == AF_INET ? s4 : s6, &sndmhdr, 0);
435
436 if (i < 0 || i != sndmhdr.msg_iov->iov_len)
437 syslog(LOG_ERR, "<%s> sendmsg: %s", __FUNCTION__,
438 strerror(errno));
439}
440
434
435 cm = CMSG_FIRSTHDR(&sndmhdr);
436 /* specify the outgoing interface */
437 cm->cmsg_level = IPPROTO_IPV6;
438 cm->cmsg_type = IPV6_PKTINFO;
439 cm->cmsg_len = CMSG_LEN(sizeof(struct in6_pktinfo));
440 pi = (struct in6_pktinfo *)CMSG_DATA(cm);
441 memset(&pi->ipi6_addr, 0, sizeof(pi->ipi6_addr)); /*XXX*/

--- 16 unchanged lines hidden (view full) ---

458 sndmhdr.msg_iov = &pl->pl_sndiov;
459 i = sendmsg(dl->dl_dst->sa_family == AF_INET ? s4 : s6, &sndmhdr, 0);
460
461 if (i < 0 || i != sndmhdr.msg_iov->iov_len)
462 syslog(LOG_ERR, "<%s> sendmsg: %s", __FUNCTION__,
463 strerror(errno));
464}
465
441void
466static void
442rrenum_snd_eachdst(struct payload_list *pl)
443{
444 struct dst_list *dl;
445
446 for (dl = dl_head; dl; dl = dl->dl_next) {
447 rrenum_output(pl, dl);
448 }
449}
450
467rrenum_snd_eachdst(struct payload_list *pl)
468{
469 struct dst_list *dl;
470
471 for (dl = dl_head; dl; dl = dl->dl_next) {
472 rrenum_output(pl, dl);
473 }
474}
475
451void
476#if 0
477static void
452rrenum_snd_fullsequence()
453{
454 struct payload_list *pl;
455
456 for (pl = pl_head; pl; pl = pl->pl_next) {
457 rrenum_snd_eachdst(pl);
458 }
459}
478rrenum_snd_fullsequence()
479{
480 struct payload_list *pl;
481
482 for (pl = pl_head; pl; pl = pl->pl_next) {
483 rrenum_snd_eachdst(pl);
484 }
485}
486#endif
460
487
461void
488static void
462rrenum_input(int s)
463{
464 int i;
465 struct icmp6_router_renum *rr;
466
467 /* get message */
468 if ((i = recvmsg(s, &rcvmhdr, 0)) < 0) {
469 syslog(LOG_ERR, "<%s> recvmsg: %s", __FUNCTION__,

--- 128 unchanged lines hidden (view full) ---

598 if (with_v4dest) {
599 FD_SET(s4, &fdset);
600 if (s4 > maxfd)
601 maxfd = s4;
602 }
603
604 /* ADHOC: timeout each 30seconds */
605 memset(&timeout, 0, sizeof(timeout));
489rrenum_input(int s)
490{
491 int i;
492 struct icmp6_router_renum *rr;
493
494 /* get message */
495 if ((i = recvmsg(s, &rcvmhdr, 0)) < 0) {
496 syslog(LOG_ERR, "<%s> recvmsg: %s", __FUNCTION__,

--- 128 unchanged lines hidden (view full) ---

625 if (with_v4dest) {
626 FD_SET(s4, &fdset);
627 if (s4 > maxfd)
628 maxfd = s4;
629 }
630
631 /* ADHOC: timeout each 30seconds */
632 memset(&timeout, 0, sizeof(timeout));
606 timeout.tv_sec = 30;
607
633
608 /* init temporal payload_list and send_counter*/
634 /* init temporary payload_list and send_counter*/
609 pl = pl_head;
610 send_counter = retry + 1;
611 while (1) {
612 struct fd_set select_fd = fdset; /* reinitialize */
613
614 if ((i = select(maxfd + 1, &select_fd, NULL, NULL,
615 &timeout)) < 0){
616 syslog(LOG_ERR, "<%s> select: %s",
617 __FUNCTION__, strerror(errno));
618 continue;
619 }
620 if (i == 0) { /* timeout */
621 if (pl == NULL)
622 exit(0);
623 rrenum_snd_eachdst(pl);
624 send_counter--;
635 pl = pl_head;
636 send_counter = retry + 1;
637 while (1) {
638 struct fd_set select_fd = fdset; /* reinitialize */
639
640 if ((i = select(maxfd + 1, &select_fd, NULL, NULL,
641 &timeout)) < 0){
642 syslog(LOG_ERR, "<%s> select: %s",
643 __FUNCTION__, strerror(errno));
644 continue;
645 }
646 if (i == 0) { /* timeout */
647 if (pl == NULL)
648 exit(0);
649 rrenum_snd_eachdst(pl);
650 send_counter--;
651 timeout.tv_sec = 30;
625 if (send_counter == 0) {
652 if (send_counter == 0) {
653 timeout.tv_sec = 0;
626 pl = pl->pl_next;
627 send_counter = retry + 1;
628 }
629 }
630 if (FD_ISSET(s4, &select_fd))
631 rrenum_input(s4);
632 if (FD_ISSET(s6, &select_fd))
633 rrenum_input(s6);
634 }
635}
654 pl = pl->pl_next;
655 send_counter = retry + 1;
656 }
657 }
658 if (FD_ISSET(s4, &select_fd))
659 rrenum_input(s4);
660 if (FD_ISSET(s6, &select_fd))
661 rrenum_input(s6);
662 }
663}