svn commit: r202681 - user/luigi/ipfw3-head/sys/netinet/ipfw

Luigi Rizzo luigi at FreeBSD.org
Wed Jan 20 09:11:43 UTC 2010


Author: luigi
Date: Wed Jan 20 09:11:42 2010
New Revision: 202681
URL: http://svn.freebsd.org/changeset/base/202681

Log:
  add DN_LOCK_DESTROY, plus other small cleanups

Modified:
  user/luigi/ipfw3-head/sys/netinet/ipfw/dn_heap.c
  user/luigi/ipfw3-head/sys/netinet/ipfw/ip_dn_private.h
  user/luigi/ipfw3-head/sys/netinet/ipfw/ip_dummynet.c

Modified: user/luigi/ipfw3-head/sys/netinet/ipfw/dn_heap.c
==============================================================================
--- user/luigi/ipfw3-head/sys/netinet/ipfw/dn_heap.c	Wed Jan 20 08:41:58 2010	(r202680)
+++ user/luigi/ipfw3-head/sys/netinet/ipfw/dn_heap.c	Wed Jan 20 09:11:42 2010	(r202681)
@@ -76,11 +76,8 @@ heap_resize(struct dn_heap *h, int new_s
 {
 	struct dn_heap_entry *p;
 
-	if (h->size >= new_size ) {
-		printf("--- %s: Bogus call, have %d want %d\n",
-			__func__, h->size, new_size);
+	if (h->size >= new_size )	/* have enough room */
 		return 0;
-	}
 	new_size = (new_size + HEAP_INCREMENT ) & ~HEAP_INCREMENT;
 	p = malloc(new_size * sizeof(*p), M_DN_HEAP, M_NOWAIT);
 	if (p == NULL) {

Modified: user/luigi/ipfw3-head/sys/netinet/ipfw/ip_dn_private.h
==============================================================================
--- user/luigi/ipfw3-head/sys/netinet/ipfw/ip_dn_private.h	Wed Jan 20 08:41:58 2010	(r202680)
+++ user/luigi/ipfw3-head/sys/netinet/ipfw/ip_dn_private.h	Wed Jan 20 09:11:42 2010	(r202681)
@@ -42,7 +42,7 @@ MALLOC_DECLARE(M_DUMMYNET);
 	mtx_init(&dn_cfg.uh_mtx, "dn_uh", NULL, MTX_DEF);	\
 	mtx_init(&dn_cfg.bh_mtx, "dn_bh", NULL, MTX_DEF);	\
 	} while (0)
-#define DUMMYNET_LOCK_DESTROY() do {			\
+#define DN_LOCK_DESTROY() do {				\
 	mtx_destroy(&dn_cfg.uh_mtx);			\
 	mtx_destroy(&dn_cfg.bh_mtx);			\
 	} while (0)
@@ -157,7 +157,6 @@ struct delay_line {
 struct new_fsk { /* kernel side of a flowset */
 	struct new_fs fs;
 	SLIST_ENTRY(new_fsk) fsk_next;	/* hash chain list */
-	int refcnt;		/* entries in qht */
 
 	/* hash table of queues, or just single queue */
 	struct dn_ht	*_qht;
@@ -228,8 +227,8 @@ struct new_sch_inst {
 /* kernel-side flags */
 enum {
 	/* 1 and 2 are reserved for the SCAN flags */
-	DN_DELETE	= 0x0004, /* destroy when refcnt=0 */
-	DN_DELETE_FS	= 0x0008, /* destroy when refcnt=0 */
+	DN_DELETE	= 0x0004, /* destroy */
+	DN_DELETE_FS	= 0x0008, /* destroy flowset */
 	DN_DETACH	= 0x0010,
 	DN_ACTIVE	= 0x0020, /* object is in evheap */
 	DN_F_DLINE	= 0x0040, /* object is a delay line */

Modified: user/luigi/ipfw3-head/sys/netinet/ipfw/ip_dummynet.c
==============================================================================
--- user/luigi/ipfw3-head/sys/netinet/ipfw/ip_dummynet.c	Wed Jan 20 08:41:58 2010	(r202680)
+++ user/luigi/ipfw3-head/sys/netinet/ipfw/ip_dummynet.c	Wed Jan 20 09:11:42 2010	(r202681)
@@ -248,8 +248,12 @@ q_new(uintptr_t key, int flags, void *ar
 		q->ni.id = *(struct ipfw_flow_id *)key;
 	q->fs = fs;
 	q->_si = template->_si;
-	fs->refcnt++;
-
+	printf("-- %s fs %p si %p mask p %d f %d 0x%08x:%d -> 0x%08x:%d\n",
+		__FUNCTION__, q->fs, q->_si,
+		q->ni.id.proto, q->ni.id.flags,
+		q->ni.id.src_ip, q->ni.id.src_port,
+		q->ni.id.dst_ip, q->ni.id.dst_port);
+		
 	if (fs->sched->fp->new_queue)
 		fs->sched->fp->new_queue(q);
 	dn_cfg.queue_count++;
@@ -276,7 +280,6 @@ dn_delete_queue(struct new_queue *q, int
 			dn_free_pkts(q->mq.head);
 		free(q, M_DUMMYNET);
 		dn_cfg.queue_count--;
-		fs->refcnt--;
 	}
 }
 
@@ -740,6 +743,20 @@ struct copy_args {
 };
 
 static int
+copy_flowset(struct copy_args *a, struct new_fsk *fs, int flags)
+{
+	struct new_fs *ufs = (struct new_fs *)(*a->start);
+	if (!fs)
+		return 0;
+	if (copy_obj(a->start, a->end, &fs->fs))
+		return DNHT_SCAN_END;
+	ufs->oid.id = 0; /* XXX number of queues ? */
+	if (flags) {	/* copy queues */
+	}
+	return 0;
+}
+
+static int
 copy_data_helper(void *_o, void *_arg)
 {
 	struct copy_args *a = _arg;
@@ -749,7 +766,7 @@ copy_data_helper(void *_o, void *_arg)
 		if (a->flags & DN_C_PIPE) {
 			if (copy_obj(a->start, a->end, &s->pipe))
 				return DNHT_SCAN_END;
-			if (s->fs && copy_obj(a->start, a->end, &s->fs->fs))
+			if (copy_flowset(a, s->fs, 0))
 				return DNHT_SCAN_END;
 		}
 		if (a->flags & DN_C_SCH) {
@@ -762,13 +779,10 @@ copy_data_helper(void *_o, void *_arg)
 	}
 	if (a->type == DN_FS) {	/* scanning flowsets */
 		struct new_fsk *fs = _o;
-		struct new_fs *ufs =
-		    (struct new_fs *)(*a->start);
 		/* if extra is set, only copy unlinked ones */
 		if (a->extra == 0 || fs->sched == NULL) {
-			if (copy_obj(a->start, a->end, &fs->fs))
+			if (copy_flowset(a, fs, 0))
 				return DNHT_SCAN_END;
-			ufs->oid.id = fs->refcnt;
 		}
 	}
 	return 0;
@@ -929,12 +943,13 @@ config_fs(struct new_fs *nfs, struct dn_
 	    if (fs == NULL)
 		break;
 	    if (nfs->sched_nr == 0) {
-		printf("reuse existing number %d\n", fs->fs.sched_nr);
-		if (fs->fs.sched_nr == 0) {
-			fs = NULL;
-			break;
+		if (fs->fs.sched_nr != 0) { /* reuse */
+		    nfs->sched_nr = fs->fs.sched_nr;
+		} else {
+		    printf("missing sched for flowset %d\n", i);
+		    fs = NULL;
+		    break;
 		}
-		nfs->sched_nr = fs->fs.sched_nr;
 	    }
 	    dn_cfg.id++;
 	    if (bcmp(&fs->fs, nfs, sizeof(*nfs)) == 0) {
@@ -1251,13 +1266,6 @@ compute_space(struct dn_id *cmd, int *to
 		break;
 	}
 	*to_copy = x;
-	printf("have %d.%d sched %d, %d.%d pipes %d, %d.%d flows %d, "
-		"%d.%d si %d, %d.%d queues %d\n",
-		dn_cfg.schk_count, sizeof(struct new_sch), DN_SCH,
-		dn_cfg.schk_count, sizeof(struct new_pipe), DN_PIPE,
-		dn_cfg.fsk_count, sizeof(struct new_fs), DN_FS,
-		dn_cfg.si_count, sizeof(struct new_inst), DN_SCH_I,
-		dn_cfg.queue_count, sizeof(struct new_queue), DN_QUEUE);
 	if (x & DN_C_SCH)
 		need += dn_cfg.schk_count * sizeof(struct new_sch);
 	if (x & DN_C_FS)
@@ -1314,6 +1322,13 @@ dummynet_get(struct sockopt *sopt)
 	}
 	if (start == NULL)
 		return sooptcopyout(sopt, &cmd, sizeof(cmd));
+	printf("have %d:%d sched %d, %d:%d pipes %d, %d:%d flows %d, "
+		"%d.%d si %d, %d.%d queues %d\n",
+		dn_cfg.schk_count, sizeof(struct new_sch), DN_SCH,
+		dn_cfg.schk_count, sizeof(struct new_pipe), DN_PIPE,
+		dn_cfg.fsk_count, sizeof(struct new_fs), DN_FS,
+		dn_cfg.si_count, sizeof(struct new_inst), DN_SCH_I,
+		dn_cfg.queue_count, sizeof(struct new_queue), DN_QUEUE);
 	end = start + have;
 	sopt->sopt_valsize = sopt_valsize;
 	bcopy(&cmd, start, sizeof(cmd));


More information about the svn-src-user mailing list