|
@@ -34,7 +34,7 @@
|
|
* Alan Cox : TCP ack handling is buggy, the DESTROY timer
|
|
* Alan Cox : TCP ack handling is buggy, the DESTROY timer
|
|
* was buggy. Put a remove_sock() in the handler
|
|
* was buggy. Put a remove_sock() in the handler
|
|
* for memory when we hit 0. Also altered the timer
|
|
* for memory when we hit 0. Also altered the timer
|
|
- * code. The ACK stuff can wait and needs major
|
|
|
|
|
|
+ * code. The ACK stuff can wait and needs major
|
|
* TCP layer surgery.
|
|
* TCP layer surgery.
|
|
* Alan Cox : Fixed TCP ack bug, removed remove sock
|
|
* Alan Cox : Fixed TCP ack bug, removed remove sock
|
|
* and fixed timer/inet_bh race.
|
|
* and fixed timer/inet_bh race.
|
|
@@ -217,8 +217,8 @@ static void sock_warn_obsolete_bsdism(const char *name)
|
|
{
|
|
{
|
|
static int warned;
|
|
static int warned;
|
|
static char warncomm[TASK_COMM_LEN];
|
|
static char warncomm[TASK_COMM_LEN];
|
|
- if (strcmp(warncomm, current->comm) && warned < 5) {
|
|
|
|
- strcpy(warncomm, current->comm);
|
|
|
|
|
|
+ if (strcmp(warncomm, current->comm) && warned < 5) {
|
|
|
|
+ strcpy(warncomm, current->comm);
|
|
printk(KERN_WARNING "process `%s' is using obsolete "
|
|
printk(KERN_WARNING "process `%s' is using obsolete "
|
|
"%s SO_BSDCOMPAT\n", warncomm, name);
|
|
"%s SO_BSDCOMPAT\n", warncomm, name);
|
|
warned++;
|
|
warned++;
|
|
@@ -226,8 +226,8 @@ static void sock_warn_obsolete_bsdism(const char *name)
|
|
}
|
|
}
|
|
|
|
|
|
static void sock_disable_timestamp(struct sock *sk)
|
|
static void sock_disable_timestamp(struct sock *sk)
|
|
-{
|
|
|
|
- if (sock_flag(sk, SOCK_TIMESTAMP)) {
|
|
|
|
|
|
+{
|
|
|
|
+ if (sock_flag(sk, SOCK_TIMESTAMP)) {
|
|
sock_reset_flag(sk, SOCK_TIMESTAMP);
|
|
sock_reset_flag(sk, SOCK_TIMESTAMP);
|
|
net_disable_timestamp();
|
|
net_disable_timestamp();
|
|
}
|
|
}
|
|
@@ -347,7 +347,7 @@ int sock_setsockopt(struct socket *sock, int level, int optname,
|
|
int valbool;
|
|
int valbool;
|
|
struct linger ling;
|
|
struct linger ling;
|
|
int ret = 0;
|
|
int ret = 0;
|
|
-
|
|
|
|
|
|
+
|
|
/*
|
|
/*
|
|
* Options without arguments
|
|
* Options without arguments
|
|
*/
|
|
*/
|
|
@@ -360,20 +360,20 @@ int sock_setsockopt(struct socket *sock, int level, int optname,
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|
|
#endif
|
|
#endif
|
|
-
|
|
|
|
- if(optlen<sizeof(int))
|
|
|
|
- return(-EINVAL);
|
|
|
|
-
|
|
|
|
|
|
+
|
|
|
|
+ if(optlen<sizeof(int))
|
|
|
|
+ return(-EINVAL);
|
|
|
|
+
|
|
if (get_user(val, (int __user *)optval))
|
|
if (get_user(val, (int __user *)optval))
|
|
return -EFAULT;
|
|
return -EFAULT;
|
|
-
|
|
|
|
- valbool = val?1:0;
|
|
|
|
|
|
+
|
|
|
|
+ valbool = val?1:0;
|
|
|
|
|
|
lock_sock(sk);
|
|
lock_sock(sk);
|
|
|
|
|
|
- switch(optname)
|
|
|
|
- {
|
|
|
|
- case SO_DEBUG:
|
|
|
|
|
|
+ switch(optname)
|
|
|
|
+ {
|
|
|
|
+ case SO_DEBUG:
|
|
if(val && !capable(CAP_NET_ADMIN))
|
|
if(val && !capable(CAP_NET_ADMIN))
|
|
{
|
|
{
|
|
ret = -EACCES;
|
|
ret = -EACCES;
|
|
@@ -389,7 +389,7 @@ int sock_setsockopt(struct socket *sock, int level, int optname,
|
|
case SO_TYPE:
|
|
case SO_TYPE:
|
|
case SO_ERROR:
|
|
case SO_ERROR:
|
|
ret = -ENOPROTOOPT;
|
|
ret = -ENOPROTOOPT;
|
|
- break;
|
|
|
|
|
|
+ break;
|
|
case SO_DONTROUTE:
|
|
case SO_DONTROUTE:
|
|
if (valbool)
|
|
if (valbool)
|
|
sock_set_flag(sk, SOCK_LOCALROUTE);
|
|
sock_set_flag(sk, SOCK_LOCALROUTE);
|
|
@@ -404,7 +404,7 @@ int sock_setsockopt(struct socket *sock, int level, int optname,
|
|
about it this is right. Otherwise apps have to
|
|
about it this is right. Otherwise apps have to
|
|
play 'guess the biggest size' games. RCVBUF/SNDBUF
|
|
play 'guess the biggest size' games. RCVBUF/SNDBUF
|
|
are treated in BSD as hints */
|
|
are treated in BSD as hints */
|
|
-
|
|
|
|
|
|
+
|
|
if (val > sysctl_wmem_max)
|
|
if (val > sysctl_wmem_max)
|
|
val = sysctl_wmem_max;
|
|
val = sysctl_wmem_max;
|
|
set_sndbuf:
|
|
set_sndbuf:
|
|
@@ -433,7 +433,7 @@ set_sndbuf:
|
|
about it this is right. Otherwise apps have to
|
|
about it this is right. Otherwise apps have to
|
|
play 'guess the biggest size' games. RCVBUF/SNDBUF
|
|
play 'guess the biggest size' games. RCVBUF/SNDBUF
|
|
are treated in BSD as hints */
|
|
are treated in BSD as hints */
|
|
-
|
|
|
|
|
|
+
|
|
if (val > sysctl_rmem_max)
|
|
if (val > sysctl_rmem_max)
|
|
val = sysctl_rmem_max;
|
|
val = sysctl_rmem_max;
|
|
set_rcvbuf:
|
|
set_rcvbuf:
|
|
@@ -474,16 +474,16 @@ set_rcvbuf:
|
|
sock_valbool_flag(sk, SOCK_KEEPOPEN, valbool);
|
|
sock_valbool_flag(sk, SOCK_KEEPOPEN, valbool);
|
|
break;
|
|
break;
|
|
|
|
|
|
- case SO_OOBINLINE:
|
|
|
|
|
|
+ case SO_OOBINLINE:
|
|
sock_valbool_flag(sk, SOCK_URGINLINE, valbool);
|
|
sock_valbool_flag(sk, SOCK_URGINLINE, valbool);
|
|
break;
|
|
break;
|
|
|
|
|
|
- case SO_NO_CHECK:
|
|
|
|
|
|
+ case SO_NO_CHECK:
|
|
sk->sk_no_check = valbool;
|
|
sk->sk_no_check = valbool;
|
|
break;
|
|
break;
|
|
|
|
|
|
case SO_PRIORITY:
|
|
case SO_PRIORITY:
|
|
- if ((val >= 0 && val <= 6) || capable(CAP_NET_ADMIN))
|
|
|
|
|
|
+ if ((val >= 0 && val <= 6) || capable(CAP_NET_ADMIN))
|
|
sk->sk_priority = val;
|
|
sk->sk_priority = val;
|
|
else
|
|
else
|
|
ret = -EPERM;
|
|
ret = -EPERM;
|
|
@@ -547,9 +547,9 @@ set_rcvbuf:
|
|
#ifdef CONFIG_NETDEVICES
|
|
#ifdef CONFIG_NETDEVICES
|
|
case SO_BINDTODEVICE:
|
|
case SO_BINDTODEVICE:
|
|
{
|
|
{
|
|
- char devname[IFNAMSIZ];
|
|
|
|
|
|
+ char devname[IFNAMSIZ];
|
|
|
|
|
|
- /* Sorry... */
|
|
|
|
|
|
+ /* Sorry... */
|
|
if (!capable(CAP_NET_RAW)) {
|
|
if (!capable(CAP_NET_RAW)) {
|
|
ret = -EPERM;
|
|
ret = -EPERM;
|
|
break;
|
|
break;
|
|
@@ -557,9 +557,9 @@ set_rcvbuf:
|
|
|
|
|
|
/* Bind this socket to a particular device like "eth0",
|
|
/* Bind this socket to a particular device like "eth0",
|
|
* as specified in the passed interface name. If the
|
|
* as specified in the passed interface name. If the
|
|
- * name is "" or the option length is zero the socket
|
|
|
|
- * is not bound.
|
|
|
|
- */
|
|
|
|
|
|
+ * name is "" or the option length is zero the socket
|
|
|
|
+ * is not bound.
|
|
|
|
+ */
|
|
|
|
|
|
if (!valbool) {
|
|
if (!valbool) {
|
|
sk->sk_bound_dev_if = 0;
|
|
sk->sk_bound_dev_if = 0;
|
|
@@ -608,7 +608,7 @@ set_rcvbuf:
|
|
case SO_DETACH_FILTER:
|
|
case SO_DETACH_FILTER:
|
|
rcu_read_lock_bh();
|
|
rcu_read_lock_bh();
|
|
filter = rcu_dereference(sk->sk_filter);
|
|
filter = rcu_dereference(sk->sk_filter);
|
|
- if (filter) {
|
|
|
|
|
|
+ if (filter) {
|
|
rcu_assign_pointer(sk->sk_filter, NULL);
|
|
rcu_assign_pointer(sk->sk_filter, NULL);
|
|
sk_filter_release(sk, filter);
|
|
sk_filter_release(sk, filter);
|
|
rcu_read_unlock_bh();
|
|
rcu_read_unlock_bh();
|
|
@@ -628,9 +628,9 @@ set_rcvbuf:
|
|
/* We implement the SO_SNDLOWAT etc to
|
|
/* We implement the SO_SNDLOWAT etc to
|
|
not be settable (1003.1g 5.3) */
|
|
not be settable (1003.1g 5.3) */
|
|
default:
|
|
default:
|
|
- ret = -ENOPROTOOPT;
|
|
|
|
|
|
+ ret = -ENOPROTOOPT;
|
|
break;
|
|
break;
|
|
- }
|
|
|
|
|
|
+ }
|
|
release_sock(sk);
|
|
release_sock(sk);
|
|
return ret;
|
|
return ret;
|
|
}
|
|
}
|
|
@@ -640,32 +640,32 @@ int sock_getsockopt(struct socket *sock, int level, int optname,
|
|
char __user *optval, int __user *optlen)
|
|
char __user *optval, int __user *optlen)
|
|
{
|
|
{
|
|
struct sock *sk = sock->sk;
|
|
struct sock *sk = sock->sk;
|
|
-
|
|
|
|
|
|
+
|
|
union
|
|
union
|
|
{
|
|
{
|
|
- int val;
|
|
|
|
- struct linger ling;
|
|
|
|
|
|
+ int val;
|
|
|
|
+ struct linger ling;
|
|
struct timeval tm;
|
|
struct timeval tm;
|
|
} v;
|
|
} v;
|
|
-
|
|
|
|
|
|
+
|
|
unsigned int lv = sizeof(int);
|
|
unsigned int lv = sizeof(int);
|
|
int len;
|
|
int len;
|
|
-
|
|
|
|
- if(get_user(len,optlen))
|
|
|
|
- return -EFAULT;
|
|
|
|
|
|
+
|
|
|
|
+ if(get_user(len,optlen))
|
|
|
|
+ return -EFAULT;
|
|
if(len < 0)
|
|
if(len < 0)
|
|
return -EINVAL;
|
|
return -EINVAL;
|
|
-
|
|
|
|
- switch(optname)
|
|
|
|
- {
|
|
|
|
- case SO_DEBUG:
|
|
|
|
|
|
+
|
|
|
|
+ switch(optname)
|
|
|
|
+ {
|
|
|
|
+ case SO_DEBUG:
|
|
v.val = sock_flag(sk, SOCK_DBG);
|
|
v.val = sock_flag(sk, SOCK_DBG);
|
|
break;
|
|
break;
|
|
-
|
|
|
|
|
|
+
|
|
case SO_DONTROUTE:
|
|
case SO_DONTROUTE:
|
|
v.val = sock_flag(sk, SOCK_LOCALROUTE);
|
|
v.val = sock_flag(sk, SOCK_LOCALROUTE);
|
|
break;
|
|
break;
|
|
-
|
|
|
|
|
|
+
|
|
case SO_BROADCAST:
|
|
case SO_BROADCAST:
|
|
v.val = !!sock_flag(sk, SOCK_BROADCAST);
|
|
v.val = !!sock_flag(sk, SOCK_BROADCAST);
|
|
break;
|
|
break;
|
|
@@ -673,7 +673,7 @@ int sock_getsockopt(struct socket *sock, int level, int optname,
|
|
case SO_SNDBUF:
|
|
case SO_SNDBUF:
|
|
v.val = sk->sk_sndbuf;
|
|
v.val = sk->sk_sndbuf;
|
|
break;
|
|
break;
|
|
-
|
|
|
|
|
|
+
|
|
case SO_RCVBUF:
|
|
case SO_RCVBUF:
|
|
v.val = sk->sk_rcvbuf;
|
|
v.val = sk->sk_rcvbuf;
|
|
break;
|
|
break;
|
|
@@ -687,7 +687,7 @@ int sock_getsockopt(struct socket *sock, int level, int optname,
|
|
break;
|
|
break;
|
|
|
|
|
|
case SO_TYPE:
|
|
case SO_TYPE:
|
|
- v.val = sk->sk_type;
|
|
|
|
|
|
+ v.val = sk->sk_type;
|
|
break;
|
|
break;
|
|
|
|
|
|
case SO_ERROR:
|
|
case SO_ERROR:
|
|
@@ -699,7 +699,7 @@ int sock_getsockopt(struct socket *sock, int level, int optname,
|
|
case SO_OOBINLINE:
|
|
case SO_OOBINLINE:
|
|
v.val = !!sock_flag(sk, SOCK_URGINLINE);
|
|
v.val = !!sock_flag(sk, SOCK_URGINLINE);
|
|
break;
|
|
break;
|
|
-
|
|
|
|
|
|
+
|
|
case SO_NO_CHECK:
|
|
case SO_NO_CHECK:
|
|
v.val = sk->sk_no_check;
|
|
v.val = sk->sk_no_check;
|
|
break;
|
|
break;
|
|
@@ -707,13 +707,13 @@ int sock_getsockopt(struct socket *sock, int level, int optname,
|
|
case SO_PRIORITY:
|
|
case SO_PRIORITY:
|
|
v.val = sk->sk_priority;
|
|
v.val = sk->sk_priority;
|
|
break;
|
|
break;
|
|
-
|
|
|
|
- case SO_LINGER:
|
|
|
|
|
|
+
|
|
|
|
+ case SO_LINGER:
|
|
lv = sizeof(v.ling);
|
|
lv = sizeof(v.ling);
|
|
v.ling.l_onoff = !!sock_flag(sk, SOCK_LINGER);
|
|
v.ling.l_onoff = !!sock_flag(sk, SOCK_LINGER);
|
|
- v.ling.l_linger = sk->sk_lingertime / HZ;
|
|
|
|
|
|
+ v.ling.l_linger = sk->sk_lingertime / HZ;
|
|
break;
|
|
break;
|
|
-
|
|
|
|
|
|
+
|
|
case SO_BSDCOMPAT:
|
|
case SO_BSDCOMPAT:
|
|
sock_warn_obsolete_bsdism("getsockopt");
|
|
sock_warn_obsolete_bsdism("getsockopt");
|
|
break;
|
|
break;
|
|
@@ -750,7 +750,7 @@ int sock_getsockopt(struct socket *sock, int level, int optname,
|
|
|
|
|
|
case SO_SNDLOWAT:
|
|
case SO_SNDLOWAT:
|
|
v.val=1;
|
|
v.val=1;
|
|
- break;
|
|
|
|
|
|
+ break;
|
|
|
|
|
|
case SO_PASSCRED:
|
|
case SO_PASSCRED:
|
|
v.val = test_bit(SOCK_PASSCRED, &sock->flags) ? 1 : 0;
|
|
v.val = test_bit(SOCK_PASSCRED, &sock->flags) ? 1 : 0;
|
|
@@ -798,9 +798,9 @@ int sock_getsockopt(struct socket *sock, int level, int optname,
|
|
if (copy_to_user(optval, &v, len))
|
|
if (copy_to_user(optval, &v, len))
|
|
return -EFAULT;
|
|
return -EFAULT;
|
|
lenout:
|
|
lenout:
|
|
- if (put_user(len, optlen))
|
|
|
|
- return -EFAULT;
|
|
|
|
- return 0;
|
|
|
|
|
|
+ if (put_user(len, optlen))
|
|
|
|
+ return -EFAULT;
|
|
|
|
+ return 0;
|
|
}
|
|
}
|
|
|
|
|
|
/*
|
|
/*
|
|
@@ -846,7 +846,7 @@ struct sock *sk_alloc(int family, gfp_t priority,
|
|
sk->sk_prot = sk->sk_prot_creator = prot;
|
|
sk->sk_prot = sk->sk_prot_creator = prot;
|
|
sock_lock_init(sk);
|
|
sock_lock_init(sk);
|
|
}
|
|
}
|
|
-
|
|
|
|
|
|
+
|
|
if (security_sk_alloc(sk, family, priority))
|
|
if (security_sk_alloc(sk, family, priority))
|
|
goto out_free;
|
|
goto out_free;
|
|
|
|
|
|
@@ -988,8 +988,8 @@ void __init sk_init(void)
|
|
*/
|
|
*/
|
|
|
|
|
|
|
|
|
|
-/*
|
|
|
|
- * Write buffer destructor automatically called from kfree_skb.
|
|
|
|
|
|
+/*
|
|
|
|
+ * Write buffer destructor automatically called from kfree_skb.
|
|
*/
|
|
*/
|
|
void sock_wfree(struct sk_buff *skb)
|
|
void sock_wfree(struct sk_buff *skb)
|
|
{
|
|
{
|
|
@@ -1002,8 +1002,8 @@ void sock_wfree(struct sk_buff *skb)
|
|
sock_put(sk);
|
|
sock_put(sk);
|
|
}
|
|
}
|
|
|
|
|
|
-/*
|
|
|
|
- * Read buffer destructor automatically called from kfree_skb.
|
|
|
|
|
|
+/*
|
|
|
|
+ * Read buffer destructor automatically called from kfree_skb.
|
|
*/
|
|
*/
|
|
void sock_rfree(struct sk_buff *skb)
|
|
void sock_rfree(struct sk_buff *skb)
|
|
{
|
|
{
|
|
@@ -1051,7 +1051,7 @@ struct sk_buff *sock_wmalloc(struct sock *sk, unsigned long size, int force,
|
|
|
|
|
|
/*
|
|
/*
|
|
* Allocate a skb from the socket's receive buffer.
|
|
* Allocate a skb from the socket's receive buffer.
|
|
- */
|
|
|
|
|
|
+ */
|
|
struct sk_buff *sock_rmalloc(struct sock *sk, unsigned long size, int force,
|
|
struct sk_buff *sock_rmalloc(struct sock *sk, unsigned long size, int force,
|
|
gfp_t priority)
|
|
gfp_t priority)
|
|
{
|
|
{
|
|
@@ -1065,16 +1065,16 @@ struct sk_buff *sock_rmalloc(struct sock *sk, unsigned long size, int force,
|
|
return NULL;
|
|
return NULL;
|
|
}
|
|
}
|
|
|
|
|
|
-/*
|
|
|
|
|
|
+/*
|
|
* Allocate a memory block from the socket's option memory buffer.
|
|
* Allocate a memory block from the socket's option memory buffer.
|
|
- */
|
|
|
|
|
|
+ */
|
|
void *sock_kmalloc(struct sock *sk, int size, gfp_t priority)
|
|
void *sock_kmalloc(struct sock *sk, int size, gfp_t priority)
|
|
{
|
|
{
|
|
if ((unsigned)size <= sysctl_optmem_max &&
|
|
if ((unsigned)size <= sysctl_optmem_max &&
|
|
atomic_read(&sk->sk_omem_alloc) + size < sysctl_optmem_max) {
|
|
atomic_read(&sk->sk_omem_alloc) + size < sysctl_optmem_max) {
|
|
void *mem;
|
|
void *mem;
|
|
/* First do the add, to avoid the race if kmalloc
|
|
/* First do the add, to avoid the race if kmalloc
|
|
- * might sleep.
|
|
|
|
|
|
+ * might sleep.
|
|
*/
|
|
*/
|
|
atomic_add(size, &sk->sk_omem_alloc);
|
|
atomic_add(size, &sk->sk_omem_alloc);
|
|
mem = kmalloc(size, priority);
|
|
mem = kmalloc(size, priority);
|
|
@@ -1210,7 +1210,7 @@ failure:
|
|
return NULL;
|
|
return NULL;
|
|
}
|
|
}
|
|
|
|
|
|
-struct sk_buff *sock_alloc_send_skb(struct sock *sk, unsigned long size,
|
|
|
|
|
|
+struct sk_buff *sock_alloc_send_skb(struct sock *sk, unsigned long size,
|
|
int noblock, int *errcode)
|
|
int noblock, int *errcode)
|
|
{
|
|
{
|
|
return sock_alloc_send_pskb(sk, size, 0, noblock, errcode);
|
|
return sock_alloc_send_pskb(sk, size, 0, noblock, errcode);
|
|
@@ -1298,7 +1298,7 @@ int sock_no_bind(struct socket *sock, struct sockaddr *saddr, int len)
|
|
return -EOPNOTSUPP;
|
|
return -EOPNOTSUPP;
|
|
}
|
|
}
|
|
|
|
|
|
-int sock_no_connect(struct socket *sock, struct sockaddr *saddr,
|
|
|
|
|
|
+int sock_no_connect(struct socket *sock, struct sockaddr *saddr,
|
|
int len, int flags)
|
|
int len, int flags)
|
|
{
|
|
{
|
|
return -EOPNOTSUPP;
|
|
return -EOPNOTSUPP;
|
|
@@ -1314,7 +1314,7 @@ int sock_no_accept(struct socket *sock, struct socket *newsock, int flags)
|
|
return -EOPNOTSUPP;
|
|
return -EOPNOTSUPP;
|
|
}
|
|
}
|
|
|
|
|
|
-int sock_no_getname(struct socket *sock, struct sockaddr *saddr,
|
|
|
|
|
|
+int sock_no_getname(struct socket *sock, struct sockaddr *saddr,
|
|
int *len, int peer)
|
|
int *len, int peer)
|
|
{
|
|
{
|
|
return -EOPNOTSUPP;
|
|
return -EOPNOTSUPP;
|
|
@@ -1400,7 +1400,7 @@ static void sock_def_error_report(struct sock *sk)
|
|
read_lock(&sk->sk_callback_lock);
|
|
read_lock(&sk->sk_callback_lock);
|
|
if (sk->sk_sleep && waitqueue_active(sk->sk_sleep))
|
|
if (sk->sk_sleep && waitqueue_active(sk->sk_sleep))
|
|
wake_up_interruptible(sk->sk_sleep);
|
|
wake_up_interruptible(sk->sk_sleep);
|
|
- sk_wake_async(sk,0,POLL_ERR);
|
|
|
|
|
|
+ sk_wake_async(sk,0,POLL_ERR);
|
|
read_unlock(&sk->sk_callback_lock);
|
|
read_unlock(&sk->sk_callback_lock);
|
|
}
|
|
}
|
|
|
|
|
|
@@ -1473,7 +1473,7 @@ void sock_init_data(struct socket *sock, struct sock *sk)
|
|
sk->sk_send_head = NULL;
|
|
sk->sk_send_head = NULL;
|
|
|
|
|
|
init_timer(&sk->sk_timer);
|
|
init_timer(&sk->sk_timer);
|
|
-
|
|
|
|
|
|
+
|
|
sk->sk_allocation = GFP_KERNEL;
|
|
sk->sk_allocation = GFP_KERNEL;
|
|
sk->sk_rcvbuf = sysctl_rmem_default;
|
|
sk->sk_rcvbuf = sysctl_rmem_default;
|
|
sk->sk_sndbuf = sysctl_wmem_default;
|
|
sk->sk_sndbuf = sysctl_wmem_default;
|
|
@@ -1553,26 +1553,26 @@ void fastcall release_sock(struct sock *sk)
|
|
EXPORT_SYMBOL(release_sock);
|
|
EXPORT_SYMBOL(release_sock);
|
|
|
|
|
|
int sock_get_timestamp(struct sock *sk, struct timeval __user *userstamp)
|
|
int sock_get_timestamp(struct sock *sk, struct timeval __user *userstamp)
|
|
-{
|
|
|
|
|
|
+{
|
|
if (!sock_flag(sk, SOCK_TIMESTAMP))
|
|
if (!sock_flag(sk, SOCK_TIMESTAMP))
|
|
sock_enable_timestamp(sk);
|
|
sock_enable_timestamp(sk);
|
|
- if (sk->sk_stamp.tv_sec == -1)
|
|
|
|
|
|
+ if (sk->sk_stamp.tv_sec == -1)
|
|
return -ENOENT;
|
|
return -ENOENT;
|
|
if (sk->sk_stamp.tv_sec == 0)
|
|
if (sk->sk_stamp.tv_sec == 0)
|
|
do_gettimeofday(&sk->sk_stamp);
|
|
do_gettimeofday(&sk->sk_stamp);
|
|
return copy_to_user(userstamp, &sk->sk_stamp, sizeof(struct timeval)) ?
|
|
return copy_to_user(userstamp, &sk->sk_stamp, sizeof(struct timeval)) ?
|
|
- -EFAULT : 0;
|
|
|
|
-}
|
|
|
|
|
|
+ -EFAULT : 0;
|
|
|
|
+}
|
|
EXPORT_SYMBOL(sock_get_timestamp);
|
|
EXPORT_SYMBOL(sock_get_timestamp);
|
|
|
|
|
|
void sock_enable_timestamp(struct sock *sk)
|
|
void sock_enable_timestamp(struct sock *sk)
|
|
-{
|
|
|
|
- if (!sock_flag(sk, SOCK_TIMESTAMP)) {
|
|
|
|
|
|
+{
|
|
|
|
+ if (!sock_flag(sk, SOCK_TIMESTAMP)) {
|
|
sock_set_flag(sk, SOCK_TIMESTAMP);
|
|
sock_set_flag(sk, SOCK_TIMESTAMP);
|
|
net_enable_timestamp();
|
|
net_enable_timestamp();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
-EXPORT_SYMBOL(sock_enable_timestamp);
|
|
|
|
|
|
+EXPORT_SYMBOL(sock_enable_timestamp);
|
|
|
|
|
|
/*
|
|
/*
|
|
* Get a socket option on an socket.
|
|
* Get a socket option on an socket.
|