sock: enable timestamping using control messages
[cascardo/linux.git] / net / ipv4 / raw.c
index 088ce66..438f50c 100644 (file)
@@ -339,8 +339,8 @@ int raw_rcv(struct sock *sk, struct sk_buff *skb)
 
 static int raw_send_hdrinc(struct sock *sk, struct flowi4 *fl4,
                           struct msghdr *msg, size_t length,
-                          struct rtable **rtp,
-                          unsigned int flags)
+                          struct rtable **rtp, unsigned int flags,
+                          const struct sockcm_cookie *sockc)
 {
        struct inet_sock *inet = inet_sk(sk);
        struct net *net = sock_net(sk);
@@ -379,7 +379,7 @@ static int raw_send_hdrinc(struct sock *sk, struct flowi4 *fl4,
 
        skb->ip_summed = CHECKSUM_NONE;
 
-       sock_tx_timestamp(sk, &skb_shinfo(skb)->tx_flags);
+       sock_tx_timestamp(sk, sockc->tsflags, &skb_shinfo(skb)->tx_flags);
 
        skb->transport_header = skb->network_header;
        err = -EFAULT;
@@ -540,6 +540,7 @@ static int raw_sendmsg(struct sock *sk, struct msghdr *msg, size_t len)
                daddr = inet->inet_daddr;
        }
 
+       ipc.sockc.tsflags = sk->sk_tsflags;
        ipc.addr = inet->inet_saddr;
        ipc.opt = NULL;
        ipc.tx_flags = 0;
@@ -638,10 +639,10 @@ back_from_confirm:
 
        if (inet->hdrincl)
                err = raw_send_hdrinc(sk, &fl4, msg, len,
-                                     &rt, msg->msg_flags);
+                                     &rt, msg->msg_flags, &ipc.sockc);
 
         else {
-               sock_tx_timestamp(sk, &ipc.tx_flags);
+               sock_tx_timestamp(sk, ipc.sockc.tsflags, &ipc.tx_flags);
 
                if (!ipc.addr)
                        ipc.addr = fl4.daddr;