Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 11 Aug 2010 21:54:02 GMT
From:      Ana Kukec <anchie@FreeBSD.org>
To:        Perforce Change Reviews <perforce@FreeBSD.org>
Subject:   PERFORCE change 182273 for review
Message-ID:  <201008112154.o7BLs2d2030260@skunkworks.freebsd.org>

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

Change 182273 by anchie@anchie_malimis on 2010/08/11 21:53:22

	Reorganization of sendd due to the cleanup of unnecessary duplicate
	code (e.g. removing OS_SND_freebsd lines). Aiming for keeping sendd 
	code as close as possible to the original DoCoMo's code.

Affected files ...

.. //depot/projects/soc2009/anchie_send/send_0.2/sendd/addr.c#3 edit
.. //depot/projects/soc2009/anchie_send/send_0.2/sendd/net.c#30 edit
.. //depot/projects/soc2009/anchie_send/send_0.2/sendd/os-freebsd/addr.c#4 edit
.. //depot/projects/soc2009/anchie_send/send_0.2/sendd/os-freebsd/snd_freebsd.c#5 edit
.. //depot/projects/soc2009/anchie_send/send_0.2/sendd/os-freebsd/snd_freebsd.h#4 edit
.. //depot/projects/soc2009/anchie_send/send_0.2/sendd/os/addr.c#1 add
.. //depot/projects/soc2009/anchie_send/send_0.2/sendd/os/snd_freebsd.h#1 add
.. //depot/projects/soc2009/anchie_send/send_0.2/sendd/os_specific.h#7 edit
.. //depot/projects/soc2009/anchie_send/send_0.2/sendd/proto.c#14 edit
.. //depot/projects/soc2009/anchie_send/send_0.2/sendd/sendd.c#13 edit

Differences ...

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

@@ -281,14 +281,9 @@
 		return (0);
 	}
 
-	/*
 	if (os_specific_handle_iface(entry->intf_name, ifidx) < 0) {
 		return (-1);
 	}
-	*/
-	if (snd_handle_iface(entry->intf_name, ifidx) < 0) {
-		return (-1);
-	}
 
 	intf_cfg_addr(&entry->intf_addr, ifidx);
 

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

@@ -72,26 +72,6 @@
 static char abuf[INET6_ADDRSTRLEN];
 #endif
 
-#ifdef SND_OS_freebsd
-/* Per-interface info */
-struct snd_ifinfo {
-	struct list_head list;
-	char		name[32];
-	int		ifidx;
-	int		snds;
-};
-static DEFINE_LIST_HEAD(ifaces);
-
-/* Data packet meta data */
-struct snd_packet_info {
-	struct snd_ifinfo *ifinfo;
-	int		in;
-	int		ifidx;
-};
-
-static void snd_sock_read(struct snd_ifinfo *p);
-#endif
-
 /* TODO: dynamically size according to MTU */
 struct sbuff *
 snd_get_buf(void)
@@ -105,99 +85,7 @@
 	return (b);
 }
 
-#ifdef SND_MAX_PKT
-void
-snd_dispatch_fds(fd_set *fds)
-{
-	struct snd_ifinfo *p;
-
-	list_for_each_entry(p, &ifaces, list) {
-		if (FD_ISSET(sndsock, fds)) {
-			snd_sock_read(p);
-		}
-	}
-}
-
-int
-snd_handle_iface(const char *ifname, int ifidx)
-{
-	applog(LOG_ERR, "snd_handle_iface");
-	struct snd_ifinfo *p;
-
-	if ((p = malloc(sizeof (*p))) == NULL) {
-		APPLOG_NOMEM();
-		return (-1);
-	}
-	memset(p, 0, sizeof (*p));
-
-	snprintf(p->name, sizeof (p->name), "%s", ifname);
-	DBG(&dbg_snd, "snd_handle_iface -> p->name = %s", p->name);
-	p->ifidx = ifidx;
-	DBG(&dbg_snd, "snd_handle_iface -> p->ifidx = %d", ifidx);
-	p->snds = -1;
-	list_add_tail(&p->list, &ifaces);
-
-	return (0);
-}
-
 void
