Deleted Added
sdiff udiff text old ( 205831 ) new ( 206428 )
full compact
1/*-
2 * Copyright (c) 2010 Luigi Rizzo, Riccardo Panicucci, Universita` di Pisa
3 * All rights reserved
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright

--- 14 unchanged lines hidden (view full) ---

23 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24 * SUCH DAMAGE.
25 */
26
27/*
28 * Dummynet portions related to packet handling.
29 */
30#include <sys/cdefs.h>
31__FBSDID("$FreeBSD: head/sys/netinet/ipfw/ip_dn_io.c 206428 2010-04-09 18:02:19Z luigi $");
32
33#include "opt_inet6.h"
34
35#include <sys/param.h>
36#include <sys/systm.h>
37#include <sys/malloc.h>
38#include <sys/mbuf.h>
39#include <sys/kernel.h>

--- 24 unchanged lines hidden (view full) ---

64
65/*
66 * We keep a private variable for the simulation time, but we could
67 * probably use an existing one ("softticks" in sys/kern/kern_timeout.c)
68 * instead of dn_cfg.curr_time
69 */
70
71struct dn_parms dn_cfg;
72//VNET_DEFINE(struct dn_parms, _base_dn_cfg);
73
74static long tick_last; /* Last tick duration (usec). */
75static long tick_delta; /* Last vs standard tick diff (usec). */
76static long tick_delta_sum; /* Accumulated tick difference (usec).*/
77static long tick_adjustment; /* Tick adjustments done. */
78static long tick_lost; /* Lost(coalesced) ticks number. */
79/* Adjusted vs non-adjusted curr_time difference (ticks). */
80static long tick_diff;

--- 15 unchanged lines hidden (view full) ---

