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 --- |