[ovs-dev] [runt-flows 6/8] datapath: Avoid pskb_may_pull() checks where not needed.

Ben Pfaff blp at nicira.com
Fri Aug 13 17:55:45 UTC 2010


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 at nicira.com>
---
 datapath/flow.c |   11 ++++-------
 1 files changed, 4 insertions(+), 7 deletions(-)

diff --git a/datapath/flow.c b/datapath/flow.c
index cd12d35..a68165e 100644
--- a/datapath/flow.c
+++ b/datapath/flow.c
@@ -51,8 +51,7 @@ struct arp_eth_header
 
 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)
@@ -81,7 +80,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);
@@ -91,14 +90,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
-- 
1.7.1





More information about the dev mailing list