net_sched: sch_sfq: use proto_ports_offset() to support AH message
Subsystems (3)
PATCH 8/8 net_sched: sch_sfq: use proto_ports_offset() to support AH message
Signed-off-by Changli Gao <[email protected]>
--- net/sched/sch_sfq.c | 33 ++++++++++++++++----------------- 1 file changed, 16 insertions(+), 17 deletions(-)
net/sched/sch_sfq.c +16 -17
@@ -123,40 +123,39 @@ static unsigned sfq_hash(struct sfq_sched_data *q, struct sk_buff *skb)case htons (ETH_P_IP ): {const struct iphdr *iph; +int poff;if (!pskb_network_may_pull (skb,sizeof (*iph))) goto err; iph =ip_hdr (skb); h = (__force u32 )iph->daddr; h2 = (__force u32 )iph->saddr ^ iph->protocol; -if (!(iph->frag_off&htons (IP_MF |IP_OFFSET )) && - (iph->protocol ==IPPROTO_TCP || - iph->protocol ==IPPROTO_UDP || - iph->protocol ==IPPROTO_UDPLITE || - iph->protocol ==IPPROTO_SCTP || - iph->protocol ==IPPROTO_DCCP || - iph->protocol ==IPPROTO_ESP ) && -pskb_network_may_pull (skb, iph->ihl *4 +4 )) - h2 ^= *(((u32 *)iph) + iph->ihl); +if (iph->frag_off &htons (IP_MF |IP_OFFSET )) +break ; + poff =proto_ports_offset (iph->protocol); +if (poff >=0 && +pskb_network_may_pull (skb, iph->ihl *4 +4 + poff)) { + iph =ip_hdr (skb); + h2 ^= *(u32 *)((void *)iph + iph->ihl *4 + poff); + }break ; }case htons (ETH_P_IPV6 ): {struct ipv6hdr *iph; +int poff;if (!pskb_network_may_pull (skb,sizeof (*iph))) goto err; iph =ipv6_hdr (skb); h = (__force u32 )iph->daddr.s6_addr32[3 ]; h2 = (__force u32 )iph->saddr.s6_addr32[3 ] ^ iph->nexthdr; -if ((iph->nexthdr ==IPPROTO_TCP || - iph->nexthdr ==IPPROTO_UDP || - iph->nexthdr ==IPPROTO_UDPLITE || - iph->nexthdr ==IPPROTO_SCTP || - iph->nexthdr ==IPPROTO_DCCP || - iph->nexthdr ==IPPROTO_ESP ) && -pskb_network_may_pull (skb,sizeof (*iph) +4 )) - h2 ^= *(u32 *)&iph[1 ]; + poff =proto_ports_offset (iph->nexthdr); +if (poff >=0 && +pskb_network_may_pull (skb,sizeof (*iph) +4 + poff)) { + iph =ipv6_hdr (skb); + h2 ^= *(u32 *)((void *)iph +sizeof (*iph) + poff); + }break ; }default :
Quoted 16 lines · Changli Gao
net/sched/sch_sfq.c +1
-8const struct iphdr *iph; +int poff;if (!pskb_network_may_pull (skb,sizeof (*iph))) goto err; iph =ip_hdr (skb); h = (__force u32 )iph->daddr; h2 = (__force u32 )iph->saddr ^ iph->protocol; -if (!(iph->frag_off&htons (IP_MF |IP_OFFSET )) && - (iph->protocol ==IPPROTO_TCP || - iph->protocol ==IPPROTO_UDP || - iph->protocol ==IPPROTO_UDPLITE || - iph->protocol ==IPPROTO_SCTP || - iph->protocol ==IPPROTO_DCCP || - iph->protocol ==IPPROTO_ESP ) && -pskb_network_may_pull (skb, iph->ihl *4 +4 ))
net/sched/sch_sfq.c static unsigned sfq_hash(struct sfq_sched_data *q, struct sk_buff *skb) · line 141
Quoted 10 lines
net/sched/sch_sfq.c +8
-1- h2 ^= *(((u32 *)iph) + iph->ihl); +if (iph->frag_off &htons (IP_MF |IP_OFFSET )) +break ; + poff =proto_ports_offset (iph->protocol); +if (poff >=0 && +pskb_network_may_pull (skb, iph->ihl *4 +4 + poff)) { + iph =ip_hdr (skb); + h2 ^= *(u32 *)((void *)iph + iph->ihl *4 + poff); + }break ;
Same comment with this one as earlier patch? Or it may be too early here ;->
cheers,
jamal
Quoted 27 lines
net/sched/sch_sfq.c +7
-8case htons (ETH_P_IPV6 ): {struct ipv6hdr *iph; +int poff;if (!pskb_network_may_pull (skb,sizeof (*iph))) goto err; iph =ipv6_hdr (skb); h = (__force u32 )iph->daddr.s6_addr32[3 ]; h2 = (__force u32 )iph->saddr.s6_addr32[3 ] ^ iph->nexthdr; -if ((iph->nexthdr ==IPPROTO_TCP || - iph->nexthdr ==IPPROTO_UDP || - iph->nexthdr ==IPPROTO_UDPLITE || - iph->nexthdr ==IPPROTO_SCTP || - iph->nexthdr ==IPPROTO_DCCP || - iph->nexthdr ==IPPROTO_ESP ) && -pskb_network_may_pull (skb,sizeof (*iph) +4 )) - h2 ^= *(u32 *)&iph[1 ]; + poff =proto_ports_offset (iph->nexthdr); +if (poff >=0 && +pskb_network_may_pull (skb,sizeof (*iph) +4 + poff)) { + iph =ipv6_hdr (skb); + h2 ^= *(u32 *)((void *)iph +sizeof (*iph) + poff); + }break ; }default :
From: Changli Gao <[email protected]>
Date: Wed, 18 Aug 2010 13:07:35 +0800
Quoted 1 line
Signed-off-by Changli Gao <[email protected]>
Applied.