Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 10 May 2010 16:17:24 GMT
From:      Ana Kukec <anchie@FreeBSD.org>
To:        Perforce Change Reviews <perforce@FreeBSD.org>
Subject:   PERFORCE change 178043 for review
Message-ID:  <201005101617.o4AGHO9O018192@repoman.freebsd.org>

next in thread | raw e-mail | index | archive | help
http://p4web.freebsd.org/@@178043?ac=10

Change 178043 by anchie@anchie_malimis on 2010/05/10 16:16:32

	Getting the SEND userland app ready to pack into ports/packages.
	
	The old functionality is preserved in sendd/os-freebsd-netgraph.
	In case of the old code (SEND through netgraph), SND_OS_freebsd
	code won't be triggered, SND_OS_freebsd-netgraph code will be 
	triggered instead.
	
	New functionality related to SEND app through the native SEND API
	and native SEND socket is in sendd/os-freebsd, and in the rest
	of the code that is triggered depending on SND_OS_freebsd variable.	

Affected files ...

.. //depot/projects/soc2009/anchie_send/send_0.2/Makefile#2 edit
.. //depot/projects/soc2009/anchie_send/send_0.2/Makefile.config#3 edit
.. //depot/projects/soc2009/anchie_send/send_0.2/cgatool/cgatool.c#2 edit
.. //depot/projects/soc2009/anchie_send/send_0.2/sendd/net.c#28 edit
.. //depot/projects/soc2009/anchie_send/send_0.2/sendd/os-freebsd-netgraph/Makefile#1 add
.. //depot/projects/soc2009/anchie_send/send_0.2/sendd/os-freebsd-netgraph/addr.c#1 add
.. //depot/projects/soc2009/anchie_send/send_0.2/sendd/os-freebsd-netgraph/netgraph.c#1 add
.. //depot/projects/soc2009/anchie_send/send_0.2/sendd/os-freebsd-netgraph/os_defines.h#1 add
.. //depot/projects/soc2009/anchie_send/send_0.2/sendd/os-freebsd-netgraph/sendd#1 add
.. //depot/projects/soc2009/anchie_send/send_0.2/sendd/os-freebsd-netgraph/snd_freebsd.c#1 add
.. //depot/projects/soc2009/anchie_send/send_0.2/sendd/os-freebsd-netgraph/snd_freebsd.h#1 add
.. //depot/projects/soc2009/anchie_send/send_0.2/sendd/os-freebsd/Makefile#3 edit
.. //depot/projects/soc2009/anchie_send/send_0.2/sendd/os-freebsd/netgraph.c#3 delete
.. //depot/projects/soc2009/anchie_send/send_0.2/sendd/os-freebsd/snd_freebsd.c#4 edit
.. //depot/projects/soc2009/anchie_send/send_0.2/sendd/os-freebsd/snd_freebsd.h#3 edit
.. //depot/projects/soc2009/anchie_send/send_0.2/sendd/proto.c#13 edit
.. //depot/projects/soc2009/anchie_send/send_0.2/sendd/sendd.c#12 edit
.. //depot/projects/soc2009/anchie_send/send_0.2/sendd/sendd_local.h#5 edit

Differences ...

==== //depot/projects/soc2009/anchie_send/send_0.2/Makefile#2 (text+ko) ====


==== //depot/projects/soc2009/anchie_send/send_0.2/Makefile.config#3 (text+ko) ====

@@ -5,6 +5,7 @@
 
 # Uncomment the line for your OS
 #OS=linux
+#OS=freebsd-netgraph
 OS=freebsd
 
 # Linux only: Where is your linux kernel source?

==== //depot/projects/soc2009/anchie_send/send_0.2/cgatool/cgatool.c#2 (text+ko) ====

@@ -902,7 +902,7 @@
 }
 
 static int
-do_select(int cfd)
+do_select_cgatool(int cfd)
 {
 	fd_set fds[1];
 
@@ -1243,7 +1243,7 @@
 		return (1);
 	}
 
-	c = do_select(0);
+	c = do_select_cgatool(0);
 #endif
 	exit(c);
 }

