svn commit: r202096 - in user/luigi/ipfw3-head/sys/netinet: . ipfw
Luigi Rizzo
luigi at FreeBSD.org
Mon Jan 11 18:08:39 UTC 2010
Author: luigi
Date: Mon Jan 11 18:08:39 2010
New Revision: 202096
URL: http://svn.freebsd.org/changeset/base/202096
Log:
pass more stats upstream
Modified:
user/luigi/ipfw3-head/sys/netinet/ip_dummynet.h
user/luigi/ipfw3-head/sys/netinet/ipfw/ip_dn_io.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/ip_dummynet.h
==============================================================================
--- user/luigi/ipfw3-head/sys/netinet/ip_dummynet.h Mon Jan 11 17:58:15 2010 (r202095)
+++ user/luigi/ipfw3-head/sys/netinet/ip_dummynet.h Mon Jan 11 18:08:39 2010 (r202096)
@@ -170,10 +170,12 @@ struct new_fs {
*/
struct new_inst {
struct dn_id oid;
+ struct ipfw_flow_id id;
uint32_t parent_nr; /* sched or flowset nr */
- uint32_t lenght; /* Queue lenght, in packets */
+ uint32_t length; /* Queue lenght, in packets */
uint32_t len_bytes; /* Queue lenght, in bytes */
uint32_t drops;
+ int hash_slot;
uint64_t tot_pkts; /* statistics counters */
uint64_t tot_bytes;
};
Modified: user/luigi/ipfw3-head/sys/netinet/ipfw/ip_dn_io.c
==============================================================================
--- user/luigi/ipfw3-head/sys/netinet/ipfw/ip_dn_io.c Mon Jan 11 17:58:15 2010 (r202095)
+++ user/luigi/ipfw3-head/sys/netinet/ipfw/ip_dn_io.c Mon Jan 11 18:08:39 2010 (r202096)
@@ -244,11 +244,14 @@ int
dn_queue_packet(struct new_queue *q, struct mbuf* m)
{
struct new_fs *f = &(q->fs->fs);
+ struct new_inst *ni = &q->si->ni;
uint64_t len = m->m_pkthdr.len;
/* Update statistics, then check reasons to drop pkt. */
- q->tot_bytes += m->m_pkthdr.len;
+ q->tot_bytes += len;
q->tot_pkts++;
+ ni->tot_bytes += len;
+ ni->tot_pkts++;
if (f->plr && random() < f->plr)
goto drop;
if (f->flags & DN_QSIZE_BYTES) {
@@ -260,11 +263,14 @@ dn_queue_packet(struct new_queue *q, str
mq_append(&q->mq, m);
q->lenght++;
q->len_bytes += len;
+ ni->length++;
+ ni->len_bytes += len;
return 0;
drop:
io_pkt_drop++;
q->drops++;
+ ni->drops++;
FREE_PKT(m);
return 1;
}
@@ -447,7 +453,10 @@ create_si(struct new_schk *s, int slot)
if (si == NULL)
goto error;
- set_oid(&si->oid, DN_SCH_I, 0, l);
+ /* XXX note we set the length only for the initial part which
+ * is passed up to userland.
+ */
+ set_oid(&si->ni.oid, DN_SCH_I, 0, sizeof(struct new_inst));
set_oid(&(si->dline.oid), DN_DELAY_LINE, 0, sizeof(struct delay_line));
si->sched = s;
@@ -467,7 +476,7 @@ create_si(struct new_schk *s, int slot)
si->idle_time = 0;
/* Put entry in front of the hash list of the parent. */
SLIST_INSERT_HEAD(&s->ht[slot], si, next);
- si->hash_slot = slot;
+ si->ni.hash_slot = slot;
dn_cfg.si_count++;
return si;
@@ -497,7 +506,7 @@ find_sch_inst(struct new_schk *s, struct
searches++;
SLIST_FOREACH(si, &s->ht[i], next) {
search_steps++;
- if (!mask_are_equals(&id_t, &si->id))
+ if (!mask_are_equals(&id_t, &si->ni.id))
break; /* found */
}
}
@@ -505,7 +514,7 @@ find_sch_inst(struct new_schk *s, struct
if (si == NULL) { /* no match, need to allocate a new entry */
si = create_si(s, i);
if (si && s->sch.flags & DN_HAVE_MASK)
- si->id = id_t;
+ si->ni.id = id_t;
}
return si;
}
Modified: user/luigi/ipfw3-head/sys/netinet/ipfw/ip_dn_private.h
==============================================================================
--- user/luigi/ipfw3-head/sys/netinet/ipfw/ip_dn_private.h Mon Jan 11 17:58:15 2010 (r202095)
+++ user/luigi/ipfw3-head/sys/netinet/ipfw/ip_dn_private.h Mon Jan 11 18:08:39 2010 (r202096)
@@ -196,12 +196,10 @@ SLIST_HEAD(new_queue_head, new_queue);
* This struct is created a runtime.
*/
struct new_sch_inst {
- struct dn_id oid;
+ struct new_inst ni; /* oid, id and stats */
SLIST_ENTRY(new_sch_inst) next; /* next item in the bucket */
struct delay_line dline;
struct new_schk *sched; /* the template */
- int hash_slot; /* used to print the id of the scheduler instance */
- struct ipfw_flow_id id; /* flow-id for this instance */
int kflags; /* DN_SCHED_ACTIVE */
/* queues attached to this scheduler instance */
Modified: user/luigi/ipfw3-head/sys/netinet/ipfw/ip_dummynet.c
==============================================================================
--- user/luigi/ipfw3-head/sys/netinet/ipfw/ip_dummynet.c Mon Jan 11 17:58:15 2010 (r202095)
+++ user/luigi/ipfw3-head/sys/netinet/ipfw/ip_dummynet.c Mon Jan 11 18:08:39 2010 (r202096)
@@ -134,7 +134,8 @@ destroy_si(struct new_sch_inst *si)
struct delay_line *dl = &si->dline;
struct new_queue *q;
- if (si->oid.id >= 0) /* is in the heap */
+ /* XXX below we use oid.id as a marker of presence in the sysheap */
+ if (si->ni.oid.id >= 0) /* is in the heap */
heap_extract(&dn_cfg.system_heap, si);
if (s->fp->free_sched)
s->fp->free_sched(si);
@@ -298,19 +299,22 @@ copy_data(char **start, char *end, int f
struct new_schk *s;
SLIST_FOREACH(s, &dn_cfg.schedhash[i], next) {
if (flags & DN_C_PIPE) {
- printf("copy pipe %d len %d\n",
- s->pipe.pipe_nr, s->pipe.oid.len);
if (copy_obj(start, end, &s->pipe))
return 1;
}
if (flags & DN_C_SCH) {
- printf("copy sched %d\n", s->sch.sched_nr);
if (copy_obj(start, end, &s->sch))
return 1;
}
if (flags & DN_C_SCH_INST) {
- printf("copy shc_inst %d\n", s->sch.sched_nr);
- /* scan the hashtable */
+ int j;
+ struct new_sch_inst *si;
+ for (j = 0; j < s->ht_slots; j++) {
+ SLIST_FOREACH(si, &s->ht[j], next) {
+ if (copy_obj(start, end, &si->ni))
+ return 1;
+ }
+ }
}
}
}
@@ -756,9 +760,10 @@ dummynet_get(struct sockopt *sopt)
default:
return EINVAL;
case DN_SCH: /* pipe show */
- to_copy = DN_C_SCH | DN_C_PIPE;
+ to_copy = DN_C_SCH | DN_C_PIPE | DN_C_SCH_INST;
need = dn_cfg.schk_count *
(sizeof(struct new_sch) + sizeof(struct new_pipe));
+ need += dn_cfg.si_count * sizeof(struct new_inst);
break;
case DN_FS: /* queue show */
to_copy = DN_C_FS;
More information about the svn-src-user
mailing list