-os_specific_deliver_pkt(void *p, struct sbuff *b, int drop, int changed)
-{
-	struct snd_packet_info *pi;
-	struct sockaddr_send sendsrc;
-
-	if (drop) {
-		snd_put_buf(b);
-		return;
-	}
-
-	pi = (struct snd_packet_info *)(b->head);
-	bzero(&sendsrc, sizeof(sendsrc));
-	sendsrc.send_len = sizeof(sendsrc);
-	sendsrc.send_family = AF_INET6;
-	sendsrc.send_direction = pi->in;
-	sendsrc.send_ifidx = pi->ifinfo->ifidx;
-
-	DBG(&dbg_snd, "Sending %d bytes:\n", b->len);
-	if (sendto(sndsock, b->data, b->len, 0, (struct sockaddr *)&sendsrc,
-	    sizeof(sendsrc)) < 0) {
-                DBG(&dbg_snd, "Failed to send SEND message back to kernel.");
-                perror("Failed");
-                snd_put_buf(b);
-                return;
-        }
-
-	snd_put_buf(b);
-	return;
-}
-
-
-void
-snd_add_fds(fd_set *fds, int *maxfd, int sock)
-{
-	struct snd_ifinfo *p;
-
-	list_for_each_entry(p, &ifaces, list) {
-		p->snds = sock;
-		FD_SET(p->snds, fds);
-		*maxfd = sendd_max(*maxfd, p->snds);
-	}
-}
-#endif
-
-int
-freebsd_snd_init(void)
-{
-
-        if (list_empty(&ifaces)) {
-                applog(LOG_ERR, "SEND must be active on at least one iface");
-                return (-1);
-        }
-
-        return (0);
-}
-
-void
 snd_put_buf(struct sbuff *b)
 {
 	sbuff_free(b);
@@ -238,57 +126,6 @@
 	return (0);
 }
 
-#ifdef SND_OS_freebsd
-static void
-snd_sock_read(struct snd_ifinfo *p)
-{
-	struct sockaddr_send sendsrc;
-	socklen_t len;
-	struct sbuff *b;
-	struct snd_packet_info *pi;
-	int n;
-
-	if ((b = snd_get_buf()) == NULL) {
-		goto done;
-	}
-
-	pi = sbuff_data(b);
-	sbuff_advance(b, sizeof (*pi));
-
-	len = sizeof(sendsrc);
-	bzero(&sendsrc, sizeof(sendsrc));
-	n = recvfrom(sndsock, b->data, b->rem, 0, (struct sockaddr *)&sendsrc, &len);
-	if (n < 0) {
-		applog(LOG_ERR, "%s: read: %s", __func__, strerror(errno));
-		goto done;
-	} else
-		DBG(&dbg_snd, "%d bytes received on send socket. (%d)", n, b->rem);
-
-	b->len = n;
-
-	switch(sendsrc.send_direction) {
-	case SND_IN:
-		applog(LOG_ERR, "Direction: SND_IN");
-		pi->ifinfo = p;
-		pi->in = 1;
-		snd_recv_pkt(b, p->ifidx, SND_IN, pi);
-		break;
-	case SND_OUT:
-                applog(LOG_ERR, "Direction: SND_OUT");
-                pi->ifinfo = p;
-                pi->in = 0;
-                snd_recv_pkt(b, p->ifidx, SND_OUT, pi);
-                break;
-	default:
-		applog(LOG_ERR, "Unknown SEND pkt header: unknown direction.");
-	}
-
-done:
-	/* ToDo: Free memory! */
-	snd_put_buf(b);
-}
-#endif
-
 /*
  * TODO: Linux is not yet up-to-date with rfc3542, specifically in that
  * it uses the socket option IPV6_PKTINFO instead of IPV6_RECVPKTINFO.
@@ -348,11 +185,7 @@
 }
 
 int
-#ifdef SND_OS_freebsd
-snd_net_init(int *icmp6socket, int *sndsocket)
-#else
 snd_net_init(void)
-#endif
 {
 	int v;
 	struct icmp6_filter filter;
@@ -367,25 +200,11 @@
 	}
 #endif
 
-#ifdef SND_OS_freebsd
-#define IPPROTO_SEND	259
-	if ((*sndsocket = socket(PF_INET6, SOCK_RAW, IPPROTO_SEND)) < 0) {	
-		applog(LOG_ERR, "[%s:%d]: socket: %s", __func__, __LINE__,
-			strerror(errno));
-		return(-1);
-	} else {
-		applog(LOG_ERR, "%s: SEND socket created.", __FUNCTION__);
-	}
-#endif
-	if ((*icmp6socket = socket(AF_INET6, SOCK_RAW, IPPROTO_ICMPV6)) < 0) {
+	if ((icmp6sock = socket(AF_INET6, SOCK_RAW, IPPROTO_ICMPV6)) < 0) {
 		applog(LOG_ERR, "%s: socket: %s", __FUNCTION__,
 		       strerror(errno));
 		return (-1);
 	}
-#ifdef SND_OS_freebsd
-	icmp6sock = *icmp6socket;
-	sndsock = *sndsocket;
-#endif
 	v = 255;
 	if (setsockopt(icmp6sock, IPPROTO_IPV6, IPV6_UNICAST_HOPS, &v,
 		       sizeof (v)) < 0) {
@@ -413,9 +232,5 @@
 		return (-1);
 	}
 
-#ifdef SND_OS_freebsd
-	return (0);
-#else
 	return(icmp6sock);
-#endif
 }

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


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

@@ -30,12 +30,60 @@
  *  ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
  */
 