==== //depot/projects/soc2009/anchie_send/send_0.2/sendd/net.c#28 (text+ko) ====

@@ -60,7 +60,9 @@
 #include <sbuff.h>
 
 static int icmp6sock 	= -1;
+#ifdef SND_OS_freebsd
 static int sndsock	= -1;
+#endif
 
 #ifdef	DEBUG
 static struct dlog_desc dbg = {
@@ -70,6 +72,7 @@
 static char abuf[INET6_ADDRSTRLEN];
 #endif
 
+#ifdef SND_OS_freebsd
 /* Per-interface info */
 struct snd_ifinfo {
 	struct list_head list;
@@ -82,14 +85,12 @@
 /* Data packet meta data */
 struct snd_packet_info {
 	struct snd_ifinfo *ifinfo;
-	u_char		rtm_version;
-        u_char		rtm_type;
-        int		rtm_seq;
 	int		in;
 	int		ifidx;
 };
 
 void snd_sock_read(struct snd_ifinfo *p);
+#endif
 
 /* TODO: dynamically size according to MTU */
 struct sbuff *
@@ -97,14 +98,14 @@
 {
 	struct sbuff *b;
 
-	/* 2048 + rt_msghdr */
-	if ((b = sbuff_alloc(SND_MAX_PKT + sizeof(struct rt_msghdr))) == NULL) {
+	if ((b = sbuff_alloc(SND_MAX_PKT)) == NULL) {
 		APPLOG_NOMEM();
 		return (NULL);
 	}
 	return (b);
 }
 
+#ifdef SND_MAX_PKT
 void
 snd_dispatch_fds(fd_set *fds)
 {
@@ -143,7 +144,6 @@
 snd_deliver_pkt(void *p, struct sbuff *b, int drop, int changed)
 {
 	struct snd_packet_info *pi;
-	struct rt_msghdr *rtm;
 	struct snd_hdr *snd_hdr;
 
 	if (drop) {
@@ -152,40 +152,6 @@
 	}
 
 	pi = (struct snd_packet_info *)(b->head);
-
-#if 0
-	DBG(&dbg_snd, "Direction, %s", (pi->rtm_seq == RTM_SND_OUT) ? "SND_OUT" : "SND_IN");
-
-	/* buffer starts with IPv6 hdr, roll back to include rtm header */	
-	b->data -= sizeof (struct rt_msghdr);
-	b->len += sizeof (struct rt_msghdr);
-	//b->data -= sizeof (struct if_announcemsghdr);
-	//b->len += sizeof (struct if_announcemsghdr);
-
-	DBG(&dbg_snd, "%d bytes on %s", b->len, pi->ifinfo->name);
-
-	rtm = sbuff_data(b);
-
-	/* reusing RTM header received from kernel */
-	rtm->rtm_msglen = b->len;
-	rtm->rtm_version = pi->rtm_version;
-        rtm->rtm_type = pi->rtm_type;
-	rtm->rtm_index = pi->ifinfo->ifidx;
-        rtm->rtm_seq = pi->rtm_seq;
-        rtm->rtm_pid = getpid();
-	rtm->rtm_addrs = 0;
-
-	if (rtm->rtm_flags & M_MCAST)
-		DBG(&dbg_snd, "M_MCAST!");
-
-	if (send(sndsock, b->data, b->len, 0) < 0) {
-		DBG(&dbg_snd, "Failed to send routing message back to kernel.");
-		perror("Failed");
-		snd_put_buf(b);
-		return;
-	}
-#endif
-
 	b->data -= SEND_HDR_LEN;
 	b->len += SEND_HDR_LEN;
 	snd_hdr = sbuff_data(b);
@@ -204,6 +170,7 @@
 	return;
 }
 
+
 void
 snd_add_fds(fd_set *fds, int *maxfd, int sock)
 {
@@ -215,6 +182,7 @@
 		FD_SET(p->snds, fds);
 	}
 }
+#endif
 
 int
 freebsd_snd_init(void)
@@ -269,13 +237,12 @@
 	return (0);
 }
 
+#ifdef SND_OS_freebsd
 void
 snd_sock_read(struct snd_ifinfo *p)
 {
 	struct snd_hdr *snd_hdr;
 	int direction;
-	struct rt_msghdr *rtm;
-	struct if_announcemsghdr *ifan;
 	struct sbuff *b;
 	struct snd_packet_info *pi;
 	int n;
@@ -315,60 +282,11 @@
 		applog(LOG_ERR, "Unknown SEND pkt header: unknown direction.");
 	}
 
-#if 0
-	rtm = sbuff_data(b);
-	if (rtm->rtm_version != RTM_VERSION) {
-		applog(LOG_ERR, "%s: Unsupported routing message version.", __FUNCTION__);
-		goto done;
-	}
-
-	switch (rtm->rtm_type) {
-	case RTM_IFANNOUNCE:
-		/* XXX: Do we need this? */
-		DBG(&dbg_snd, "RTM_IFANNOUNCE");
-		break;
-	case RTM_SND:
-		ifan = (struct if_announcemsghdr *)rtm;
-		pi->rtm_version = ifan->ifan_version;
-		pi->rtm_type = ifan->ifan_type;
-		pi->rtm_seq = ifan->ifan_what;
-
-		switch (ifan->ifan_what) {
-		case RTM_SND_IN:
-			applog(LOG_ERR, "RTM_SND_IN");
-			/* n = RTM hdr + SEND message */
-			if (sbuff_pull(b, sizeof (struct if_announcemsghdr)) == NULL) {
-				DBG(&dbg_snd, "invalid pkt (not enough for rtm hedaer");
-				goto done;
-			}
-			pi->ifinfo = p;
-			pi->in = 1;
-			snd_recv_pkt(b, p->ifidx, SND_IN, pi);		
-			break;
-
-		case RTM_SND_OUT:
-			applog(LOG_ERR, "RTM_SND_OUT");
-			/* n = RTM hdr + ip6_hdr + icmp6len */
-			if (sbuff_pull(b, sizeof (struct if_announcemsghdr)) == NULL) {
-				DBG(&dbg_snd, "invalid pkt (not enough for rtm header");
-				goto done;
-			}
-			pi->ifinfo = p;
-			pi->in = 0;
-			snd_recv_pkt(b, p->ifidx, SND_OUT, pi);
-			break;
-		}
-		break;
-	default:
-		applog(LOG_ERR, "%s: Unsupported routing message type.", __FUNCTION__);
-		goto done;
-	}
-#endif
-
 done:
 	/* ToDo: Free memory! */
 	snd_put_buf(b);
 }
+#endif
 
 /*
  * TODO: Linux is not yet up-to-date with rfc3542, specifically in that
@@ -429,9 +347,13 @@
 }
 
 int
+#ifdef SND_OS_freebsd
 snd_net_init(int *icmp6socket, int *sndsocket)
+#else
+snd_net_init(void)
+#endif
 {
-	int v, off;
+	int v;
 	struct icmp6_filter filter;
 #ifdef	DEBUG
 	struct dlog_desc *dbgs[] = {
@@ -443,8 +365,11 @@
 		return (-1);
 	}
 #endif
+#ifdef SND_OS_freebsd
 #define IPPROTO_SEND	259
+#endif
 
+#ifdef SND_OS_freebsd
 	if ((*sndsocket = socket(PF_INET, SOCK_RAW, IPPROTO_SEND)) < 0) {	
 		applog(LOG_ERR, "%s: socket: %s", __FUNCTION__,
 			strerror(errno));
@@ -452,25 +377,16 @@
 	} else {
 		applog(LOG_ERR, "%s: SEND socket created.", __FUNCTION__);
 	}
-
+#endif
 	if ((*icmp6socket = socket(AF_INET6, SOCK_RAW, IPPROTO_ICMPV6)) < 0) {
 		applog(LOG_ERR, "%s: socket: %s", __FUNCTION__,
 		       strerror(errno));
 		return (-1);
 	}
-#if 0
-	if ((*sndsocket = socket(PF_ROUTE, SOCK_RAW, 0)) < 0) {
-		applog(LOG_ERR, "%s: socket: %s", __FUNCTION__,
-			strerror(errno));
-		return(-1);
-	} else {
-		applog(LOG_ERR, "%s: routing socket created.", __FUNCTION__);
-	}  
-#endif
-
+#ifdef SND_OS_freebsd
 	icmp6sock = *icmp6socket;
 	sndsock = *sndsocket;
-
+#endif
 	v = 255;
 	if (setsockopt(icmp6sock, IPPROTO_IPV6, IPV6_UNICAST_HOPS, &v,
 		       sizeof (v)) < 0) {
@@ -486,14 +402,6 @@
 		return (-1);
 	}
 
-	/* Tell the kernel to not send us back our own rt messages. */
-	off = 0;
-	if (setsockopt(sndsock, SOL_SOCKET, SO_USELOOPBACK, &off, sizeof(off)) < 0) {
-		applog(LOG_ERR, "%s: setsock(sndsock, SO_USELOOPBACK, off) "
-			"failed: %s.", __func__, strerror(errno));
-		return(-1);
-	}
-
 	ICMP6_FILTER_SETBLOCKALL(&filter);
 	ICMP6_FILTER_SETPASS(ICMP6_SND_CPS, &filter);
 	ICMP6_FILTER_SETPASS(ICMP6_SND_CPA, &filter);
@@ -506,5 +414,9 @@
 		return (-1);
 	}
 
