Merge git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net
[linux-2.6-microblaze.git] / net / ipv4 / udp.c
index da805ee..4da5758 100644 (file)
@@ -1297,6 +1297,27 @@ out:
 
 #define UDP_SKB_IS_STATELESS 0x80000000
 
+/* all head states (dst, sk, nf conntrack) except skb extensions are
+ * cleared by udp_rcv().
+ *
+ * We need to preserve secpath, if present, to eventually process
+ * IP_CMSG_PASSSEC at recvmsg() time.
+ *
+ * Other extensions can be cleared.
+ */
+static bool udp_try_make_stateless(struct sk_buff *skb)
+{
+       if (!skb_has_extensions(skb))
+               return true;
+
+       if (!secpath_exists(skb)) {
+               skb_ext_reset(skb);
+               return true;
+       }
+
+       return false;
+}
+
 static void udp_set_dev_scratch(struct sk_buff *skb)
 {
        struct udp_dev_scratch *scratch = udp_skb_scratch(skb);
@@ -1308,11 +1329,7 @@ static void udp_set_dev_scratch(struct sk_buff *skb)
        scratch->csum_unnecessary = !!skb_csum_unnecessary(skb);
        scratch->is_linear = !skb_is_nonlinear(skb);
 #endif
-       /* all head states execept sp (dst, sk, nf) are always cleared by
-        * udp_rcv() and we need to preserve secpath, if present, to eventually
-        * process IP_CMSG_PASSSEC at recvmsg() time
-        */
-       if (likely(!skb_sec_path(skb)))
+       if (udp_try_make_stateless(skb))
                scratch->_tsize_state |= UDP_SKB_IS_STATELESS;
 }