+#include <sys/param.h>
+#include <sys/types.h>
+#include <sys/mbuf.h>
+#include <sys/socket.h>
+
+#include <arpa/inet.h>
+
+#include <net/if.h>
+#include <net/route.h>
+
+#include <netinet/in.h>
+        
+#include <netinet6/send.h>
+
+#include <errno.h>
+#include <stdio.h>
+#include <string.h>
+#include <unistd.h>
+
+
+#include "../sendd_local.h"
+#include "../os_specific.h"
+#include "../snd_proto.h"
+#include "../dbg.h"
+#include "snd_freebsd.h"
+
 #include <applog.h>
-#include <list.h>
+#include <sbuff.h>
+static int icmp6sock    = -1;
+static int sndsock      = -1;
+
+#ifdef  DEBUG
+static struct dlog_desc dbg = {
+	.desc = "net",
+	.ctx = SENDD_NAME
+};
+static char abuf[INET6_ADDRSTRLEN];
+#endif
+
+/* Per-interface info */
+struct snd_ifinfo {
+	struct list_head list;
+	char	name[32];
+	int	ifidx;
+	int	snds;
+};
+static DEFINE_LIST_HEAD(ifaces);
 
-#include "config.h"
-#include "snd_freebsd.h"
-#include "../os_specific.h"
+/* Data packet meta data */
+struct snd_packet_info {
+	struct snd_ifinfo *ifinfo;
+	int	in;
+	int	ifidx;
+};
 
 extern int linux_rand_init(void);
 extern void linux_rand_fini(void);
@@ -46,6 +94,26 @@
 	if (linux_rand_init() < 0 || freebsd_snd_init() < 0) {
 		return (-1);
 	}
+
+        return (0);
+}
+
+int
+freebsd_snd_init(void)
+{
+	if (list_empty(&ifaces)) {
+		applog(LOG_ERR, "SEND must be active on at least one iface");
+		return (-1);
+	}
+#define IPPROTO_SEND	259
+	if ((sndsock = socket(PF_INET6, SOCK_RAW, IPPROTO_SEND)) < 0) {	
+		applog(LOG_ERR, "[%s:%d]: socket: %s", __func__, __LINE__,
+			strerror(errno));
+		return(-1);
+	} else {
+		applog(LOG_ERR, "%s: SEND socket created: fd=%d", __func__, sndsock);
+	}
+
 	return (0);
 }
 