+#ifdef SND_OS_freebsd
 	return (0);
+#else
+	return(icmp6sock);
+#endif
 }

==== //depot/projects/soc2009/anchie_send/send_0.2/sendd/os-freebsd/Makefile#3 (text+ko) ====

@@ -1,8 +1,8 @@
 
-OBJS += os/addr.o os/snd_freebsd.o os/netgraph.o os-linux/rand.o
+OBJS += os/addr.o os/snd_freebsd.o os-linux/rand.o
 CPPFLAGS +=	-I/usr/local/include
 
-OSLIBS= -lnetgraph -L/usr/local/lib -l$(DNET)
+OSLIBS= -L/usr/local/lib -l$(DNET)
 
 OSEXTRA= os/sendd
 EXTRAINSTALL= /etc/rc.d/sendd

==== //depot/projects/soc2009/anchie_send/send_0.2/sendd/os-freebsd/snd_freebsd.c#4 (text+ko) ====

@@ -44,9 +44,6 @@
 os_specific_init(void)
 {
 	if (linux_rand_init() < 0 || freebsd_snd_init() < 0) {
-#if 0
-	    freebsd_netgraph_init() < 0) {
-#endif
 		return (-1);
 	}
 	return (0);
@@ -55,8 +52,5 @@
 void
 os_specific_fini(void)
 {
-#if 0
-	freebsd_netgraph_fini();
-#endif
 	linux_rand_fini();
 }

==== //depot/projects/soc2009/anchie_send/send_0.2/sendd/os-freebsd/snd_freebsd.h#3 (text+ko) ====

@@ -37,7 +37,5 @@
 
 extern char *freebsd_get_ifs_buf(int *);
 extern int freebsd_ifs_init(int (*cb)(const char *, int));
-extern void freebsd_netgraph_fini(void);
-extern int freebsd_netgraph_init(void);
 
 #endif	/* _SND_FREEBSD_H */

==== //depot/projects/soc2009/anchie_send/send_0.2/sendd/proto.c#13 (text+ko) ====

@@ -383,10 +383,12 @@
 
 	DBG(&dbg, "%s pkt (%d bytes)", drop ? "dropping" : "delivering",
 	    pi->b->len);
-#if 0
+
+#ifdef SND_OS_freebsd
+	snd_deliver_pkt(pi->os_pkt, pi->b, drop, 1);
+#else
 	os_specific_deliver_pkt(pi->os_pkt, pi->b, drop, 1);
 #endif
-	snd_deliver_pkt(pi->os_pkt, pi->b, drop, 1);
 
 	free(pi);
 }
