net/ipv4/af_inet.c

  - remove spurious spaces and tabs at end of lines
  - make sure if, while, for, switch has a space before the opening '('
  - make sure no line has more than 80 chars
  - move initializations to the declaration line where possible
  - bitwise, logical and arithmetic operators have spaces before and after,
    improving readability of complex expressions
  - remove uneeded () in returns
  - other minor cleanups
parent fa44005c
...@@ -21,30 +21,34 @@ ...@@ -21,30 +21,34 @@
* so sockets that fail to connect * so sockets that fail to connect
* don't return -EINPROGRESS. * don't return -EINPROGRESS.
* Alan Cox : Asynchronous I/O support * Alan Cox : Asynchronous I/O support
* Alan Cox : Keep correct socket pointer on sock structures * Alan Cox : Keep correct socket pointer on sock
* structures
* when accept() ed * when accept() ed
* Alan Cox : Semantics of SO_LINGER aren't state moved * Alan Cox : Semantics of SO_LINGER aren't state
* to close when you look carefully. With * moved to close when you look carefully.
* this fixed and the accept bug fixed * With this fixed and the accept bug fixed
* some RPC stuff seems happier. * some RPC stuff seems happier.
* Niibe Yutaka : 4.4BSD style write async I/O * Niibe Yutaka : 4.4BSD style write async I/O
* Alan Cox, * Alan Cox,
* Tony Gale : Fixed reuse semantics. * Tony Gale : Fixed reuse semantics.
* Alan Cox : bind() shouldn't abort existing but dead * Alan Cox : bind() shouldn't abort existing but dead
* sockets. Stops FTP netin:.. I hope. * sockets. Stops FTP netin:.. I hope.
* Alan Cox : bind() works correctly for RAW sockets. Note * Alan Cox : bind() works correctly for RAW sockets.
* that FreeBSD at least was broken in this respect * Note that FreeBSD at least was broken
* so be careful with compatibility tests... * in this respect so be careful with
* compatibility tests...
* Alan Cox : routing cache support * Alan Cox : routing cache support
* Alan Cox : memzero the socket structure for compactness. * Alan Cox : memzero the socket structure for
* compactness.
* Matt Day : nonblock connect error handler * Matt Day : nonblock connect error handler
* Alan Cox : Allow large numbers of pending sockets * Alan Cox : Allow large numbers of pending sockets
* (eg for big web sites), but only if * (eg for big web sites), but only if
* specifically application requested. * specifically application requested.
* Alan Cox : New buffering throughout IP. Used dumbly. * Alan Cox : New buffering throughout IP. Used
* dumbly.
* Alan Cox : New buffering now used smartly. * Alan Cox : New buffering now used smartly.
* Alan Cox : BSD rather than common sense interpretation of * Alan Cox : BSD rather than common sense
* listen. * interpretation of listen.
* Germano Caronni : Assorted small races. * Germano Caronni : Assorted small races.
* Alan Cox : sendmsg/recvmsg basic support. * Alan Cox : sendmsg/recvmsg basic support.
* Alan Cox : Only sendmsg/recvmsg now supported. * Alan Cox : Only sendmsg/recvmsg now supported.
...@@ -117,7 +121,7 @@ ...@@ -117,7 +121,7 @@
#include <linux/wireless.h> /* Note : will define WIRELESS_EXT */ #include <linux/wireless.h> /* Note : will define WIRELESS_EXT */
#endif /* CONFIG_NET_RADIO || CONFIG_NET_PCMCIA_RADIO */ #endif /* CONFIG_NET_RADIO || CONFIG_NET_PCMCIA_RADIO */
struct linux_mib net_statistics[NR_CPUS*2]; struct linux_mib net_statistics[NR_CPUS * 2];
#ifdef INET_REFCNT_DEBUG #ifdef INET_REFCNT_DEBUG
atomic_t inet_sock_nr; atomic_t inet_sock_nr;
...@@ -132,7 +136,7 @@ extern int udp_get_info(char *, char **, off_t, int); ...@@ -132,7 +136,7 @@ extern int udp_get_info(char *, char **, off_t, int);
extern void ip_mc_drop_socket(struct sock *sk); extern void ip_mc_drop_socket(struct sock *sk);
#ifdef CONFIG_DLCI #ifdef CONFIG_DLCI
extern int dlci_ioctl(unsigned int, void*); extern int dlci_ioctl(unsigned int, void *);
#endif #endif
#ifdef CONFIG_DLCI_MODULE #ifdef CONFIG_DLCI_MODULE
...@@ -177,17 +181,18 @@ void inet_sock_destruct(struct sock *sk) ...@@ -177,17 +181,18 @@ void inet_sock_destruct(struct sock *sk)
return; return;
} }
BUG_TRAP(atomic_read(&sk->rmem_alloc) == 0); BUG_TRAP(!atomic_read(&sk->rmem_alloc));
BUG_TRAP(atomic_read(&sk->wmem_alloc) == 0); BUG_TRAP(!atomic_read(&sk->wmem_alloc));
BUG_TRAP(sk->wmem_queued == 0); BUG_TRAP(!sk->wmem_queued);
BUG_TRAP(sk->forward_alloc == 0); BUG_TRAP(!sk->forward_alloc);
if (inet->opt) if (inet->opt)
kfree(inet->opt); kfree(inet->opt);
dst_release(sk->dst_cache); dst_release(sk->dst_cache);
#ifdef INET_REFCNT_DEBUG #ifdef INET_REFCNT_DEBUG
atomic_dec(&inet_sock_nr); atomic_dec(&inet_sock_nr);
printk(KERN_DEBUG "INET socket %p released, %d are still alive\n", sk, atomic_read(&inet_sock_nr)); printk(KERN_DEBUG "INET socket %p released, %d are still alive\n",
sk, atomic_read(&inet_sock_nr));
#endif #endif
} }
...@@ -221,9 +226,9 @@ void inet_sock_release(struct sock *sk) ...@@ -221,9 +226,9 @@ void inet_sock_release(struct sock *sk)
sock_orphan(sk); sock_orphan(sk);
#ifdef INET_REFCNT_DEBUG #ifdef INET_REFCNT_DEBUG
if (atomic_read(&sk->refcnt) != 1) { if (atomic_read(&sk->refcnt) != 1)
printk(KERN_DEBUG "Destruction inet %p delayed, c=%d\n", sk, atomic_read(&sk->refcnt)); printk(KERN_DEBUG "Destruction inet %p delayed, c=%d\n",
} sk, atomic_read(&sk->refcnt));
#endif #endif
sock_put(sk); sock_put(sk);
} }
...@@ -234,18 +239,16 @@ void inet_sock_release(struct sock *sk) ...@@ -234,18 +239,16 @@ void inet_sock_release(struct sock *sk)
* socket object. Mostly it punts to the subprotocols of IP to do * socket object. Mostly it punts to the subprotocols of IP to do
* the work. * the work.
*/ */
/* /*
* Set socket options on an inet socket. * Set socket options on an inet socket.
*/ */
int inet_setsockopt(struct socket *sock, int level, int optname, int inet_setsockopt(struct socket *sock, int level, int optname,
char *optval, int optlen) char *optval, int optlen)
{ {
struct sock *sk=sock->sk; struct sock *sk = sock->sk;
return sk->prot->setsockopt(sk,level,optname,optval,optlen); return sk->prot->setsockopt(sk, level, optname, optval, optlen);
} }
/* /*
...@@ -259,9 +262,9 @@ int inet_setsockopt(struct socket *sock, int level, int optname, ...@@ -259,9 +262,9 @@ int inet_setsockopt(struct socket *sock, int level, int optname,
int inet_getsockopt(struct socket *sock, int level, int optname, int inet_getsockopt(struct socket *sock, int level, int optname,
char *optval, int *optlen) char *optval, int *optlen)
{ {
struct sock *sk=sock->sk; struct sock *sk = sock->sk;
return sk->prot->getsockopt(sk,level,optname,optval,optlen); return sk->prot->getsockopt(sk, level, optname, optval, optlen);
} }
/* /*
...@@ -270,11 +273,12 @@ int inet_getsockopt(struct socket *sock, int level, int optname, ...@@ -270,11 +273,12 @@ int inet_getsockopt(struct socket *sock, int level, int optname,
static int inet_autobind(struct sock *sk) static int inet_autobind(struct sock *sk)
{ {
struct inet_opt *inet = inet_sk(sk); struct inet_opt *inet;
/* We may need to bind the socket. */ /* We may need to bind the socket. */
lock_sock(sk); lock_sock(sk);
inet = inet_sk(sk);
if (!inet->num) { if (!inet->num) {
if (sk->prot->get_port(sk, 0) != 0) { if (sk->prot->get_port(sk, 0)) {
release_sock(sk); release_sock(sk);
return -EAGAIN; return -EAGAIN;
} }
...@@ -287,7 +291,6 @@ static int inet_autobind(struct sock *sk) ...@@ -287,7 +291,6 @@ static int inet_autobind(struct sock *sk)
/* /*
* Move a socket into listening state. * Move a socket into listening state.
*/ */
int inet_listen(struct socket *sock, int backlog) int inet_listen(struct socket *sock, int backlog)
{ {
struct sock *sk = sock->sk; struct sock *sk = sock->sk;
...@@ -301,7 +304,7 @@ int inet_listen(struct socket *sock, int backlog) ...@@ -301,7 +304,7 @@ int inet_listen(struct socket *sock, int backlog)
goto out; goto out;
old_state = sk->state; old_state = sk->state;
if (!((1<<old_state)&(TCPF_CLOSE|TCPF_LISTEN))) if (!((1 << old_state) & (TCPF_CLOSE | TCPF_LISTEN)))
goto out; goto out;
/* Really, if the socket is already in listen state /* Really, if the socket is already in listen state
...@@ -349,16 +352,17 @@ static __inline__ int inet_sk_size(int protocol) ...@@ -349,16 +352,17 @@ static __inline__ int inet_sk_size(int protocol)
static int inet_create(struct socket *sock, int protocol) static int inet_create(struct socket *sock, int protocol)
{ {
struct sock *sk; struct sock *sk;
struct list_head *p; struct list_head *p;
struct inet_protosw *answer; struct inet_protosw *answer;
struct inet_opt *inet; struct inet_opt *inet;
int err = -ENOBUFS;
sock->state = SS_UNCONNECTED; sock->state = SS_UNCONNECTED;
sk = sk_alloc(PF_INET, GFP_KERNEL, inet_sk_size(protocol), sk = sk_alloc(PF_INET, GFP_KERNEL, inet_sk_size(protocol),
inet_sk_slab(protocol)); inet_sk_slab(protocol));
if (sk == NULL) if (!sk)
goto do_oom; goto out;
/* Look for the requested type/protocol pair. */ /* Look for the requested type/protocol pair. */
answer = NULL; answer = NULL;
br_read_lock_bh(BR_NETPROTO_LOCK); br_read_lock_bh(BR_NETPROTO_LOCK);
...@@ -382,13 +386,16 @@ static int inet_create(struct socket *sock, int protocol) ...@@ -382,13 +386,16 @@ static int inet_create(struct socket *sock, int protocol)
} }
br_read_unlock_bh(BR_NETPROTO_LOCK); br_read_unlock_bh(BR_NETPROTO_LOCK);
err = -ESOCKTNOSUPPORT;
if (!answer) if (!answer)
goto free_and_badtype; goto out_sk_free;
err = -EPERM;
if (answer->capability > 0 && !capable(answer->capability)) if (answer->capability > 0 && !capable(answer->capability))
goto free_and_badperm; goto out_sk_free;
err = -EPROTONOSUPPORT;
if (!protocol) if (!protocol)
goto free_and_noproto; goto out_sk_free;
err = 0;
sock->ops = answer->ops; sock->ops = answer->ops;
sk->prot = answer->prot; sk->prot = answer->prot;
sk->no_check = answer->no_check; sk->no_check = answer->no_check;
...@@ -410,18 +417,15 @@ static int inet_create(struct socket *sock, int protocol) ...@@ -410,18 +417,15 @@ static int inet_create(struct socket *sock, int protocol)
inet->id = 0; inet->id = 0;
sock_init_data(sock,sk); sock_init_data(sock, sk);
sk->destruct = inet_sock_destruct; sk->destruct = inet_sock_destruct;
sk->zapped = 0; sk->zapped = 0;
sk->family = PF_INET; sk->family = PF_INET;
sk->protocol = protocol; sk->protocol = protocol;
sk->backlog_rcv = sk->prot->backlog_rcv; sk->backlog_rcv = sk->prot->backlog_rcv;
inet->ttl = sysctl_ip_default_ttl; inet->ttl = sysctl_ip_default_ttl;
inet->mc_loop = 1; inet->mc_loop = 1;
inet->mc_ttl = 1; inet->mc_ttl = 1;
inet->mc_index = 0; inet->mc_index = 0;
...@@ -438,34 +442,20 @@ static int inet_create(struct socket *sock, int protocol) ...@@ -438,34 +442,20 @@ static int inet_create(struct socket *sock, int protocol)
* shares. * shares.
*/ */
inet->sport = htons(inet->num); inet->sport = htons(inet->num);
/* Add to protocol hash chains. */ /* Add to protocol hash chains. */
sk->prot->hash(sk); sk->prot->hash(sk);
} }
if (sk->prot->init) { if (sk->prot->init) {
int err = sk->prot->init(sk); err = sk->prot->init(sk);
if (err != 0) { if (err)
inet_sock_release(sk); inet_sock_release(sk);
return err;
}
} }
return 0; out:
return err;
free_and_badtype: out_sk_free:
sk_free(sk);
return -ESOCKTNOSUPPORT;
free_and_badperm:
sk_free(sk);
return -EPERM;
free_and_noproto:
sk_free(sk); sk_free(sk);
return -EPROTONOSUPPORT; goto out;
do_oom:
return -ENOBUFS;
} }
...@@ -474,7 +464,6 @@ static int inet_create(struct socket *sock, int protocol) ...@@ -474,7 +464,6 @@ static int inet_create(struct socket *sock, int protocol)
* function we are destroying the object and from then on nobody * function we are destroying the object and from then on nobody
* should refer to it. * should refer to it.
*/ */
int inet_release(struct socket *sock) int inet_release(struct socket *sock)
{ {
struct sock *sk = sock->sk; struct sock *sk = sock->sk;
...@@ -498,7 +487,7 @@ int inet_release(struct socket *sock) ...@@ -498,7 +487,7 @@ int inet_release(struct socket *sock)
sock->sk = NULL; sock->sk = NULL;
sk->prot->close(sk, timeout); sk->prot->close(sk, timeout);
} }
return(0); return 0;
} }
/* It is off by default, see below. */ /* It is off by default, see below. */
...@@ -506,19 +495,21 @@ int sysctl_ip_nonlocal_bind; ...@@ -506,19 +495,21 @@ int sysctl_ip_nonlocal_bind;
static int inet_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len) static int inet_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len)
{ {
struct sockaddr_in *addr=(struct sockaddr_in *)uaddr; struct sockaddr_in *addr = (struct sockaddr_in *)uaddr;
struct sock *sk=sock->sk; struct sock *sk = sock->sk;
struct inet_opt *inet = inet_sk(sk); struct inet_opt *inet = inet_sk(sk);
unsigned short snum; unsigned short snum;
int chk_addr_ret; int chk_addr_ret;
int err; int err;
/* If the socket has its own bind function then use it. (RAW) */ /* If the socket has its own bind function then use it. (RAW) */
if(sk->prot->bind) if (sk->prot->bind) {
return sk->prot->bind(sk, uaddr, addr_len); err = sk->prot->bind(sk, uaddr, addr_len);
goto out;
}
err = -EINVAL;
if (addr_len < sizeof(struct sockaddr_in)) if (addr_len < sizeof(struct sockaddr_in))
return -EINVAL; goto out;
chk_addr_ret = inet_addr_type(addr->sin_addr.s_addr); chk_addr_ret = inet_addr_type(addr->sin_addr.s_addr);
...@@ -529,17 +520,19 @@ static int inet_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len) ...@@ -529,17 +520,19 @@ static int inet_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len)
* (ie. your servers still start up even if your ISDN link * (ie. your servers still start up even if your ISDN link
* is temporarily down) * is temporarily down)
*/ */
if (sysctl_ip_nonlocal_bind == 0 && err = -EADDRNOTAVAIL;
inet->freebind == 0 && if (!sysctl_ip_nonlocal_bind &&
!inet->freebind &&
addr->sin_addr.s_addr != INADDR_ANY && addr->sin_addr.s_addr != INADDR_ANY &&
chk_addr_ret != RTN_LOCAL && chk_addr_ret != RTN_LOCAL &&
chk_addr_ret != RTN_MULTICAST && chk_addr_ret != RTN_MULTICAST &&
chk_addr_ret != RTN_BROADCAST) chk_addr_ret != RTN_BROADCAST)
return -EADDRNOTAVAIL; goto out;
snum = ntohs(addr->sin_port); snum = ntohs(addr->sin_port);
err = -EACCES;
if (snum && snum < PROT_SOCK && !capable(CAP_NET_BIND_SERVICE)) if (snum && snum < PROT_SOCK && !capable(CAP_NET_BIND_SERVICE))
return -EACCES; goto out;
/* We keep a pair of addresses. rcv_saddr is the one /* We keep a pair of addresses. rcv_saddr is the one
* used by hash lookups, and saddr is used for transmit. * used by hash lookups, and saddr is used for transmit.
...@@ -553,17 +546,17 @@ static int inet_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len) ...@@ -553,17 +546,17 @@ static int inet_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len)
/* Check these errors (active socket, double bind). */ /* Check these errors (active socket, double bind). */
err = -EINVAL; err = -EINVAL;
if (sk->state != TCP_CLOSE || inet->num) if (sk->state != TCP_CLOSE || inet->num)
goto out; goto out_release_sock;
inet->rcv_saddr = inet->saddr = addr->sin_addr.s_addr; inet->rcv_saddr = inet->saddr = addr->sin_addr.s_addr;
if (chk_addr_ret == RTN_MULTICAST || chk_addr_ret == RTN_BROADCAST) if (chk_addr_ret == RTN_MULTICAST || chk_addr_ret == RTN_BROADCAST)
inet->saddr = 0; /* Use device */ inet->saddr = 0; /* Use device */
/* Make sure we are allowed to bind here. */ /* Make sure we are allowed to bind here. */
if (sk->prot->get_port(sk, snum) != 0) { if (sk->prot->get_port(sk, snum)) {
inet->saddr = inet->rcv_saddr = 0; inet->saddr = inet->rcv_saddr = 0;
err = -EADDRINUSE; err = -EADDRINUSE;
goto out; goto out_release_sock;
} }
if (inet->rcv_saddr) if (inet->rcv_saddr)
...@@ -575,15 +568,16 @@ static int inet_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len) ...@@ -575,15 +568,16 @@ static int inet_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len)
inet->dport = 0; inet->dport = 0;
sk_dst_reset(sk); sk_dst_reset(sk);
err = 0; err = 0;
out: out_release_sock:
release_sock(sk); release_sock(sk);
out:
return err; return err;
} }
int inet_dgram_connect(struct socket *sock, struct sockaddr * uaddr, int inet_dgram_connect(struct socket *sock, struct sockaddr * uaddr,
int addr_len, int flags) int addr_len, int flags)
{ {
struct sock *sk=sock->sk; struct sock *sk = sock->sk;
if (uaddr->sa_family == AF_UNSPEC) if (uaddr->sa_family == AF_UNSPEC)
return sk->prot->disconnect(sk, flags); return sk->prot->disconnect(sk, flags);
...@@ -605,7 +599,7 @@ static long inet_wait_for_connect(struct sock *sk, long timeo) ...@@ -605,7 +599,7 @@ static long inet_wait_for_connect(struct sock *sk, long timeo)
* Connect() does not allow to get error notifications * Connect() does not allow to get error notifications
* without closing the socket. * without closing the socket.
*/ */
while ((1<<sk->state)&(TCPF_SYN_SENT|TCPF_SYN_RECV)) { while ((1 << sk->state) & (TCPF_SYN_SENT | TCPF_SYN_RECV)) {
release_sock(sk); release_sock(sk);
timeo = schedule_timeout(timeo); timeo = schedule_timeout(timeo);
lock_sock(sk); lock_sock(sk);
...@@ -622,11 +616,10 @@ static long inet_wait_for_connect(struct sock *sk, long timeo) ...@@ -622,11 +616,10 @@ static long inet_wait_for_connect(struct sock *sk, long timeo)
* Connect to a remote host. There is regrettably still a little * Connect to a remote host. There is regrettably still a little
* TCP 'magic' in here. * TCP 'magic' in here.
*/ */
int inet_stream_connect(struct socket *sock, struct sockaddr *uaddr,
int inet_stream_connect(struct socket *sock, struct sockaddr * uaddr,
int addr_len, int flags) int addr_len, int flags)
{ {
struct sock *sk=sock->sk; struct sock *sk = sock->sk;
int err; int err;
long timeo; long timeo;
...@@ -651,7 +644,7 @@ int inet_stream_connect(struct socket *sock, struct sockaddr * uaddr, ...@@ -651,7 +644,7 @@ int inet_stream_connect(struct socket *sock, struct sockaddr * uaddr,
break; break;
case SS_UNCONNECTED: case SS_UNCONNECTED:
err = -EISCONN; err = -EISCONN;
if (sk->state != TCP_CLOSE) if (sk->state != TCP_CLOSE)
goto out; goto out;
err = sk->prot->connect(sk, uaddr, addr_len); err = sk->prot->connect(sk, uaddr, addr_len);
...@@ -668,9 +661,9 @@ int inet_stream_connect(struct socket *sock, struct sockaddr * uaddr, ...@@ -668,9 +661,9 @@ int inet_stream_connect(struct socket *sock, struct sockaddr * uaddr,
break; break;
} }
timeo = sock_sndtimeo(sk, flags&O_NONBLOCK); timeo = sock_sndtimeo(sk, flags & O_NONBLOCK);
if ((1<<sk->state)&(TCPF_SYN_SENT|TCPF_SYN_RECV)) { if ((1 << sk->state) & (TCPF_SYN_SENT | TCPF_SYN_RECV)) {
/* Error code is set above */ /* Error code is set above */
if (!timeo || !inet_wait_for_connect(sk, timeo)) if (!timeo || !inet_wait_for_connect(sk, timeo))
goto out; goto out;
...@@ -712,22 +705,22 @@ int inet_stream_connect(struct socket *sock, struct sockaddr * uaddr, ...@@ -712,22 +705,22 @@ int inet_stream_connect(struct socket *sock, struct sockaddr * uaddr,
int inet_accept(struct socket *sock, struct socket *newsock, int flags) int inet_accept(struct socket *sock, struct socket *newsock, int flags)
{ {
struct sock *sk1 = sock->sk; struct sock *sk1 = sock->sk;
struct sock *sk2;
int err = -EINVAL; int err = -EINVAL;
struct sock *sk2 = sk1->prot->accept(sk1, flags, &err);
if((sk2 = sk1->prot->accept(sk1,flags,&err)) == NULL) if (!sk2)
goto do_err; goto do_err;
lock_sock(sk2); lock_sock(sk2);
BUG_TRAP((1<<sk2->state)&(TCPF_ESTABLISHED|TCPF_CLOSE_WAIT|TCPF_CLOSE)); BUG_TRAP((1 << sk2->state) &
(TCPF_ESTABLISHED | TCPF_CLOSE_WAIT | TCPF_CLOSE));
sock_graft(sk2, newsock); sock_graft(sk2, newsock);
newsock->state = SS_CONNECTED; newsock->state = SS_CONNECTED;
err = 0;
release_sock(sk2); release_sock(sk2);
return 0;
do_err: do_err:
return err; return err;
} }
...@@ -736,19 +729,18 @@ int inet_accept(struct socket *sock, struct socket *newsock, int flags) ...@@ -736,19 +729,18 @@ int inet_accept(struct socket *sock, struct socket *newsock, int flags)
/* /*
* This does both peername and sockname. * This does both peername and sockname.
*/ */
static int inet_getname(struct socket *sock, struct sockaddr *uaddr, static int inet_getname(struct socket *sock, struct sockaddr *uaddr,
int *uaddr_len, int peer) int *uaddr_len, int peer)
{ {
struct sock *sk = sock->sk; struct sock *sk = sock->sk;
struct inet_opt *inet = inet_sk(sk); struct inet_opt *inet = inet_sk(sk);
struct sockaddr_in *sin = (struct sockaddr_in *)uaddr; struct sockaddr_in *sin = (struct sockaddr_in *)uaddr;
sin->sin_family = AF_INET; sin->sin_family = AF_INET;
if (peer) { if (peer) {
if (!inet->dport) if (!inet->dport ||
return -ENOTCONN; (((1 << sk->state) & (TCPF_CLOSE | TCPF_SYN_SENT)) &&
if (((1<<sk->state)&(TCPF_CLOSE|TCPF_SYN_SENT)) && peer == 1) peer == 1))
return -ENOTCONN; return -ENOTCONN;
sin->sin_port = inet->dport; sin->sin_port = inet->dport;
sin->sin_addr.s_addr = inet->daddr; sin->sin_addr.s_addr = inet->daddr;
...@@ -760,7 +752,7 @@ static int inet_getname(struct socket *sock, struct sockaddr *uaddr, ...@@ -760,7 +752,7 @@ static int inet_getname(struct socket *sock, struct sockaddr *uaddr,
sin->sin_addr.s_addr = addr; sin->sin_addr.s_addr = addr;
} }
*uaddr_len = sizeof(*sin); *uaddr_len = sizeof(*sin);
return(0); return 0;
} }
...@@ -770,10 +762,8 @@ int inet_recvmsg(struct socket *sock, struct msghdr *msg, int size, ...@@ -770,10 +762,8 @@ int inet_recvmsg(struct socket *sock, struct msghdr *msg, int size,
{ {
struct sock *sk = sock->sk; struct sock *sk = sock->sk;
int addr_len = 0; int addr_len = 0;
int err; int err = sk->prot->recvmsg(sk, msg, size, flags & MSG_DONTWAIT,
flags & ~MSG_DONTWAIT, &addr_len);
err = sk->prot->recvmsg(sk, msg, size, flags&MSG_DONTWAIT,
flags&~MSG_DONTWAIT, &addr_len);
if (err >= 0) if (err >= 0)
msg->msg_namelen = addr_len; msg->msg_namelen = addr_len;
return err; return err;
...@@ -803,12 +793,13 @@ int inet_shutdown(struct socket *sock, int how) ...@@ -803,12 +793,13 @@ int inet_shutdown(struct socket *sock, int how)
how++; /* maps 0->1 has the advantage of making bit 1 rcvs and how++; /* maps 0->1 has the advantage of making bit 1 rcvs and
1->2 bit 2 snds. 1->2 bit 2 snds.
2->3 */ 2->3 */
if ((how & ~SHUTDOWN_MASK) || how==0) /* MAXINT->0 */ if ((how & ~SHUTDOWN_MASK) || !how) /* MAXINT->0 */
return -EINVAL; return -EINVAL;
lock_sock(sk); lock_sock(sk);
if (sock->state == SS_CONNECTING) { if (sock->state == SS_CONNECTING) {
if ((1<<sk->state)&(TCPF_SYN_SENT|TCPF_SYN_RECV|TCPF_CLOSE)) if ((1 << sk->state) &
(TCPF_SYN_SENT | TCPF_SYN_RECV | TCPF_CLOSE))
sock->state = SS_DISCONNECTING; sock->state = SS_DISCONNECTING;
else else
sock->state = SS_CONNECTED; sock->state = SS_CONNECTED;
...@@ -858,38 +849,42 @@ int inet_shutdown(struct socket *sock, int how) ...@@ -858,38 +849,42 @@ int inet_shutdown(struct socket *sock, int how)
static int inet_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg) static int inet_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
{ {
struct sock *sk = sock->sk; struct sock *sk = sock->sk;
int err; int err = 0;
int pid; int pid;
switch(cmd) { switch (cmd) {
case FIOSETOWN: case FIOSETOWN:
case SIOCSPGRP: case SIOCSPGRP:
err = get_user(pid, (int *) arg); if (get_user(pid, (int *)arg))
if (err) err = -EFAULT;
return err; else if (current->pid != pid &&
if (current->pid != pid && current->pgrp != -pid && current->pgrp != -pid &&
!capable(CAP_NET_ADMIN)) !capable(CAP_NET_ADMIN))
return -EPERM; err = -EPERM;
sk->proc = pid; else
return(0); sk->proc = pid;
break;
case FIOGETOWN: case FIOGETOWN:
case SIOCGPGRP: case SIOCGPGRP:
return put_user(sk->proc, (int *)arg); err = put_user(sk->proc, (int *)arg);
break;
case SIOCGSTAMP: case SIOCGSTAMP:
if(sk->stamp.tv_sec==0) if (!sk->stamp.tv_sec)
return -ENOENT; err = -ENOENT;
err = copy_to_user((void *)arg,&sk->stamp,sizeof(struct timeval)); else if (copy_to_user((void *)arg, &sk->stamp,
if (err) sizeof(struct timeval)))
err = -EFAULT; err = -EFAULT;
return err; break;
case SIOCADDRT: case SIOCADDRT:
case SIOCDELRT: case SIOCDELRT:
case SIOCRTMSG: case SIOCRTMSG:
return(ip_rt_ioctl(cmd,(void *) arg)); err = ip_rt_ioctl(cmd, (void *)arg);
break;
case SIOCDARP: case SIOCDARP:
case SIOCGARP: case SIOCGARP:
case SIOCSARP: case SIOCSARP:
return(arp_ioctl(cmd,(void *) arg)); err = arp_ioctl(cmd, (void *)arg);
break;
case SIOCGIFADDR: case SIOCGIFADDR:
case SIOCSIFADDR: case SIOCSIFADDR:
case SIOCGIFBRDADDR: case SIOCGIFBRDADDR:
...@@ -898,83 +893,82 @@ static int inet_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg) ...@@ -898,83 +893,82 @@ static int inet_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
case SIOCSIFNETMASK: case SIOCSIFNETMASK:
case SIOCGIFDSTADDR: case SIOCGIFDSTADDR:
case SIOCSIFDSTADDR: case SIOCSIFDSTADDR:
case SIOCSIFPFLAGS: case SIOCSIFPFLAGS:
case SIOCGIFPFLAGS: case SIOCGIFPFLAGS:
case SIOCSIFFLAGS: case SIOCSIFFLAGS:
return(devinet_ioctl(cmd,(void *) arg)); err = devinet_ioctl(cmd, (void *)arg);
break;
case SIOCGIFBR: case SIOCGIFBR:
case SIOCSIFBR: case SIOCSIFBR:
#if defined(CONFIG_BRIDGE) || defined(CONFIG_BRIDGE_MODULE) #if defined(CONFIG_BRIDGE) || defined(CONFIG_BRIDGE_MODULE)
#ifdef CONFIG_KMOD #ifdef CONFIG_KMOD
if (br_ioctl_hook == NULL) if (!br_ioctl_hook)
request_module("bridge"); request_module("bridge");
#endif #endif
if (br_ioctl_hook != NULL) if (br_ioctl_hook)
return br_ioctl_hook(arg); err = br_ioctl_hook(arg);
else
#endif #endif
return -ENOPKG; err = -ENOPKG;
break;
case SIOCGIFVLAN: case SIOCGIFVLAN:
case SIOCSIFVLAN: case SIOCSIFVLAN:
#if defined(CONFIG_VLAN_8021Q) || defined(CONFIG_VLAN_8021Q_MODULE) #if defined(CONFIG_VLAN_8021Q) || defined(CONFIG_VLAN_8021Q_MODULE)
#ifdef CONFIG_KMOD #ifdef CONFIG_KMOD
if (vlan_ioctl_hook == NULL) if (!vlan_ioctl_hook)
request_module("8021q"); request_module("8021q");
#endif #endif
if (vlan_ioctl_hook != NULL) if (vlan_ioctl_hook)
return vlan_ioctl_hook(arg); err = vlan_ioctl_hook(arg);
else
#endif #endif
return -ENOPKG; err = -ENOPKG;
break;
case SIOCGIFDIVERT: case SIOCGIFDIVERT:
case SIOCSIFDIVERT: case SIOCSIFDIVERT:
#ifdef CONFIG_NET_DIVERT #ifdef CONFIG_NET_DIVERT
return divert_ioctl(cmd, (struct divert_cf *) arg); err = divert_ioctl(cmd, (struct divert_cf *)arg);
#else #else
return -ENOPKG; err = -ENOPKG;
#endif /* CONFIG_NET_DIVERT */ #endif /* CONFIG_NET_DIVERT */
break;
case SIOCADDDLCI: case SIOCADDDLCI:
case SIOCDELDLCI: case SIOCDELDLCI:
#ifdef CONFIG_DLCI #ifdef CONFIG_DLCI
lock_kernel(); lock_kernel();
err = dlci_ioctl(cmd, (void *) arg); err = dlci_ioctl(cmd, (void *)arg);
unlock_kernel(); unlock_kernel();
return err; break;
#endif #elif CONFIG_DLCI_MODULE
#ifdef CONFIG_DLCI_MODULE
#ifdef CONFIG_KMOD #ifdef CONFIG_KMOD
if (dlci_ioctl_hook == NULL) if (!dlci_ioctl_hook)
request_module("dlci"); request_module("dlci");
#endif #endif
if (dlci_ioctl_hook) { if (dlci_ioctl_hook) {
lock_kernel(); lock_kernel();
err = (*dlci_ioctl_hook)(cmd, (void *) arg); err = (*dlci_ioctl_hook)(cmd, (void *)arg);
unlock_kernel(); unlock_kernel();
return err; } else
}
#endif #endif
return -ENOPKG; err = -ENOPKG;
break;
default: default:
if ((cmd >= SIOCDEVPRIVATE) && if (cmd >= SIOCDEVPRIVATE &&
(cmd <= (SIOCDEVPRIVATE + 15))) cmd <= (SIOCDEVPRIVATE + 15))
return(dev_ioctl(cmd,(void *) arg)); err = dev_ioctl(cmd, (void *)arg);
else
#ifdef WIRELESS_EXT #ifdef WIRELESS_EXT
if((cmd >= SIOCIWFIRST) && (cmd <= SIOCIWLAST)) if (cmd >= SIOCIWFIRST && cmd <= SIOCIWLAST)
return(dev_ioctl(cmd,(void *) arg)); err = dev_ioctl(cmd, (void *)arg);
else
#endif /* WIRELESS_EXT */ #endif /* WIRELESS_EXT */
if (!sk->prot->ioctl ||
if (sk->prot->ioctl==NULL || (err=sk->prot->ioctl(sk, cmd, arg))==-ENOIOCTLCMD) (err = sk->prot->ioctl(sk, cmd, arg)) ==
return(dev_ioctl(cmd,(void *) arg)); -ENOIOCTLCMD)
return err; err = dev_ioctl(cmd, (void *)arg);
break;
} }
/*NOTREACHED*/ return err;
return(0);
} }
struct proto_ops inet_stream_ops = { struct proto_ops inet_stream_ops = {
...@@ -985,7 +979,7 @@ struct proto_ops inet_stream_ops = { ...@@ -985,7 +979,7 @@ struct proto_ops inet_stream_ops = {
connect: inet_stream_connect, connect: inet_stream_connect,
socketpair: sock_no_socketpair, socketpair: sock_no_socketpair,
accept: inet_accept, accept: inet_accept,
getname: inet_getname, getname: inet_getname,
poll: tcp_poll, poll: tcp_poll,
ioctl: inet_ioctl, ioctl: inet_ioctl,
listen: inet_listen, listen: inet_listen,
...@@ -1006,7 +1000,7 @@ struct proto_ops inet_dgram_ops = { ...@@ -1006,7 +1000,7 @@ struct proto_ops inet_dgram_ops = {
connect: inet_dgram_connect, connect: inet_dgram_connect,
socketpair: sock_no_socketpair, socketpair: sock_no_socketpair,
accept: sock_no_accept, accept: sock_no_accept,
getname: inet_getname, getname: inet_getname,
poll: datagram_poll, poll: datagram_poll,
ioctl: inet_ioctl, ioctl: inet_ioctl,
listen: sock_no_listen, listen: sock_no_listen,
...@@ -1067,8 +1061,7 @@ static struct inet_protosw inetsw_array[] = ...@@ -1067,8 +1061,7 @@ static struct inet_protosw inetsw_array[] =
#define INETSW_ARRAY_LEN (sizeof(inetsw_array) / sizeof(struct inet_protosw)) #define INETSW_ARRAY_LEN (sizeof(inetsw_array) / sizeof(struct inet_protosw))
void void inet_register_protosw(struct inet_protosw *p)
inet_register_protosw(struct inet_protosw *p)
{ {
struct list_head *lh; struct list_head *lh;
struct inet_protosw *answer; struct inet_protosw *answer;
...@@ -1115,8 +1108,7 @@ inet_register_protosw(struct inet_protosw *p) ...@@ -1115,8 +1108,7 @@ inet_register_protosw(struct inet_protosw *p)
goto out; goto out;
} }
void void inet_unregister_protosw(struct inet_protosw *p)
inet_unregister_protosw(struct inet_protosw *p)
{ {
if (INET_PROTOSW_PERMANENT & p->flags) { if (INET_PROTOSW_PERMANENT & p->flags) {
printk(KERN_ERR printk(KERN_ERR
...@@ -1133,7 +1125,7 @@ inet_unregister_protosw(struct inet_protosw *p) ...@@ -1133,7 +1125,7 @@ inet_unregister_protosw(struct inet_protosw *p)
/* /*
* Called by socket.c on kernel startup. * Called by socket.c on kernel startup.
*/ */
static int __init inet_init(void) static int __init inet_init(void)
{ {
struct sk_buff *dummy_skb; struct sk_buff *dummy_skb;
...@@ -1157,32 +1149,32 @@ static int __init inet_init(void) ...@@ -1157,32 +1149,32 @@ static int __init inet_init(void)
raw4_sk_cachep = kmem_cache_create("raw4_sock", raw4_sk_cachep = kmem_cache_create("raw4_sock",
sizeof(struct raw_sock), 0, sizeof(struct raw_sock), 0,
SLAB_HWCACHE_ALIGN, 0, 0); SLAB_HWCACHE_ALIGN, 0, 0);
if (!tcp_sk_cachep || !udp_sk_cachep || !raw4_sk_cachep) if (!tcp_sk_cachep || !udp_sk_cachep || !raw4_sk_cachep)
printk(KERN_CRIT printk(KERN_CRIT
"inet_init: Can't create protocol sock SLAB caches!\n"); "inet_init: Can't create protocol sock SLAB caches!\n");
/* /*
* Tell SOCKET that we are alive... * Tell SOCKET that we are alive...
*/ */
(void) sock_register(&inet_family_ops); (void)sock_register(&inet_family_ops);
/* /*
* Add all the protocols. * Add all the protocols.
*/ */
printk(KERN_INFO "IP Protocols: "); printk(KERN_INFO "IP Protocols: ");
for (p = inet_protocol_base; p != NULL;) { for (p = inet_protocol_base; p;) {
struct inet_protocol *tmp = (struct inet_protocol *) p->next; struct inet_protocol *tmp = (struct inet_protocol *)p->next;
inet_add_protocol(p); inet_add_protocol(p);
printk("%s%s",p->name,tmp?", ":"\n"); printk("%s%s", p->name, tmp ? ", " : "\n");
p = tmp; p = tmp;
} }
/* Register the socket-side information for inet_create. */ /* Register the socket-side information for inet_create. */
for(r = &inetsw[0]; r < &inetsw[SOCK_MAX]; ++r) for (r = &inetsw[0]; r < &inetsw[SOCK_MAX]; ++r)
INIT_LIST_HEAD(r); INIT_LIST_HEAD(r);
for(q = inetsw_array; q < &inetsw_array[INETSW_ARRAY_LEN]; ++q) for (q = inetsw_array; q < &inetsw_array[INETSW_ARRAY_LEN]; ++q)
inet_register_protosw(q); inet_register_protosw(q);
/* /*
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment