Re[2]: esfq ? or wrr ?

Linux Advanced Routing and Traffic Control

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

 



[cut]
CH> This would be an appropriate time to ask:
CH> Does anybody have any fixes for or improvements to ESFQ that I don't
CH> know about? My patch doesn't have anything revolutionary -- I've been
CH> merely keeping Alexander Clouter's 2.6 port in sync with the upstream
CH> changes to SFQ.

Yes :)

Some time ago I needed to do sfq between different users in NAT-ed
environment. The users were marked by firewall marks, so I've done a
little change to esfq just adding new hash source - nfmark.
It was done for iproute2-ss020116 and kernel 2.4.26, so it's a little
old. The kernel part is still (I think, not tried) operational.
I think it makes esfq more flexible.

The patches for individual files are below.
-----------KERNEL-PATCH-----------
--- sch_esfq.c.old      2004-04-21 18:00:42.000000000 +0200
+++ sch_esfq.c  2004-01-07 21:39:24.000000000 +0100
@@ -117,6 +117,7 @@
 {
        u32 h, h2;
        u32 hs;
+       u32 nfm;

        switch (skb->protocol) {
        case __constant_htons(ETH_P_IP):
@@ -124,6 +125,7 @@
                struct iphdr *iph = skb->nh.iph;
                h = iph->daddr;
                hs = iph->saddr;
+               nfm = skb -> nfmark;
                h2 = hs^iph->protocol;
                if (!(iph->frag_off&htons(IP_MF|IP_OFFSET)) &&
                    (iph->protocol == IPPROTO_TCP ||
@@ -137,6 +139,7 @@
                struct ipv6hdr *iph = skb->nh.ipv6h;
                h = iph->daddr.s6_addr32[3];
                hs = iph->saddr.s6_addr32[3];
+               nfm = skb->nfmark;
                h2 = hs^iph->nexthdr;
                if (iph->nexthdr == IPPROTO_TCP ||
                    iph->nexthdr == IPPROTO_UDP ||
@@ -148,6 +151,7 @@
                h = (u32)(unsigned long)skb->dst;
                hs = (u32)(unsigned long)skb->sk;
                h2 = hs^skb->protocol;
+               nfm = skb->nfmark;
        }
        switch(q->hash_kind)
        {
@@ -157,6 +161,8 @@
                return esfq_hash_u32(q,h);
        case TCA_SFQ_HASH_SRC:
                return esfq_hash_u32(q,hs);
+       case TCA_SFQ_HASH_FWMARK:
+               return esfq_hash_u32(q,nfm);
        default:
                if (net_ratelimit())
                        printk(KERN_DEBUG "esfq unknown hash method, fallback to classic\n");
--- pkt_sched.h.old     2005-10-15 09:49:10.000000000 +0200
+++ pkt_sched.h 2005-10-15 09:48:31.000000000 +0200
@@ -162,6 +162,7 @@
        TCA_SFQ_HASH_CLASSIC,
        TCA_SFQ_HASH_DST,
        TCA_SFQ_HASH_SRC,
+       TCA_SFQ_HASH_FWMARK,
 };

 struct tc_sfq_qopt
------------IPROUTE----------------------
--- q_esfq.c.old        2005-10-15 09:57:08.000000000 +0200
+++ q_esfq.c    2005-10-15 09:51:36.000000000 +0200
@@ -30,7 +30,7 @@
 {
        fprintf(stderr, "Usage: ... esfq [ perturb SECS ] [ quantum BYTES ] [ depth FLOWS ]\n\t[ divisor HASHBITS ] [ limit PKTS ] [ hash HASHTYPE]\n");
        fprintf(stderr,"Where: \n");
-       fprintf(stderr,"HASHTYPE := { classic | src | dst }\n");
+       fprintf(stderr,"HASHTYPE := { classic | src | dst | fwmark }\n");
 }

 #define usage() return(-1)
@@ -95,6 +95,9 @@
                        } else
                        if(strcmp(*argv,"src") == 0) {
                                opt.hash_kind= TCA_SFQ_HASH_SRC;
+                       } else
+                       if(strcmp(*argv,"fwmark") == 0) {
+                               opt.hash_kind= TCA_SFQ_HASH_FWMARK;
                        } else {
                                fprintf(stderr, "Illegal \"hash\"\n");
                                explain();
@@ -148,6 +151,9 @@
        case TCA_SFQ_HASH_SRC:
                fprintf(f,"src");
                break;
+       case TCA_SFQ_HASH_FWMARK:
+               fprintf(f,"fw");
+               break;
        default:
                fprintf(f,"Unknown");
        }

-- 
Greetings,
 Robert Kurjata

_______________________________________________
LARTC mailing list
LARTC@xxxxxxxxxxxxxxx
http://mailman.ds9a.nl/cgi-bin/mailman/listinfo/lartc

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