@@ -431,10 +433,11 @@
 	snd_put_cga_params(pi->params);
 	if (sig) free(sig);
 	pi->b->data = pi->start;
-#if 0
+#ifdef SND_OS_freebsd
+	snd_deliver_pkt(pi->os_pkt, pi->b, drop, 1);
+#else
 	os_specific_deliver_pkt(pi->os_pkt, pi->b, drop, 1);
 #endif
-	snd_deliver_pkt(pi->os_pkt, pi->b, drop, 1);
 
 	free(pi);
 }
@@ -576,7 +579,7 @@
 		pi->cga = &pi->iph->ip6_src;
 		break;
 	case ND_ROUTER_ADVERT:
-#if 0
+#ifndef SND_OS_freebsd
 		if (!IN6_IS_ADDR_LINKLOCAL(&pi->iph->ip6_src)) {
 			DBG(&dbg_snd, "RA src addr is not link local");
 			return (0);
@@ -659,18 +662,18 @@
 
 	DBG(&dbg, "%s pkt (%d bytes)", drop ? "dropping" : "delivering",
 	    pi->b->len);
-#if 0
+
+#ifdef SND_OS_freebsd
+	snd_deliver_pkt(pi->os_pkt, pi->b, drop, 1);
+#else
 	os_specific_deliver_pkt(pi->os_pkt, pi->b, drop, 1);
 #endif
-	snd_deliver_pkt(pi->os_pkt, pi->b, drop, 1);
+
 	free(pi);
 }
 
 void
 snd_recv_pkt(struct sbuff *b, int ifidx, int in, void *pkt)
