X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=net%2Fsched%2Fsch_ingress.c;h=8edc32a6ad2feadf6b310cdc80e44b857fb3613b;hb=6a77f38946aaee1cd85eeec6cf4229b204c15071;hp=13b5c3414794b0210ba1dfb29a202806c45c858e;hpb=c7b5ebbddf7bcd3651947760f423e3783bbe6573;p=linux-2.6.git diff --git a/net/sched/sch_ingress.c b/net/sched/sch_ingress.c index 13b5c3414..8edc32a6a 100644 --- a/net/sched/sch_ingress.c +++ b/net/sched/sch_ingress.c @@ -14,6 +14,7 @@ #include #include #include +#include #include #include #include @@ -151,12 +152,12 @@ static int ingress_enqueue(struct sk_buff *skb,struct Qdisc *sch) * firewall FW_* code. */ #ifdef CONFIG_NET_CLS_ACT - sch->stats.packets++; - sch->stats.bytes += skb->len; + sch->bstats.packets++; + sch->bstats.bytes += skb->len; switch (result) { case TC_ACT_SHOT: result = TC_ACT_SHOT; - sch->stats.drops++; + sch->qstats.drops++; break; case TC_ACT_STOLEN: case TC_ACT_QUEUED: @@ -176,14 +177,14 @@ static int ingress_enqueue(struct sk_buff *skb,struct Qdisc *sch) switch (result) { case TC_POLICE_SHOT: result = NF_DROP; - sch->stats.drops++; + sch->qstats.drops++; break; case TC_POLICE_RECLASSIFY: /* DSCP remarking here ? */ case TC_POLICE_OK: case TC_POLICE_UNSPEC: default: - sch->stats.packets++; - sch->stats.bytes += skb->len; + sch->bstats.packets++; + sch->bstats.bytes += skb->len; result = NF_ACCEPT; break; }; @@ -191,8 +192,8 @@ static int ingress_enqueue(struct sk_buff *skb,struct Qdisc *sch) #else D2PRINTK("Overriding result to ACCEPT\n"); result = NF_ACCEPT; - sch->stats.packets++; - sch->stats.bytes += skb->len; + sch->bstats.packets++; + sch->bstats.bytes += skb->len; #endif #endif @@ -271,10 +272,18 @@ static struct nf_hook_ops ing_ops = { .priority = NF_IP_PRI_FILTER + 1, }; +static struct nf_hook_ops ing6_ops = { + .hook = ing_hook, + .owner = THIS_MODULE, + .pf = PF_INET6, + .hooknum = NF_IP6_PRE_ROUTING, + .priority = NF_IP6_PRI_FILTER + 1, +}; + #endif #endif -int ingress_init(struct Qdisc *sch,struct rtattr *opt) +static int ingress_init(struct Qdisc *sch,struct rtattr *opt) { struct ingress_qdisc_data *p = PRIV(sch); @@ -297,6 +306,12 @@ int ingress_init(struct Qdisc *sch,struct rtattr *opt) return -EINVAL; } nf_registered++; + + if (nf_register_hook(&ing6_ops) < 0) { + printk("IPv6 ingress qdisc registration error, " \ + "disabling IPv6 support.\n"); + } else + nf_registered++; } #endif #endif @@ -408,8 +423,11 @@ static void __exit ingress_module_exit(void) unregister_qdisc(&ingress_qdisc_ops); #ifndef CONFIG_NET_CLS_ACT #ifdef CONFIG_NETFILTER - if (nf_registered) + if (nf_registered) { nf_unregister_hook(&ing_ops); + if (nf_registered > 1) + nf_unregister_hook(&ing6_ops); + } #endif #endif }