96#ifdef SYSCTL_NODE
97
98SYSBEGIN(f4)
99
100SYSCTL_DECL(_net_inet);
101SYSCTL_DECL(_net_inet_ip);
102SYSCTL_NODE(_net_inet_ip, OID_AUTO, dummynet, CTLFLAG_RW, 0, "Dummynet");
103
104/* wrapper to pass dn_cfg fields to SYSCTL_* */
105//#define DC(x) (&(VNET_NAME(_base_dn_cfg).x))
106#define DC(x) (&(dn_cfg.x))
107/* parameters */
108SYSCTL_INT(_net_inet_ip_dummynet, OID_AUTO, hash_size,
109 CTLFLAG_RW, DC(hash_size), 0, "Default hash table size");
110SYSCTL_LONG(_net_inet_ip_dummynet, OID_AUTO, pipe_slot_limit,
111 CTLFLAG_RW, DC(slot_limit), 0,
112 "Upper limit in slots for pipe queue.");
113SYSCTL_LONG(_net_inet_ip_dummynet, OID_AUTO, pipe_byte_limit,
114 CTLFLAG_RW, DC(byte_limit), 0,
115 "Upper limit in bytes for pipe queue.");
116SYSCTL_INT(_net_inet_ip_dummynet, OID_AUTO, io_fast,
117 CTLFLAG_RW, DC(io_fast), 0, "Enable fast dummynet io.");
118SYSCTL_INT(_net_inet_ip_dummynet, OID_AUTO, debug,
119 CTLFLAG_RW, DC(debug), 0, "Dummynet debug level");
120SYSCTL_INT(_net_inet_ip_dummynet, OID_AUTO, expire,
121 CTLFLAG_RW, DC(expire), 0, "Expire empty queues/pipes");
122SYSCTL_INT(_net_inet_ip_dummynet, OID_AUTO, expire_cycle,
123 CTLFLAG_RD, DC(expire_cycle), 0, "Expire cycle for queues/pipes");
124
125/* RED parameters */
126SYSCTL_INT(_net_inet_ip_dummynet, OID_AUTO, red_lookup_depth,
127 CTLFLAG_RD, DC(red_lookup_depth), 0, "Depth of RED lookup table");
128SYSCTL_INT(_net_inet_ip_dummynet, OID_AUTO, red_avg_pkt_size,
129 CTLFLAG_RD, DC(red_avg_pkt_size), 0, "RED Medium packet size");
130SYSCTL_INT(_net_inet_ip_dummynet, OID_AUTO, red_max_pkt_size,
131 CTLFLAG_RD, DC(red_max_pkt_size), 0, "RED Max packet size");
132
133/* time adjustment */
134SYSCTL_LONG(_net_inet_ip_dummynet, OID_AUTO, tick_delta,
135 CTLFLAG_RD, &tick_delta, 0, "Last vs standard tick difference (usec).");
136SYSCTL_LONG(_net_inet_ip_dummynet, OID_AUTO, tick_delta_sum,
137 CTLFLAG_RD, &tick_delta_sum, 0, "Accumulated tick difference (usec).");
138SYSCTL_LONG(_net_inet_ip_dummynet, OID_AUTO, tick_adjustment,
139 CTLFLAG_RD, &tick_adjustment, 0, "Tick adjustments done.");
140SYSCTL_LONG(_net_inet_ip_dummynet, OID_AUTO, tick_diff,
141 CTLFLAG_RD, &tick_diff, 0,
142 "Adjusted vs non-adjusted curr_time difference (ticks).");
143SYSCTL_LONG(_net_inet_ip_dummynet, OID_AUTO, tick_lost,
144 CTLFLAG_RD, &tick_lost, 0,
145 "Number of ticks coalesced by dummynet taskqueue.");
146
147/* statistics */
148SYSCTL_INT(_net_inet_ip_dummynet, OID_AUTO, schk_count,
149 CTLFLAG_RD, DC(schk_count), 0, "Number of schedulers");
150SYSCTL_INT(_net_inet_ip_dummynet, OID_AUTO, si_count,
151 CTLFLAG_RD, DC(si_count), 0, "Number of scheduler instances");
152SYSCTL_INT(_net_inet_ip_dummynet, OID_AUTO, fsk_count,
153 CTLFLAG_RD, DC(fsk_count), 0, "Number of flowsets");
154SYSCTL_INT(_net_inet_ip_dummynet, OID_AUTO, queue_count,
155 CTLFLAG_RD, DC(queue_count), 0, "Number of queues");
156SYSCTL_ULONG(_net_inet_ip_dummynet, OID_AUTO, io_pkt,
157 CTLFLAG_RD, &io_pkt, 0,
158 "Number of packets passed to dummynet.");
159SYSCTL_ULONG(_net_inet_ip_dummynet, OID_AUTO, io_pkt_fast,
160 CTLFLAG_RD, &io_pkt_fast, 0,
161 "Number of packets bypassed dummynet scheduler.");
162SYSCTL_ULONG(_net_inet_ip_dummynet, OID_AUTO, io_pkt_drop,
163 CTLFLAG_RD, &io_pkt_drop, 0,
164 "Number of packets dropped by dummynet.");
165#undef DC
166SYSEND
167
168#endif
169
170static void dummynet_send(struct mbuf *);
171
172/*
173 * Packets processed by dummynet have an mbuf tag associated with

--- 321 unchanged lines hidden (view full) ---

495 * Once complete, the function reschedules itself for the next tick.
496 */
497void
498dummynet_task(void *context, int pending)
499{
500 struct timeval t;
501 struct mq q = { NULL, NULL }; /* queue to accumulate results */
502
503 CURVNET_SET(context);
504
505 DN_BH_WLOCK();
506
507 /* Update number of lost(coalesced) ticks. */
508 tick_lost += pending - 1;
509
510 getmicrouptime(&t);
511 /* Last tick duration (usec). */
512 tick_last = (t.tv_sec - dn_cfg.prev_t.tv_sec) * 1000000 +

--- 48 unchanged lines hidden (view full) ---

561 dn_drain_scheduler();
562 dn_drain_queue();
563 }
564
565 DN_BH_WUNLOCK();
566 dn_reschedule();
567 if (q.head != NULL)
568 dummynet_send(q.head);
569 CURVNET_RESTORE();
570}
571
572/*
573 * forward a chain of packets to the proper destination.
574 * This runs outside the dummynet lock.
575 */
576static void
577dummynet_send(struct mbuf *m)

--- 221 unchanged lines hidden ---