datapath: Avoid pskb_may_pull() checks where not needed.
authorBen Pfaff <blp@nicira.com>
Thu, 12 Aug 2010 22:37:47 +0000 (15:37 -0700)
committerBen Pfaff <blp@nicira.com>
Fri, 27 Aug 2010 19:32:07 +0000 (12:32 -0700)
These calls to pskb_may_pull() can be reduced to checks on skb->len because
in these contexts those headers will already have been pulled into the
skb linear area if it is there at all.

Signed-off-by: Ben Pfaff <blp@nicira.com>
datapath/flow.c

index eae703d0d4d2479cf02f27f27fb89d9a2373a889..5f122bb5b8f3099eb14dfe4d22f452699583c972 100644 (file)
@@ -36,8 +36,7 @@ static unsigned int hash_seed;
 
 static inline bool arphdr_ok(struct sk_buff *skb)
 {
-       int nh_ofs = skb_network_offset(skb);
-       return pskb_may_pull(skb, nh_ofs + sizeof(struct arp_eth_header));
+       return skb->len >= skb_network_offset(skb) + sizeof(struct arp_eth_header);
 }
 
 static inline int check_iphdr(struct sk_buff *skb)
@@ -66,7 +65,7 @@ static inline int check_iphdr(struct sk_buff *skb)
 static inline bool tcphdr_ok(struct sk_buff *skb)
 {
        int th_ofs = skb_transport_offset(skb);
-       if (pskb_may_pull(skb, th_ofs + sizeof(struct tcphdr))) {
+       if (skb->len >= th_ofs + sizeof(struct tcphdr)) {
                int tcp_len = tcp_hdrlen(skb);
                return (tcp_len >= sizeof(struct tcphdr)
                        && skb->len >= th_ofs + tcp_len);
@@ -76,14 +75,12 @@ static inline bool tcphdr_ok(struct sk_buff *skb)
 
 static inline bool udphdr_ok(struct sk_buff *skb)
 {
-       int th_ofs = skb_transport_offset(skb);
-       return pskb_may_pull(skb, th_ofs + sizeof(struct udphdr));
+       return skb->len >= skb_transport_offset(skb) + sizeof(struct udphdr);
 }
 
 static inline bool icmphdr_ok(struct sk_buff *skb)
 {
-       int th_ofs = skb_transport_offset(skb);
-       return pskb_may_pull(skb, th_ofs + sizeof(struct icmphdr));
+       return skb->len >= skb_transport_offset(skb) + sizeof(struct icmphdr);
 }
 
 #define TCP_FLAGS_OFFSET 13