From owner-svn-src-user@FreeBSD.ORG Thu Feb 4 15:26:17 2010 Return-Path: Delivered-To: svn-src-user@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 5369D1065679; Thu, 4 Feb 2010 15:26:17 +0000 (UTC) (envelope-from luigi@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 44A288FC0C; Thu, 4 Feb 2010 15:26:17 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id o14FQHqb055179; Thu, 4 Feb 2010 15:26:17 GMT (envelope-from luigi@svn.freebsd.org) Received: (from luigi@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id o14FQHvJ055175; Thu, 4 Feb 2010 15:26:17 GMT (envelope-from luigi@svn.freebsd.org) Message-Id: <201002041526.o14FQHvJ055175@svn.freebsd.org> From: Luigi Rizzo Date: Thu, 4 Feb 2010 15:26:17 +0000 (UTC) To: src-committers@freebsd.org, svn-src-user@freebsd.org X-SVN-Group: user MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r203491 - in user/luigi/ipfw3-head/sys/netinet/ipfw: . test X-BeenThere: svn-src-user@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the experimental " user" src tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 04 Feb 2010 15:26:17 -0000 Author: luigi Date: Thu Feb 4 15:26:16 2010 New Revision: 203491 URL: http://svn.freebsd.org/changeset/base/203491 Log: correct handling of masks. try to build a tarball of test sources Modified: user/luigi/ipfw3-head/sys/netinet/ipfw/ip_dn_private.h user/luigi/ipfw3-head/sys/netinet/ipfw/ip_dummynet.c user/luigi/ipfw3-head/sys/netinet/ipfw/test/Makefile Modified: user/luigi/ipfw3-head/sys/netinet/ipfw/ip_dn_private.h ============================================================================== --- user/luigi/ipfw3-head/sys/netinet/ipfw/ip_dn_private.h Thu Feb 4 15:17:49 2010 (r203490) +++ user/luigi/ipfw3-head/sys/netinet/ipfw/ip_dn_private.h Thu Feb 4 15:26:16 2010 (r203491) @@ -182,7 +182,9 @@ struct dn_fsk { /* kernel side of a flow struct ipfw_flow_id fsk_mask; - /* qht is a hash table of queues, or just a single queue */ + /* qht is a hash table of queues, or just a single queue + * a bit in fs.flags tells us which one + */ struct dn_ht *qht; struct dn_schk *sched; /* Sched we are linked to */ SLIST_ENTRY(dn_fsk) sch_chain; /* list of fsk attached to sched */ Modified: user/luigi/ipfw3-head/sys/netinet/ipfw/ip_dummynet.c ============================================================================== --- user/luigi/ipfw3-head/sys/netinet/ipfw/ip_dummynet.c Thu Feb 4 15:17:49 2010 (r203490) +++ user/luigi/ipfw3-head/sys/netinet/ipfw/ip_dummynet.c Thu Feb 4 15:26:16 2010 (r203491) @@ -169,6 +169,27 @@ flow_id_or(struct ipfw_flow_id *src, str return dst; } +static int +nonzero_mask(struct ipfw_flow_id *m) +{ + if (m->dst_port || m->src_port || m->proto) + return 1; + if (IS_IP6_FLOW_ID(m)) { + return + m->dst_ip6.__u6_addr.__u6_addr32[0] || + m->dst_ip6.__u6_addr.__u6_addr32[1] || + m->dst_ip6.__u6_addr.__u6_addr32[2] || + m->dst_ip6.__u6_addr.__u6_addr32[3] || + m->src_ip6.__u6_addr.__u6_addr32[0] || + m->src_ip6.__u6_addr.__u6_addr32[1] || + m->src_ip6.__u6_addr.__u6_addr32[2] || + m->src_ip6.__u6_addr.__u6_addr32[3] || + m->flow_id6; + } else { + return m->dst_ip || m->src_ip; + } +} + /* XXX we may want a better hash function */ static uint32_t flow_id_hash(struct ipfw_flow_id *id) @@ -329,7 +350,7 @@ qht_delete(struct dn_fsk *fs, int flags) fs->fs.fs_nr, flags, fs->qht); if (!fs->qht) return; - if (fs->fs.flags & DN_HAVE_MASK) { + if (fs->fs.flags & DN_QHT_HASH) { dn_ht_scan(fs->qht, q_delete_cb, (void *)(uintptr_t)flags); if (flags & DN_DESTROY) { dn_ht_free(fs->qht, 0); @@ -355,7 +376,7 @@ ipdn_q_find(struct dn_fsk *fs, struct dn template._si = si; template.fs = fs; - if (fs->fs.flags & DN_HAVE_MASK) { + if (fs->fs.flags & DN_QHT_HASH) { struct ipfw_flow_id masked_id; if (fs->qht == NULL) { fs->qht = dn_ht_init(NULL, fs->fs.buckets, @@ -789,7 +810,7 @@ copy_q(struct copy_args *a, struct dn_fs { if (!fs->qht) return 0; - if (fs->fs.flags & DN_HAVE_MASK) + if (fs->fs.flags & DN_QHT_HASH) dn_ht_scan(fs->qht, copy_q_cb, a); else copy_q_cb(fs->qht, a); @@ -805,7 +826,7 @@ copy_flowset(struct copy_args *a, struct ND("flowset %d", fs->fs.fs_nr); if (copy_obj(a->start, a->end, &fs->fs, "flowset", fs->fs.fs_nr)) return DNHT_SCAN_END; - ufs->oid.id = (fs->fs.flags & DN_HAVE_MASK) ? + ufs->oid.id = (fs->fs.flags & DN_QHT_HASH) ? dn_ht_entries(fs->qht) : (fs->qht ? 1 : 0); if (flags) { /* copy queues */ copy_q(a, fs, 0); @@ -930,14 +951,24 @@ fsk_attach(struct dn_fsk *fs, struct dn_ fs->fsk_mask = fs->fs.flow_mask; if (fs->sched->sch.flags & DN_HAVE_MASK) flow_id_or(&fs->sched->sch.sched_mask, &fs->fsk_mask); - if (!fs->qht) - return; - D("XXX TODO requeue from fs %d to sch %d", - fs->fs.fs_nr, s->sch.sched_nr); - /* - * The requeue is complex -- in general we need to - * reclassify every single packet. - */ + if (fs->qht) { + /* + * we must drain qht according to the old + * type, and reinsert according to the new one. + * The requeue is complex -- in general we need to + * reclassify every single packet. + * For the time being, let's hope qht is never set + * when we reach this point. + */ + D("XXX TODO requeue from fs %d to sch %d", + fs->fs.fs_nr, s->sch.sched_nr); + fs->qht = NULL; + } + /* set the new type for qht */ + if (nonzero_mask(&fs->fsk_mask)) + fs->fs.flags |= DN_QHT_HASH; + else + fs->fs.flags &= ~DN_QHT_HASH; } /* update all flowsets which may refer to this scheduler */ Modified: user/luigi/ipfw3-head/sys/netinet/ipfw/test/Makefile ============================================================================== --- user/luigi/ipfw3-head/sys/netinet/ipfw/test/Makefile Thu Feb 4 15:17:49 2010 (r203490) +++ user/luigi/ipfw3-head/sys/netinet/ipfw/test/Makefile Thu Feb 4 15:26:16 2010 (r203491) @@ -31,3 +31,16 @@ main.o: mylist.h clean: - rm *.o $(TARGETS) *.core + +ALLSRCS = $(SCHED_SRCS) dn_test.h mylist.h \ + dn_sched.h dn_heap.h ip_dn_private.h Makefile +TMPBASE = /tmp/testXYZ +TMPDIR = $(TMPBASE)/test + +tgz: + -rm -rf $(TMPDIR) + mkdir -p $(TMPDIR) + -cp -p $(ALLSRCS) $(TMPDIR) + -(cd ..; cp -p $(ALLSRCS) $(TMPDIR)) + ls -la $(TMPDIR) + (cd $(TMPBASE); tar cvzf /tmp/test.tgz test)