@@ -53,4 +121,131 @@
 os_specific_fini(void)
 {
 	linux_rand_fini();
+	close(sndsock);
+}
+
+int
+os_specific_handle_iface(const char *ifname, int ifidx)
+{
+	struct snd_ifinfo *p;
+
+        if ((p = malloc(sizeof (*p))) == NULL) {
+                APPLOG_NOMEM();
+                return (-1);
+        }
+        memset(p, 0, sizeof (*p));
+
+        snprintf(p->name, sizeof (p->name), "%s", ifname);
+        DBG(&dbg_snd, "os_specific_handle_iface -> p->name = %s", p->name);
+        p->ifidx = ifidx;
+        DBG(&dbg_snd, "os_specific_handle_iface -> p->ifidx = %d", ifidx);
+        p->snds = -1;
+        list_add_tail(&p->list, &ifaces);
+
+        return (0);
+}
+
+static void
+snd_sock_read(struct snd_ifinfo *p)
+{
+	struct sockaddr_send sendsrc;
+	socklen_t len;
+	struct sbuff *b;
+	struct snd_packet_info *pi;
+	int n;
+
+	if ((b = snd_get_buf()) == NULL) {
+                goto done;
+        }
+                
+        pi = sbuff_data(b);
+        sbuff_advance(b, sizeof (*pi));
+
+        len = sizeof(sendsrc);
+        bzero(&sendsrc, sizeof(sendsrc));
+        n = recvfrom(sndsock, b->data, b->rem, 0, (struct sockaddr *)&sendsrc, &len);
+        if (n < 0) {
+                applog(LOG_ERR, "%s: read: %s", __func__, strerror(errno));
+                goto done;
+        } else
+                DBG(&dbg_snd, "%d bytes received on send socket. (%d)", n, b->rem);
+
+        b->len = n;
+
+        switch(sendsrc.send_direction) {
+        case SND_IN:
+                applog(LOG_ERR, "Direction: SND_IN");
+                pi->ifinfo = p;
+                pi->in = 1;
+                snd_recv_pkt(b, p->ifidx, SND_IN, pi);
+                break;
+        case SND_OUT:
+                applog(LOG_ERR, "Direction: SND_OUT");
+                pi->ifinfo = p;
+                pi->in = 0;
+                snd_recv_pkt(b, p->ifidx, SND_OUT, pi);
+                break;
+        default:
+                applog(LOG_ERR, "Unknown SEND pkt header: unknown direction.");
+        }
+
+done:
+        /* ToDo: Free memory! */
+        snd_put_buf(b);
+        return;
+}
+
+void
+os_specific_add_fds(fd_set *fds, int *maxfd)
+{
+	struct snd_ifinfo *p;
+
+        list_for_each_entry(p, &ifaces, list) {
+                p->snds = sndsock;
+                FD_SET(p->snds, fds);
+                *maxfd = sendd_max(*maxfd, p->snds);
+        }
+}
+
+void
+os_specific_dispatch_fds(fd_set *fds)
+{
+	struct snd_ifinfo *p;
+
+        list_for_each_entry(p, &ifaces, list) {
+                if (FD_ISSET(sndsock, fds)) {
+                        snd_sock_read(p);
+                }
+        }
+}
+
+void
+os_specific_deliver_pkt(void *p, struct sbuff *b, int drop, int changed)
+{
+        struct snd_packet_info *pi;
+        struct sockaddr_send sendsrc;
+ 
+        if (drop) {
+                snd_put_buf(b);
+                return;
+        }
+
+        pi = (struct snd_packet_info *)(b->head);
+        bzero(&sendsrc, sizeof(sendsrc));
+        sendsrc.send_len = sizeof(sendsrc);
+        sendsrc.send_family = AF_INET6;
+        sendsrc.send_direction = pi->in;
+        sendsrc.send_ifidx = pi->ifinfo->ifidx;
+
+        DBG(&dbg_snd, "Sending %d bytes.\n", b->len);
+        if (sendto(sndsock, b->data, b->len, 0, (struct sockaddr *)&sendsrc,
+            sizeof(sendsrc)) < 0) {
+                DBG(&dbg_snd, "Failed to send SEND message back to kernel.");
+                perror("Failed");
+                snd_put_buf(b);
+                return;
+        }
+
+        snd_put_buf(b);
+        return;
 }

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


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