-#if 0
-snd_recv_pkt(struct sbuff *b, int ifidx, int in)
-#endif
 {
 	int tlen, drop = 0;
 	int changed = 0;
@@ -686,7 +689,7 @@
 
 	DBG(&dbg_snd, "pi->ifinfo->ifidx = %d", ifidx);
 
-#if 0
+#ifndef SND_OS_freebsd
 	if (!in)
 		if (sbuff_pull(b, sizeof (struct ether_header)) == NULL) {
 			DBG(&dbg_snd, "invalid pkt (not enough for ether header");
@@ -694,7 +697,6 @@
 		}
 	}
 #endif
-
 	start = sbuff_data(b);
 
 	DBG(&dbg, "%s", in ? "<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<" :
@@ -717,7 +719,6 @@
 		DBG(&dbg_snd, "pkt too small (ip6 hdr)");
 		goto drop;
 	}
-
 	pi->icmp = sbuff_data(b);
 	if (b->len < sizeof (*(pi->icmp))) {
 		DBG(&dbg_snd, "pkt too small (icmp6 hdr)");
@@ -753,7 +754,6 @@
 			drop = 0;
 			goto done;
 		}
-
 		if (snd_parse_opts(&pi->ndopts, sbuff_data(b), b->len) < 0) {
 			goto drop;
 		}
@@ -793,12 +793,11 @@
 	drop = 1;
 done:
 	b->data = start;
-	/*  
-	 * ToDo: The packet is here sent through netgraph. Will be sent back
-	 * to kernel through the input hook. 
-	 */
-	/* os_specific_deliver_pkt(pkt, b, drop, changed); */
+#ifdef SND_OS_freebsd
 	snd_deliver_pkt(pkt, b, drop, changed);
+#else
+	os_specific_deliver_pkt(pkt, b, drop, changed);
+#endif
 }
 
 int
@@ -814,8 +813,6 @@
 		return (-1);
 	}
 #endif
-	applog(LOG_ERR, "snd_proto_init");
-
 	if (snd_proto_nonce_init() < 0 ||
 	    snd_proto_timestamp_init() < 0) {
 		return (-1);

==== //depot/projects/soc2009/anchie_send/send_0.2/sendd/sendd.c#12 (text+ko) ====

@@ -78,7 +78,11 @@
 }
 
 static int
+#ifdef SND_OS_freebsd
 do_select(int icmps, int snds, int ctlfd)
