aboutsummaryrefslogtreecommitdiffstats
path: root/net/core/sock.c
diff options
context:
space:
mode:
authorEdward Jee <edjee@google.com>2015-10-08 17:56:48 -0400
committerDavid S. Miller <davem@davemloft.net>2015-10-12 22:25:21 -0400
commitf28ea365cdefc3b4fd0373e70b0106a0cd9b4c23 (patch)
tree136f458e3435a79f3b5048b62dcd3c884ff644f2 /net/core/sock.c
parentc1bf5fe03184f782f2a6827cf314ae58834865da (diff)
sock: support per-packet fwmark
It's useful to allow users to set fwmark for an individual packet, without changing the socket state. The function this patch adds in sock layer can be used by the protocols that need such a feature. Signed-off-by: Edward Hyunkoo Jee <edjee@google.com> Signed-off-by: Eric Dumazet <edumazet@google.com> Cc: Willem de Bruijn <willemb@google.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/core/sock.c')
-rw-r--r--net/core/sock.c26
1 files changed, 26 insertions, 0 deletions
diff --git a/net/core/sock.c b/net/core/sock.c
index 7dd1263e4c24..33957776cc1a 100644
--- a/net/core/sock.c
+++ b/net/core/sock.c
@@ -1852,6 +1852,32 @@ struct sk_buff *sock_alloc_send_skb(struct sock *sk, unsigned long size,
1852} 1852}
1853EXPORT_SYMBOL(sock_alloc_send_skb); 1853EXPORT_SYMBOL(sock_alloc_send_skb);
1854 1854
1855int sock_cmsg_send(struct sock *sk, struct msghdr *msg,
1856 struct sockcm_cookie *sockc)
1857{
1858 struct cmsghdr *cmsg;
1859
1860 for_each_cmsghdr(cmsg, msg) {
1861 if (!CMSG_OK(msg, cmsg))
1862 return -EINVAL;
1863 if (cmsg->cmsg_level != SOL_SOCKET)
1864 continue;
1865 switch (cmsg->cmsg_type) {
1866 case SO_MARK:
1867 if (!ns_capable(sock_net(sk)->user_ns, CAP_NET_ADMIN))
1868 return -EPERM;
1869 if (cmsg->cmsg_len != CMSG_LEN(sizeof(u32)))
1870 return -EINVAL;
1871 sockc->mark = *(u32 *)CMSG_DATA(cmsg);
1872 break;
1873 default:
1874 return -EINVAL;
1875 }
1876 }
1877 return 0;
1878}
1879EXPORT_SYMBOL(sock_cmsg_send);
1880
1855/* On 32bit arches, an skb frag is limited to 2^15 */ 1881/* On 32bit arches, an skb frag is limited to 2^15 */
1856#define SKB_FRAG_PAGE_ORDER get_order(32768) 1882#define SKB_FRAG_PAGE_ORDER get_order(32768)
1857 1883