New overhead and MPU features in HTB

Linux Advanced Routing and Traffic Control

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



I just wanted to inform that there is new patch
donated by Walter Karshat which implements packet overhead
and MPU computations to the rate table.
See diff for details on arguments. No tc binary available
yet at I have to compile it on system with older glibc
(not everyone use 2.3.2).

-------------------------------
    Martin Devera aka devik
Linux kernel QoS/HTB maintainer
  http://luxik.cdi.cz/~devik/

--- tc/q_htb.c	Sun May 12 22:18:27 2002
+++ /tmp/q_htb.c	Sat Oct 18 00:05:18 2003
@@ -34,10 +34,14 @@
 		" default  minor id of class to which unclassified packets are sent {0}\n"
 		" r2q      DRR quantums are computed as rate in Bps/r2q {10}\n"
 		" debug    string of 16 numbers each 0-3 {0}\n\n"
-		"... class add ... htb rate R1 burst B1 [prio P] [slot S] [pslot PS]\n"
+		"... class add ... htb rate R1 [burst B1] [mpu B] [overhead O]\n"
+		"                      [prio P] [slot S] [pslot PS]\n"
 		"                      [ceil R2] [cburst B2] [mtu MTU] [quantum Q]\n"
 		" rate     rate allocated to this class (class can still borrow)\n"
 		" burst    max bytes burst which can be accumulated during idle period {computed}\n"
+		" mpu      minimum packet size used in rate computations\n"
+		" overhead per-packet size overhead used in rate computations\n"
+
 		" ceil     definite upper class rate (no borrows) {rate}\n"
 		" cburst   burst but for ceil {computed}\n"
 		" mtu      max packet size we create rate map for {1600}\n"
@@ -102,7 +106,9 @@
 	struct tc_htb_opt opt;
 	__u32 rtab[256],ctab[256];
 	unsigned buffer=0,cbuffer=0;
-	int cell_log=-1,ccell_log = -1,mtu;
+	int cell_log=-1,ccell_log = -1;
+	unsigned mtu, mpu;
+	unsigned char mpu8 = 0, overhead = 0;
 	struct rtattr *tail;
 
 	memset(&opt, 0, sizeof(opt)); mtu = 1600; /* eth packet len */
@@ -119,6 +125,16 @@
 			if (get_u32(&mtu, *argv, 10)) {
 				explain1("mtu"); return -1;
 			}
+		} else if (matches(*argv, "mpu") == 0) {
+			NEXT_ARG();
+			if (get_u8(&mpu8, *argv, 10)) {
+				explain1("mpu"); return -1;
+			}
+		} else if (matches(*argv, "overhead") == 0) {
+			NEXT_ARG();
+			if (get_u8(&overhead, *argv, 10)) {
+				explain1("overhead"); return -1;
+			}
 		} else if (matches(*argv, "quantum") == 0) {
 			NEXT_ARG();
 			if (get_u32(&opt.quantum, *argv, 10)) {
@@ -190,14 +206,18 @@
 	if (!buffer) buffer = opt.rate.rate / HZ + mtu;
 	if (!cbuffer) cbuffer = opt.ceil.rate / HZ + mtu;
 
-	if ((cell_log = tc_calc_rtable(opt.rate.rate, rtab, cell_log, mtu, 0)) < 0) {
+/* encode overhead and mpu, 8 bits each, into lower 16 bits */
+	mpu = (unsigned)mpu8 | (unsigned)overhead << 8;
+	opt.ceil.mpu = mpu; opt.rate.mpu = mpu;
+
+	if ((cell_log = tc_calc_rtable(opt.rate.rate, rtab, cell_log, mtu, mpu)) < 0) {
 		fprintf(stderr, "htb: failed to calculate rate table.\n");
 		return -1;
 	}
 	opt.buffer = tc_calc_xmittime(opt.rate.rate, buffer);
 	opt.rate.cell_log = cell_log;
 	
-	if ((ccell_log = tc_calc_rtable(opt.ceil.rate, ctab, cell_log, mtu, 0)) < 0) {
+	if ((ccell_log = tc_calc_rtable(opt.ceil.rate, ctab, cell_log, mtu, mpu)) < 0) {
 		fprintf(stderr, "htb: failed to calculate ceil rate table.\n");
 		return -1;
 	}
@@ -221,6 +241,7 @@
 	double buffer,cbuffer;
 	SPRINT_BUF(b1);
 	SPRINT_BUF(b2);
+	SPRINT_BUF(b3);
 
 	if (opt == NULL)
 		return 0;
@@ -243,10 +264,16 @@
 	    fprintf(f, "ceil %s ", sprint_rate(hopt->ceil.rate, b1));
 	    cbuffer = ((double)hopt->ceil.rate*tc_core_tick2usec(hopt->cbuffer))/1000000;
 	    if (show_details) {
-		fprintf(f, "burst %s/%u mpu %s ", sprint_size(buffer, b1),
-			1<<hopt->rate.cell_log, sprint_size(hopt->rate.mpu, b2));
-		fprintf(f, "cburst %s/%u mpu %s ", sprint_size(cbuffer, b1),
-			1<<hopt->ceil.cell_log, sprint_size(hopt->ceil.mpu, b2));
+		fprintf(f, "burst %s/%u mpu %s overhead %s ",
+			sprint_size(buffer, b1),
+			1<<hopt->rate.cell_log,
+			sprint_size(hopt->rate.mpu&0xFF, b2),
+			sprint_size((hopt->rate.mpu>>8)&0xFF, b3));
+		fprintf(f, "cburst %s/%u mpu %s overhead %s ",
+			sprint_size(cbuffer, b1),
+			1<<hopt->ceil.cell_log,
+			sprint_size(hopt->ceil.mpu&0xFF, b2),
+			sprint_size((hopt->ceil.mpu>>8)&0xFF, b3));
 		fprintf(f, "level %d ", (int)hopt->level);
 	    } else {
 		fprintf(f, "burst %s ", sprint_size(buffer, b1));
--- tc/tc_core.c	Sat May  9 18:46:58 1998
+++ /tmp/tc_core.c	Fri Oct 17 23:49:27 2003
@@ -50,6 +50,8 @@ int tc_calc_rtable(unsigned bps, __u32 *
 		   unsigned mpu)
 {
 	int i;
+	unsigned overhead = (mpu >> 8) & 0xFF;
+	mpu = mpu & 0xFF;
 
 	if (mtu == 0)
 		mtu = 2047;
@@ -61,6 +63,8 @@ int tc_calc_rtable(unsigned bps, __u32 *
 	}
 	for (i=0; i<256; i++) {
 		unsigned sz = (i<<cell_log);
+		if (overhead)
+			sz += overhead;
 		if (sz < mpu)
 			sz = mpu;
 		rtab[i] = tc_core_usec2tick(1000000*((double)sz/bps));

[Index of Archives]     [LARTC Home Page]     [Netfilter]     [Netfilter Development]     [Network Development]     [Bugtraq]     [GCC Help]     [Yosemite News]     [Linux Kernel]     [Fedora Users]
  Powered by Linux