+#else
+do_select(int icmps, int ctlfd)
+#endif
 {
 	fd_set fds[1];
 	int maxfd = -1;
@@ -87,16 +91,19 @@
 	if (cfd != -1) maxfd = cfd;
 	maxfd = sendd_max(icmps, maxfd);
 	maxfd = sendd_max(ctlfd, maxfd);
+#ifdef SND_OS_freebsd
 	maxfd = sendd_max(snds, maxfd);
-
+#endif
 	for (;;) {
 		FD_ZERO(fds);
 		if (cfd != -1) FD_SET(cfd, fds);
 		FD_SET(icmps, fds);
 		FD_SET(ctlfd, fds);
-		/* Routing socket instead of using netgraph for ND/SeND */
-		/* os_specific_add_fds(fds, &maxfd); */
+#ifdef SND_OS_freebsd
 		snd_add_fds(fds, &maxfd, snds);
+#else
+		os_specific_add_fds(fds, &maxfd);
+#endif
 		DBG(&snd_dbg, "after snd_add_fds");
 
 		tv = get_next_wait(tvb);
@@ -124,10 +131,11 @@
 		if (FD_ISSET(ctlfd, fds)) {
 			snd_ctl_read(ctlfd);
 		}
-#if 0
+#ifdef SND_OS_freebsd
+		snd_dispatch_fds(fds);
+#else
 		os_specific_dispatch_fds(fds);
 #endif
-		snd_dispatch_fds(fds);
 		snd_replace_non_cga_linklocals();
 	}
 }
@@ -162,7 +170,7 @@
 {
 	const char **lm = applog_get_methods();
 
-	fprintf(stderr, "---> Usage: %s [-fV] [-c <conf>] [-i <iface>] "
+	fprintf(stderr, "Usage: %s [-fV] [-c <conf>] [-i <iface>] "
 		"[-l <log method>]\n", this);
 	fprintf(stderr, "  log methods: ");
 	for (; *lm; lm++) {
@@ -174,11 +182,15 @@
 int
 main(int argc, char **argv)
 {
-	int r, c, icmps, snds, ctlfd, do_daemon = 1;
+	int r, c, icmps, ctlfd, do_daemon = 1;
+#ifdef SND_OS_freebsd
+	int snds;
+#endif
 	char *cfile = SNDD_CONF_FILE;
 
+#ifdef SND_OS_freebsd
 	icmps = snds = (int *) malloc(sizeof(int));
-
+#endif
 #ifdef	DEBUG
 	if (applog_open(L_STDERR, SENDD_NAME) < 0) {
 		exit(1);
@@ -250,9 +262,13 @@
 	    snd_ssl_init() < 0 ||
 	    snd_cga_init() < 0 ||
 	    snd_params_init() < 0 ||
+#ifdef SND_OS_freebsd
 	    snd_net_init(&icmps, &snds) < 0 ||
 	    icmps < 0 ||
 	    snds < 0 ||
+#else
+	    (icmps = snd_net_init()) < 0 ||
+#endif
 	    snd_init_cert() < 0 ||
 	    snd_pkixip_config() < 0 ||
 	    snd_proto_init() < 0 ||
@@ -280,8 +296,11 @@
 		cfd = 0;
 	}
 #endif
-
+#ifdef SND_OS_freebsd
 	r = do_select(icmps, snds, ctlfd);
+#else
+	r = do_select(icmps, ctlfd);
+#endif
 
 	snd_cleanup();
 	exit(r);

==== //depot/projects/soc2009/anchie_send/send_0.2/sendd/sendd_local.h#5 (text+ko) ====

@@ -130,7 +130,11 @@
 
 /* net.c */
 extern void snd_icmp_sock_read(void);
+#ifdef SND_OS_freebsd
 extern int snd_net_init(int *, int *);
+#else
+extern int snd_net_init(void);
+#endif
 extern struct sbuff *snd_get_buf(void);
 extern void snd_put_buf(struct sbuff *);
 extern int snd_send_icmp(struct sbuff *, struct sockaddr_in6 *, int);



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201005101617.o4AGHO9O018192>