aboutsummaryrefslogtreecommitdiffstats
path: root/net/core/sock.c
diff options
context:
space:
mode:
Diffstat (limited to 'net/core/sock.c')
-rw-r--r--net/core/sock.c42
1 files changed, 39 insertions, 3 deletions
diff --git a/net/core/sock.c b/net/core/sock.c
index 4ed7b1d12f5e..16069139797c 100644
--- a/net/core/sock.c
+++ b/net/core/sock.c
@@ -125,6 +125,7 @@
125#include <net/xfrm.h> 125#include <net/xfrm.h>
126#include <linux/ipsec.h> 126#include <linux/ipsec.h>
127#include <net/cls_cgroup.h> 127#include <net/cls_cgroup.h>
128#include <net/netprio_cgroup.h>
128 129
129#include <linux/filter.h> 130#include <linux/filter.h>
130 131
@@ -221,10 +222,16 @@ __u32 sysctl_rmem_default __read_mostly = SK_RMEM_MAX;
221int sysctl_optmem_max __read_mostly = sizeof(unsigned long)*(2*UIO_MAXIOV+512); 222int sysctl_optmem_max __read_mostly = sizeof(unsigned long)*(2*UIO_MAXIOV+512);
222EXPORT_SYMBOL(sysctl_optmem_max); 223EXPORT_SYMBOL(sysctl_optmem_max);
223 224
224#if defined(CONFIG_CGROUPS) && !defined(CONFIG_NET_CLS_CGROUP) 225#if defined(CONFIG_CGROUPS)
226#if !defined(CONFIG_NET_CLS_CGROUP)
225int net_cls_subsys_id = -1; 227int net_cls_subsys_id = -1;
226EXPORT_SYMBOL_GPL(net_cls_subsys_id); 228EXPORT_SYMBOL_GPL(net_cls_subsys_id);
227#endif 229#endif
230#if !defined(CONFIG_NETPRIO_CGROUP)
231int net_prio_subsys_id = -1;
232EXPORT_SYMBOL_GPL(net_prio_subsys_id);
233#endif
234#endif
228 235
229static int sock_set_timeout(long *timeo_p, char __user *optval, int optlen) 236static int sock_set_timeout(long *timeo_p, char __user *optval, int optlen)
230{ 237{
@@ -740,6 +747,11 @@ set_rcvbuf:
740 case SO_RXQ_OVFL: 747 case SO_RXQ_OVFL:
741 sock_valbool_flag(sk, SOCK_RXQ_OVFL, valbool); 748 sock_valbool_flag(sk, SOCK_RXQ_OVFL, valbool);
742 break; 749 break;
750
751 case SO_WIFI_STATUS:
752 sock_valbool_flag(sk, SOCK_WIFI_STATUS, valbool);
753 break;
754
743 default: 755 default:
744 ret = -ENOPROTOOPT; 756 ret = -ENOPROTOOPT;
745 break; 757 break;
@@ -961,6 +973,10 @@ int sock_getsockopt(struct socket *sock, int level, int optname,
961 v.val = !!sock_flag(sk, SOCK_RXQ_OVFL); 973 v.val = !!sock_flag(sk, SOCK_RXQ_OVFL);
962 break; 974 break;
963 975
976 case SO_WIFI_STATUS:
977 v.val = !!sock_flag(sk, SOCK_WIFI_STATUS);
978 break;
979
964 default: 980 default:
965 return -ENOPROTOOPT; 981 return -ENOPROTOOPT;
966 } 982 }
@@ -1111,6 +1127,18 @@ void sock_update_classid(struct sock *sk)
1111 sk->sk_classid = classid; 1127 sk->sk_classid = classid;
1112} 1128}
1113EXPORT_SYMBOL(sock_update_classid); 1129EXPORT_SYMBOL(sock_update_classid);
1130
1131void sock_update_netprioidx(struct sock *sk)
1132{
1133 struct cgroup_netprio_state *state;
1134 if (in_interrupt())
1135 return;
1136 rcu_read_lock();
1137 state = task_netprio_state(current);
1138 sk->sk_cgrp_prioidx = state ? state->prioidx : 0;
1139 rcu_read_unlock();
1140}
1141EXPORT_SYMBOL_GPL(sock_update_netprioidx);
1114#endif 1142#endif
1115 1143
1116/** 1144/**
@@ -1138,6 +1166,7 @@ struct sock *sk_alloc(struct net *net, int family, gfp_t priority,
1138 atomic_set(&sk->sk_wmem_alloc, 1); 1166 atomic_set(&sk->sk_wmem_alloc, 1);
1139 1167
1140 sock_update_classid(sk); 1168 sock_update_classid(sk);
1169 sock_update_netprioidx(sk);
1141 } 1170 }
1142 1171
1143 return sk; 1172 return sk;
@@ -1204,7 +1233,14 @@ void sk_release_kernel(struct sock *sk)
1204} 1233}
1205EXPORT_SYMBOL(sk_release_kernel); 1234EXPORT_SYMBOL(sk_release_kernel);
1206 1235
1207struct sock *sk_clone(const struct sock *sk, const gfp_t priority) 1236/**
1237 * sk_clone_lock - clone a socket, and lock its clone
1238 * @sk: the socket to clone
1239 * @priority: for allocation (%GFP_KERNEL, %GFP_ATOMIC, etc)
1240 *
1241 * Caller must unlock socket even in error path (bh_unlock_sock(newsk))
1242 */
1243struct sock *sk_clone_lock(const struct sock *sk, const gfp_t priority)
1208{ 1244{
1209 struct sock *newsk; 1245 struct sock *newsk;
1210 1246
@@ -1297,7 +1333,7 @@ struct sock *sk_clone(const struct sock *sk, const gfp_t priority)
1297out: 1333out:
1298 return newsk; 1334 return newsk;
1299} 1335}
1300EXPORT_SYMBOL_GPL(sk_clone); 1336EXPORT_SYMBOL_GPL(sk_clone_lock);
1301 1337
1302void sk_setup_caps(struct sock *sk, struct dst_entry *dst) 1338void sk_setup_caps(struct sock *sk, struct dst_entry *dst)
1303{ 1339{