net-timestamp: Merge shared code between phy and regular timestamping
authorAlexander Duyck <alexander.h.duyck@intel.com>
Thu, 4 Sep 2014 17:31:10 +0000 (13:31 -0400)
committerDavid S. Miller <davem@davemloft.net>
Sat, 6 Sep 2014 00:43:45 +0000 (17:43 -0700)
This change merges the shared bits that exist between skb_tx_tstamp and
skb_complete_tx_timestamp.  By doing this we can avoid the two diverging as
there were already changes pushed into skb_tx_tstamp that hadn't made it
into the other function.

In addition this resolves issues with the fact that
skb_complete_tx_timestamp was included in linux/skbuff.h even though it was
only compiled in if phy timestamping was enabled.

Signed-off-by: Alexander Duyck <alexander.h.duyck@intel.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/core/skbuff.c
net/core/timestamping.c

index 53ce536e3d6e986131c49a76b9af08971d9c34d8..697e696c914bb17c3d43c0055c8dc24a558423ec 100644 (file)
@@ -3511,33 +3511,13 @@ struct sk_buff *sock_dequeue_err_skb(struct sock *sk)
 }
 EXPORT_SYMBOL(sock_dequeue_err_skb);
 
-void __skb_tstamp_tx(struct sk_buff *orig_skb,
-                    struct skb_shared_hwtstamps *hwtstamps,
-                    struct sock *sk, int tstype)
+static void __skb_complete_tx_timestamp(struct sk_buff *skb,
+                                       struct sock *sk,
+                                       int tstype)
 {
        struct sock_exterr_skb *serr;
-       struct sk_buff *skb;
        int err;
 
-       if (!sk)
-               return;
-
-       if (hwtstamps) {
-               *skb_hwtstamps(orig_skb) =
-                       *hwtstamps;
-       } else {
-               /*
-                * no hardware time stamps available,
-                * so keep the shared tx_flags and only
-                * store software time stamp
-                */
-               orig_skb->tstamp = ktime_get_real();
-       }
-
-       skb = skb_clone(orig_skb, GFP_ATOMIC);
-       if (!skb)
-               return;
-
        serr = SKB_EXT_ERR(skb);
        memset(serr, 0, sizeof(*serr));
        serr->ee.ee_errno = ENOMSG;
@@ -3554,6 +3534,45 @@ void __skb_tstamp_tx(struct sk_buff *orig_skb,
        if (err)
                kfree_skb(skb);
 }
+
+void skb_complete_tx_timestamp(struct sk_buff *skb,
+                              struct skb_shared_hwtstamps *hwtstamps)
+{
+       struct sock *sk = skb->sk;
+
+       skb->sk = NULL;
+
+       if (hwtstamps) {
+               *skb_hwtstamps(skb) = *hwtstamps;
+               __skb_complete_tx_timestamp(skb, sk, SCM_TSTAMP_SND);
+       } else {
+               kfree_skb(skb);
+       }
+
+       sock_put(sk);
+}
+EXPORT_SYMBOL_GPL(skb_complete_tx_timestamp);
+
+void __skb_tstamp_tx(struct sk_buff *orig_skb,
+                    struct skb_shared_hwtstamps *hwtstamps,
+                    struct sock *sk, int tstype)
+{
+       struct sk_buff *skb;
+
+       if (!sk)
+               return;
+
+       if (hwtstamps)
+               *skb_hwtstamps(orig_skb) = *hwtstamps;
+       else
+               orig_skb->tstamp = ktime_get_real();
+
+       skb = skb_clone(orig_skb, GFP_ATOMIC);
+       if (!skb)
+               return;
+
+       __skb_complete_tx_timestamp(skb, sk, tstype);
+}
 EXPORT_SYMBOL_GPL(__skb_tstamp_tx);
 
 void skb_tstamp_tx(struct sk_buff *orig_skb,
index a8770391ea5bfc0db85135cf913c84d09f55cedb..f48a59fd8f39eb3e98f7732a71fd323d89de560c 100644 (file)
@@ -63,35 +63,6 @@ void skb_clone_tx_timestamp(struct sk_buff *skb)
 }
 EXPORT_SYMBOL_GPL(skb_clone_tx_timestamp);
 
-void skb_complete_tx_timestamp(struct sk_buff *skb,
-                              struct skb_shared_hwtstamps *hwtstamps)
-{
-       struct sock *sk = skb->sk;
-       struct sock_exterr_skb *serr;
-       int err;
-
-       if (!hwtstamps) {
-               sock_put(sk);
-               kfree_skb(skb);
-               return;
-       }
-
-       *skb_hwtstamps(skb) = *hwtstamps;
-
-       serr = SKB_EXT_ERR(skb);
-       memset(serr, 0, sizeof(*serr));
-       serr->ee.ee_errno = ENOMSG;
-       serr->ee.ee_origin = SO_EE_ORIGIN_TIMESTAMPING;
-       skb->sk = NULL;
-
-       err = sock_queue_err_skb(sk, skb);
-
-       sock_put(sk);
-       if (err)
-               kfree_skb(skb);
-}
-EXPORT_SYMBOL_GPL(skb_complete_tx_timestamp);
-
 bool skb_defer_rx_timestamp(struct sk_buff *skb)
 {
        struct phy_device *phydev;