@@ -38,9 +38,9 @@
 
 extern void snd_recv_pkt(struct sbuff *, int, int, void *);
 
+extern void os_specific_add_fds(fd_set *, int *);
 extern int os_specific_add_addr(struct in6_addr *, int, int, uint32_t,
     uint32_t);
-extern void os_specific_add_fds(fd_set *, int *);
 extern int os_specific_del_addr(struct in6_addr *, int, int);
 extern void os_specific_deliver_pkt(void *, struct sbuff *, int, int);
 extern void os_specific_dispatch_fds(fd_set *);
@@ -49,10 +49,6 @@
 extern void os_specific_fini(void);
 extern int os_specific_init(void);
 
-extern void snd_add_fds(fd_set *, int *, int);
-extern void snd_dispatch_fds(fd_set *);
-extern int snd_handle_iface(const char *, int);
-
 static __inline__ int
 sendd_max(int a, int b)
 {

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

@@ -384,11 +384,7 @@
 	DBG(&dbg, "%s pkt (%d bytes)", drop ? "dropping" : "delivering",
 	    pi->b->len);
 
-#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
 
 	free(pi);
 }
@@ -433,11 +429,7 @@
 	snd_put_cga_params(pi->params);
 	if (sig) free(sig);
 	pi->b->data = pi->start;
-#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
 
 	free(pi);
 }
@@ -663,11 +655,7 @@
 	DBG(&dbg, "%s pkt (%d bytes)", drop ? "dropping" : "delivering",
 	    pi->b->len);
 
-#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
 
 	free(pi);
 }
@@ -793,11 +781,7 @@
 	drop = 1;
 done:
 	b->data = start;
-#ifdef SND_OS_freebsd
-	snd_deliver_pkt(pkt, b, drop, changed);
-#else
 	os_specific_deliver_pkt(pkt, b, drop, changed);
-#endif
 }
 
 int

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

@@ -78,11 +78,7 @@
 }
 
 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;
@@ -91,20 +87,13 @@
 	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);
-#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);
 		if (select(maxfd + 1, fds, NULL, NULL, tv) < 0) {
@@ -131,11 +120,7 @@
 		if (FD_ISSET(ctlfd, fds)) {
 			snd_ctl_read(ctlfd);
 		}
-#ifdef SND_OS_freebsd
-		snd_dispatch_fds(fds);
-#else
 		os_specific_dispatch_fds(fds);
-#endif
 		snd_replace_non_cga_linklocals();
 	}
 }
@@ -183,14 +168,12 @@
 main(int argc, char **argv)
 {
 	int r, c, icmps, ctlfd, do_daemon = 1;
+	char *cfile = SNDD_CONF_FILE;
 #ifdef SND_OS_freebsd
 	int snds;
+	icmps = snds = (int *) malloc(sizeof(int));
 #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);
@@ -262,13 +245,7 @@
 	    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 ||
@@ -296,11 +273,7 @@
 		cfd = 0;
 	}
 #endif
-#ifdef SND_OS_freebsd
-	r = do_select(icmps, snds, ctlfd);
-#else
 	r = do_select(icmps, ctlfd);
-#endif
 
 	snd_cleanup();
 	exit(r);



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