$OpenBSD: patch-tools_ra6_c,v 1.1 2013/09/26 21:52:36 bluhm Exp $
--- tools/ra6.c.orig	Wed Jul 24 02:48:38 2013
+++ tools/ra6.c	Sun Sep  8 21:34:09 2013
@@ -254,7 +254,6 @@ int main(int argc, char **argv){
 	lifetime= DEFAULT_ROUTER_LIFETIME;
 	reachable= DEFAULT_ROUTER_REACHABLE;
 	retrans= DEFAULT_ROUTER_RETRANS;
-	srandom(time(NULL));
 
 	while((r=getopt_long(argc, argv, shortopts, longopts, NULL)) != -1) {
 		option= r;
@@ -1093,7 +1092,7 @@ int main(int argc, char **argv){
 			srcaddr.s6_addr16[i]=0x0000;	
 	    
 		for(i=4; i<8; i++)
-			srcaddr.s6_addr16[i]=random();
+			srcaddr.s6_addr16[i]=arc4random();
 	}
 
     /*
@@ -1116,8 +1115,7 @@ int main(int argc, char **argv){
 		}
 
 	if(!hsrcaddr_f)		/* Source link-layer address is randomized by default */
-		for(i=0; i<6; i++)
-	 		hsrcaddr.a[i]= random();
+		arc4random_buf(&hsrcaddr, sizeof(struct ether_addr));
 
 	if(!hdstaddr_f)		/* Destination link-layer address defaults to all-nodes */
 		if(ether_pton(ETHER_ALLNODES_LINK_ADDR, &hdstaddr, sizeof(hdstaddr)) == 0){
@@ -1542,7 +1540,7 @@ void send_packet(const u_char *pktdata){
 		ipv6->ip6_src.s6_addr16[i]= 0;
 
 	    for(i=startrand; i<8; i++)
-		ipv6->ip6_src.s6_addr16[i]=random();
+		ipv6->ip6_src.s6_addr16[i]=arc4random();
 
 
 	    if(srcpreflen%16){
@@ -1559,8 +1557,7 @@ void send_packet(const u_char *pktdata){
 		ipv6->ip6_src.s6_addr16[i]= ipv6->ip6_src.s6_addr16[i] | srcaddr.s6_addr16[i];
 
 	    if(!hsrcaddr_f){
-		for(i=0; i<6; i++)
-		    ethernet->src.a[i]= random();
+		arc4random_buf(&ethernet->src, sizeof(struct ether_addr));
 
 		/*
 		   If the source-link layer address must be included, but no value was 
@@ -1634,8 +1631,7 @@ void send_packet(const u_char *pktdata){
 
 		    endrand= (prefixlen[0]+15)/16;
 
-		    for(i=0; i<endrand; i++)
-			prefixopt->nd_opt_pi_prefix.s6_addr16[i]=random();
+		    arc4random_buf(&prefixopt->nd_opt_pi_prefix, endrand<<1);
 
 		    if(prefixlen[0]%16){
 			mask=0;
@@ -1677,8 +1673,7 @@ void send_packet(const u_char *pktdata){
 
 		    endrand= (routelen[0]+15)/16;
 
-		    for(i=0; i<endrand; i++)
-			routeopt->nd_opt_ri_prefix.s6_addr16[i]=random();
+		    arc4random_buf(&routeopt->nd_opt_ri_prefix, endrand<<1);
 
 		    if(routelen[0]%16){
 			mask=0;
@@ -1728,8 +1723,7 @@ void send_packet(const u_char *pktdata){
 			dnsopt->nd_opt_rdnss_lifetime= htonl(rdnsslife[0]);
 
 			for(i=0; i<smaxaddrs && i<nflooddoa && dnsopts<nrdnss; i++, dnsopts++)
-			    for(j=0; j<8; j++)
-				dnsopt->nd_opt_rdnss_addr[i].s6_addr16[j]=random();
+			    arc4random_buf(&dnsopt->nd_opt_rdnss_addr[i], 16);
 		
 			dnsopt->nd_opt_rdnss_len= (sizeof(struct nd_opt_rdnss_l) + \
 							i * sizeof(struct in6_addr))/8;
@@ -1772,7 +1766,7 @@ void send_packet(const u_char *pktdata){
 		
 		memcpy(fptr, (char *) &fraghdr, FRAG_HDR_SIZE);
 		fh= (struct ip6_frag *) fptr;
-		fh->ip6f_ident=random();
+		fh->ip6f_ident=arc4random();
 		startoffragment = fptr + FRAG_HDR_SIZE;
 		/*
 		 * Check that the selected fragment size is not larger than the largest fragment size
