diff -Naur iproute2-2.6.9/Makefile iproute2-2.6.9_ipqos/Makefile
--- iproute2-2.6.9/Makefile	2004-08-31 11:32:14.000000000 -0700
+++ iproute2-2.6.9_ipqos/Makefile	2007-01-10 17:36:33.000000000 -0800
@@ -20,9 +20,11 @@
 ADDLIB+=ipx_ntop.o ipx_pton.o
 
 CC = gcc
-CCOPTS = -D_GNU_SOURCE -O2 -Wstrict-prototypes -Wall -g
+CCOPTS = -D_GNU_SOURCE -Os -pipe 
 CFLAGS = $(CCOPTS) -I../include $(DEFINES)
 
+CFLAGS += -I$(PWD)/../fusiv_src/kernel/drivers/ipqos
+
 LDLIBS += -L../lib -lnetlink -lutil
 
 SUBDIRS=lib ip tc misc
diff -Naur iproute2-2.6.9/tc/Makefile iproute2-2.6.9_ipqos/tc/Makefile
--- iproute2-2.6.9/tc/Makefile	2004-08-31 11:32:14.000000000 -0700
+++ iproute2-2.6.9_ipqos/tc/Makefile	2007-01-10 17:36:58.000000000 -0800
@@ -22,6 +22,9 @@
 TCMODULES += q_htb.o
 TCMODULES += m_gact.o
 
+TCMODULES += q_fusiv_wfq.o
+
+
 TCOBJ += $(TCMODULES)
 
 TCLIB := tc_core.o
