|
@@ -1870,6 +1870,8 @@ EXPORT_SYMBOL(sock_alloc_send_skb);
|
|
|
int __sock_cmsg_send(struct sock *sk, struct msghdr *msg, struct cmsghdr *cmsg,
|
|
|
struct sockcm_cookie *sockc)
|
|
|
{
|
|
|
+ u32 tsflags;
|
|
|
+
|
|
|
switch (cmsg->cmsg_type) {
|
|
|
case SO_MARK:
|
|
|
if (!ns_capable(sock_net(sk)->user_ns, CAP_NET_ADMIN))
|
|
@@ -1878,6 +1880,17 @@ int __sock_cmsg_send(struct sock *sk, struct msghdr *msg, struct cmsghdr *cmsg,
|
|
|
return -EINVAL;
|
|
|
sockc->mark = *(u32 *)CMSG_DATA(cmsg);
|
|
|
break;
|
|
|
+ case SO_TIMESTAMPING:
|
|
|
+ if (cmsg->cmsg_len != CMSG_LEN(sizeof(u32)))
|
|
|
+ return -EINVAL;
|
|
|
+
|
|
|
+ tsflags = *(u32 *)CMSG_DATA(cmsg);
|
|
|
+ if (tsflags & ~SOF_TIMESTAMPING_TX_RECORD_MASK)
|
|
|
+ return -EINVAL;
|
|
|
+
|
|
|
+ sockc->tsflags &= ~SOF_TIMESTAMPING_TX_RECORD_MASK;
|
|
|
+ sockc->tsflags |= tsflags;
|
|
|
+ break;
|
|
|
default:
|
|
|
return -EINVAL;
|
|
|
}
|