Deleted Added
full compact
ip_dn_io.c (205831) ip_dn_io.c (206428)
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>
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 205831 2010-03-29 12:27:49Z luigi $");
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;
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);
72
73static long tick_last; /* Last tick duration (usec). */
74static long tick_delta; /* Last vs standard tick diff (usec). */
75static long tick_delta_sum; /* Accumulated tick difference (usec).*/
76static long tick_adjustment; /* Tick adjustments done. */
77static long tick_lost; /* Lost(coalesced) ticks number. */
78/* Adjusted vs non-adjusted curr_time difference (ticks). */
79static long tick_diff;

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

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

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

491 * Once complete, the function reschedules itself for the next tick.
492 */
493void
494dummynet_task(void *context, int pending)
495{
496 struct timeval t;
497 struct mq q = { NULL, NULL }; /* queue to accumulate results */
498
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
499 DN_BH_WLOCK();
500
501 /* Update number of lost(coalesced) ticks. */
502 tick_lost += pending - 1;
503
504 getmicrouptime(&t);
505 /* Last tick duration (usec). */
506 tick_last = (t.tv_sec - dn_cfg.prev_t.tv_sec) * 1000000 +

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

555 dn_drain_scheduler();
556 dn_drain_queue();
557 }
558
559 DN_BH_WUNLOCK();
560 dn_reschedule();
561 if (q.head != NULL)
562 dummynet_send(q.head);
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();
563}
564
565/*
566 * forward a chain of packets to the proper destination.
567 * This runs outside the dummynet lock.
568 */
569static void
570dummynet_send(struct mbuf *m)

--- 221 unchanged lines hidden ---
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 ---