diff options
Diffstat (limited to 'net/core/sock.c')
-rw-r--r-- | net/core/sock.c | 11 |
1 files changed, 11 insertions, 0 deletions
diff --git a/net/core/sock.c b/net/core/sock.c index 1c4b1cd16d65..433715fb141a 100644 --- a/net/core/sock.c +++ b/net/core/sock.c | |||
@@ -667,6 +667,13 @@ set_rcvbuf: | |||
667 | else | 667 | else |
668 | clear_bit(SOCK_PASSSEC, &sock->flags); | 668 | clear_bit(SOCK_PASSSEC, &sock->flags); |
669 | break; | 669 | break; |
670 | case SO_MARK: | ||
671 | if (!capable(CAP_NET_ADMIN)) | ||
672 | ret = -EPERM; | ||
673 | else { | ||
674 | sk->sk_mark = val; | ||
675 | } | ||
676 | break; | ||
670 | 677 | ||
671 | /* We implement the SO_SNDLOWAT etc to | 678 | /* We implement the SO_SNDLOWAT etc to |
672 | not be settable (1003.1g 5.3) */ | 679 | not be settable (1003.1g 5.3) */ |
@@ -836,6 +843,10 @@ int sock_getsockopt(struct socket *sock, int level, int optname, | |||
836 | case SO_PEERSEC: | 843 | case SO_PEERSEC: |
837 | return security_socket_getpeersec_stream(sock, optval, optlen, len); | 844 | return security_socket_getpeersec_stream(sock, optval, optlen, len); |
838 | 845 | ||
846 | case SO_MARK: | ||
847 | v.val = sk->sk_mark; | ||
848 | break; | ||
849 | |||
839 | default: | 850 | default: |
840 | return -ENOPROTOOPT; | 851 | return -ENOPROTOOPT; |
841 | } | 852 | } |