diff -Naur iproute2-2.6.9/tc/q_fusiv_wfq.c iproute2-2.6.9_ipqos/tc/q_fusiv_wfq.c
--- iproute2-2.6.9/tc/q_fusiv_wfq.c	1969-12-31 16:00:00.000000000 -0800
+++ iproute2-2.6.9_ipqos/tc/q_fusiv_wfq.c	2007-01-10 17:37:07.000000000 -0800
@@ -0,0 +1,250 @@
+/* Copyright (C) 2006 Ikanos Communications
+ * See IKANOS_PROP_LICENSE.txt for license information. */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <syslog.h>
+#include <fcntl.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+#include <string.h>
+
+#include "utils.h"
+#include "tc_util.h"
+
+#include <wfqlib.h>
+#define SETWT_USAGE "Usage: fusiv_wfq type <dwpfq/pq> bw <value in kbps > borrow <mask in hex> tcp-ack-priority <mask in hex> contribute <mask in hex> qwts <Q0_wt> <Q1_wt> <Q2_wt> <Q3_wt> <Q4_wt> <Q5_wt> <Q6_wt> <Q7_wt> \n\n\
+Mandatory Parameters \n\
+  type             - Scheduler Type \n\
+                     dwpfq  -  Deficit Weighted Priority Based Fair Queuing (DWPFQ) \n\
+                     pq     -  Priority Queuing (PQ) \n\
+  bw               - Scheduler Bandwidth \n\n\
+Conditional Mandatory\n\
+  qwts             - Scheduler Q bandwith precentage proportion\n\
+                     ** Mandatory for Deficit Weighted Priority based Fair Queuing (DWPFQ) ** \n\n\
+Optional Parameters \n \
+  borrow           -  Borrow Mask\n \
+                      Each bit number mapped to the scheduler Q priority. [OPTIONAL, default 0xFF] \n \
+                      when set, the Q's un-used  bandwidth can be given to other Qs othewise reserved. \n \
+  tcp-ack-priority -  TCP-ACK Priority Mask\n \
+                      Each bit number mapped to the scheduler Q priority. [OPTIONAL, default 0xFF] \n \
+                      when set, TCP ACKs are always transmitted before any other packet \n \
+                      in that particular Q. \n \
+  contribute       -  Contribute Mask\n \
+                      Each bit number mapped to the scheduler Q priority. [OPTIONAL, default 0xFF] \n \
+                      when set, the un-used bandwidth from the Qs can be given to this Q.\n"
+
+
+#define usage() return(-1)
+
+static void explain(void)
+{
+	fprintf(stderr, SETWT_USAGE);
+}
+
+static int VerifyDigit(char *argv)
+{
+	char *ptr = argv;
+	while(*ptr != '\0')
+	{
+		if(isdigit(*ptr) == 0)
+			return -1;
+		ptr++;
+	}
+	return atoi(argv);
+}
+
+
+
+static int wfq_parse_opt(struct qdisc_util *qu, int argc, char **argv, struct nlmsghdr *n)
+{
+  wfq_config_t opt;
+	int total = 0;
+	int i;
+	int value;
+  memset(&opt, 0, sizeof(opt));
+	opt.borrow = 0xFF;
+	opt.contribute = 0xff;
+	opt.ackPriority = 0x0;
+
+	while(argc > 0) 
+	{
+		if(!strcasecmp(*argv,"type"))
+		{
+			/* Scheduler Configuration */
+			NEXT_ARG();
+			/* Configure Type of the scheduler, deficit-weighted or simply priority queue */
+			if(!strcasecmp(*argv,"dwpfq"))
+				opt.schedType = DEFICIT_WT_PRIORITY;
+			else if(!strcasecmp(*argv,"pq"))
+				opt.schedType = SIMPLE_PRIORITY;
+			else
+			{
+				fprintf(stderr,"Invalid \"type\" %s \n",*argv);
+		    goto parse_failed;
+			}
+		}
+		else if(!strcasecmp(*argv,"bw"))
+		{
+			/* Configure Link Speed */
+			NEXT_ARG();
+			if( (opt.bandwidth = VerifyDigit(*argv)) == -1)
+			{
+				fprintf(stderr,"Invalid \"bw\" %s \n",*argv);
+		    goto parse_failed;
+			}
+    }
+		else if(!strcasecmp(*argv,"borrow"))
+		{
+			/* Borrow Mask */
+      NEXT_ARG();
+			if(sscanf(*argv,"%x",&value) == 0)
+			{
+				fprintf(stderr,"Invalid \"borrow\" %s \n",*argv);
+		    goto parse_failed;
+			}
+			opt.borrow = value;
+		}
+		else if(!strcasecmp(*argv,"tcp-ack-priority"))
+		{
+			/* AckPriority Mask */
+      NEXT_ARG();
+			if(sscanf(*argv,"%x",&value) == 0)
+			{
+				fprintf(stderr,"Invalid \"tcp-ack-priority\" %s \n",*argv);
+		    goto parse_failed;
+			}
+			opt.ackPriority = value;
+		}
+		else if(!strcasecmp(*argv,"contribute"))
+		{
+			/* Contribute Mask */
+      NEXT_ARG();
+			if(sscanf(*argv,"%x",&value) == 0)
+			{
+				fprintf(stderr,"Invalid \"contribute\" %s \n",*argv);
+		    goto parse_failed;
+			}
+			opt.contribute = value;
+		}
+		else if(!strcasecmp(*argv,"qwts"))
+		{
+			/* Scheduler Q weights */
+			NEXT_ARG();
+			for(i=0; i<DEFAULT_QSIZE; i++)
+			{
+			  if( (opt.PerQ[i].weight = VerifyDigit(*argv)) == -1)
+			  {
+			  	fprintf(stderr,"Invalid \"qwts\" %s \n",*argv);
+		      goto parse_failed;
+			  }
+				if( i < (DEFAULT_QSIZE -1))
+				{
+					NEXT_ARG();
+				}
+			  total += opt.PerQ[i].weight;
+      }
+			if(total != 100)
+			{
+				fprintf(stderr,"Invalid \"qwts\" total should be 100%\n");
+		    goto parse_failed;
+			}
+		}
+		else 
+		{
+      fprintf(stderr, "What is \"%s\"?\n", *argv);
+		  goto parse_failed;
+    }
+		argc--;
+		argv++;
+  }
+	if(n->nlmsg_type != RTM_DELQDISC)
+	{
+		if(opt.schedType == 0)
+		{
+			fprintf(stderr,"Parameter  \"type\"is mandatory\n");
+			goto parse_failed;
+		}
+		if(opt.bandwidth == 0)
+		{
+			fprintf(stderr,"Parameter  \"bw\"is mandatory\n");
+			goto parse_failed;
+		}
+		if(opt.schedType == DEFICIT_WT_PRIORITY && total == 0)
+		{
+			fprintf(stderr,"Parameter  \"qwts\"is mandatory for Deficit Weighted Priority scheduler\n");
+			goto parse_failed;
+		}
+	}
+	addattr_l(n, 1024, TCA_OPTIONS, &opt, sizeof(opt));
+	return 0;
+parse_failed:
+	explain();
+	return -1;
+}
+
+
+static int wfq_print_opt(struct qdisc_util *qu, FILE *f, struct rtattr *opt)
+{
+	wfq_config_t *data;
+	int i;
+  if (opt == NULL)
+    return 0;
+  if(RTA_PAYLOAD(opt) < sizeof (wfq_config_t))
+	  return -1;
+
+   data = RTA_DATA (opt);
+   fprintf(f,"Scheduler Configurations : \n");
+	 if(data->schedType == DEFICIT_WT_PRIORITY)
+		 fprintf(f,"  type             - Deficit Weighted Priority based Fair Queuing (DWPFQ)\n");
+	 else if(data->schedType == SIMPLE_PRIORITY)
+		 fprintf(f,"  type             - Priority Queuing (PQ)\n");
+	 else
+     fprintf(f,"  type             - UNKNOWN \n");
+
+	 fprintf(f,"  bw               - %d kbps \n",data->bandwidth);			
+	 fprintf(f,"  borrow           - 0x%x\n",data->borrow);			
+	 fprintf(f,"  tcp-ack-priority - 0x%x\n",data->ackPriority);			
+	 fprintf(f,"  contribute       - 0x%x\n",data->contribute);			
+	 if(data->schedType == DEFICIT_WT_PRIORITY)
+	 {
+	   fprintf(f,"  qwts:            - ");
+     for(i=0; i<DEFAULT_QSIZE; i++)
+		   fprintf(f,"%d ",data->PerQ[i].weight);
+	   fprintf(f,"\n");
+	 }
+   return 0;
+}
+
+static int wfq_print_xstats(struct qdisc_util *qu, FILE *f, struct rtattr *xstats)
+{
+	wfq_config_t *data;
+	int i;
+
+  if (xstats == NULL)
+    return 0;
+
+  if (RTA_PAYLOAD(xstats) <sizeof (wfq_config_t))
+	  return -1;
+
+  data = RTA_DATA (xstats);
+  printf(" \n-------------------------------------------------------------------------\n");
+  for(i=0; i<DEFAULT_QSIZE; i++)
+	{
+    printf("Q.NO=%d :Sent_pkt=%u:Drop_pkt=%u:Sent_bytes=%lld:Drop_bytes=%lld\n",
+                             i,data->PerQ[i].sent_packets,data->PerQ[i].drop_packets,
+                             data->PerQ[i].sent_bytes,data->PerQ[i].drop_bytes);
+    printf(" -------------------------------------------------------------------------\n");
+  }
+	return 0;
+}
+
+struct qdisc_util fusiv_wfq_util = {
+	NULL,
+	"fusiv_wfq",
+	wfq_parse_opt,
+	wfq_print_opt,
+	wfq_print_xstats,
+};
