|
@@ -3,7 +3,7 @@
|
|
*
|
|
*
|
|
* This is ALPHA test software. This code may break your machine,
|
|
* This is ALPHA test software. This code may break your machine,
|
|
* randomly fail to work with new releases, misbehave and/or generally
|
|
* randomly fail to work with new releases, misbehave and/or generally
|
|
- * screw up. It might even work.
|
|
|
|
|
|
+ * screw up. It might even work.
|
|
*
|
|
*
|
|
* This code REQUIRES 2.1.15 or higher
|
|
* This code REQUIRES 2.1.15 or higher
|
|
*
|
|
*
|
|
@@ -18,11 +18,11 @@
|
|
* X.25 002 Jonathan Naylor Centralised disconnect handling.
|
|
* X.25 002 Jonathan Naylor Centralised disconnect handling.
|
|
* New timer architecture.
|
|
* New timer architecture.
|
|
* 2000-03-11 Henner Eisen MSG_EOR handling more POSIX compliant.
|
|
* 2000-03-11 Henner Eisen MSG_EOR handling more POSIX compliant.
|
|
- * 2000-03-22 Daniela Squassoni Allowed disabling/enabling of
|
|
|
|
- * facilities negotiation and increased
|
|
|
|
|
|
+ * 2000-03-22 Daniela Squassoni Allowed disabling/enabling of
|
|
|
|
+ * facilities negotiation and increased
|
|
* the throughput upper limit.
|
|
* the throughput upper limit.
|
|
* 2000-08-27 Arnaldo C. Melo s/suser/capable/ + micro cleanups
|
|
* 2000-08-27 Arnaldo C. Melo s/suser/capable/ + micro cleanups
|
|
- * 2000-09-04 Henner Eisen Set sock->state in x25_accept().
|
|
|
|
|
|
+ * 2000-09-04 Henner Eisen Set sock->state in x25_accept().
|
|
* Fixed x25_output() related skb leakage.
|
|
* Fixed x25_output() related skb leakage.
|
|
* 2000-10-02 Henner Eisen Made x25_kick() single threaded per socket.
|
|
* 2000-10-02 Henner Eisen Made x25_kick() single threaded per socket.
|
|
* 2000-10-27 Henner Eisen MSG_DONTWAIT for fragment allocation.
|
|
* 2000-10-27 Henner Eisen MSG_DONTWAIT for fragment allocation.
|
|
@@ -256,8 +256,8 @@ static struct sock *x25_find_listener(struct x25_address *addr,
|
|
* call user data vs this sockets call user data
|
|
* call user data vs this sockets call user data
|
|
*/
|
|
*/
|
|
if(skb->len > 0 && x25_sk(s)->cudmatchlength > 0) {
|
|
if(skb->len > 0 && x25_sk(s)->cudmatchlength > 0) {
|
|
- if((memcmp(x25_sk(s)->calluserdata.cuddata,
|
|
|
|
- skb->data,
|
|
|
|
|
|
+ if((memcmp(x25_sk(s)->calluserdata.cuddata,
|
|
|
|
+ skb->data,
|
|
x25_sk(s)->cudmatchlength)) == 0) {
|
|
x25_sk(s)->cudmatchlength)) == 0) {
|
|
sock_hold(s);
|
|
sock_hold(s);
|
|
goto found;
|
|
goto found;
|
|
@@ -421,7 +421,7 @@ static int x25_getsockopt(struct socket *sock, int level, int optname,
|
|
{
|
|
{
|
|
struct sock *sk = sock->sk;
|
|
struct sock *sk = sock->sk;
|
|
int val, len, rc = -ENOPROTOOPT;
|
|
int val, len, rc = -ENOPROTOOPT;
|
|
-
|
|
|
|
|
|
+
|
|
if (level != SOL_X25 || optname != X25_QBITINCL)
|
|
if (level != SOL_X25 || optname != X25_QBITINCL)
|
|
goto out;
|
|
goto out;
|
|
|
|
|
|
@@ -434,7 +434,7 @@ static int x25_getsockopt(struct socket *sock, int level, int optname,
|
|
rc = -EINVAL;
|
|
rc = -EINVAL;
|
|
if (len < 0)
|
|
if (len < 0)
|
|
goto out;
|
|
goto out;
|
|
-
|
|
|
|
|
|
+
|
|
rc = -EFAULT;
|
|
rc = -EFAULT;
|
|
if (put_user(len, optlen))
|
|
if (put_user(len, optlen))
|
|
goto out;
|
|
goto out;
|
|
@@ -523,12 +523,12 @@ static int x25_create(struct socket *sock, int protocol)
|
|
x25->facilities.pacsize_out = X25_DEFAULT_PACKET_SIZE;
|
|
x25->facilities.pacsize_out = X25_DEFAULT_PACKET_SIZE;
|
|
x25->facilities.throughput = X25_DEFAULT_THROUGHPUT;
|
|
x25->facilities.throughput = X25_DEFAULT_THROUGHPUT;
|
|
x25->facilities.reverse = X25_DEFAULT_REVERSE;
|
|
x25->facilities.reverse = X25_DEFAULT_REVERSE;
|
|
- x25->dte_facilities.calling_len = 0;
|
|
|
|
- x25->dte_facilities.called_len = 0;
|
|
|
|
- memset(x25->dte_facilities.called_ae, '\0',
|
|
|
|
- sizeof(x25->dte_facilities.called_ae));
|
|
|
|
- memset(x25->dte_facilities.calling_ae, '\0',
|
|
|
|
- sizeof(x25->dte_facilities.calling_ae));
|
|
|
|
|
|
+ x25->dte_facilities.calling_len = 0;
|
|
|
|
+ x25->dte_facilities.called_len = 0;
|
|
|
|
+ memset(x25->dte_facilities.called_ae, '\0',
|
|
|
|
+ sizeof(x25->dte_facilities.called_ae));
|
|
|
|
+ memset(x25->dte_facilities.calling_ae, '\0',
|
|
|
|
+ sizeof(x25->dte_facilities.calling_ae));
|
|
|
|
|
|
rc = 0;
|
|
rc = 0;
|
|
out:
|
|
out:
|
|
@@ -608,7 +608,7 @@ static int x25_release(struct socket *sock)
|
|
break;
|
|
break;
|
|
}
|
|
}
|
|
|
|
|
|
- sock->sk = NULL;
|
|
|
|
|
|
+ sock->sk = NULL;
|
|
sk->sk_socket = NULL; /* Not used, but we should do this */
|
|
sk->sk_socket = NULL; /* Not used, but we should do this */
|
|
out:
|
|
out:
|
|
return 0;
|
|
return 0;
|
|
@@ -635,7 +635,7 @@ static int x25_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len)
|
|
static int x25_wait_for_connection_establishment(struct sock *sk)
|
|
static int x25_wait_for_connection_establishment(struct sock *sk)
|
|
{
|
|
{
|
|
DECLARE_WAITQUEUE(wait, current);
|
|
DECLARE_WAITQUEUE(wait, current);
|
|
- int rc;
|
|
|
|
|
|
+ int rc;
|
|
|
|
|
|
add_wait_queue_exclusive(sk->sk_sleep, &wait);
|
|
add_wait_queue_exclusive(sk->sk_sleep, &wait);
|
|
for (;;) {
|
|
for (;;) {
|
|
@@ -686,7 +686,7 @@ static int x25_connect(struct socket *sock, struct sockaddr *uaddr,
|
|
if (sk->sk_state == TCP_ESTABLISHED)
|
|
if (sk->sk_state == TCP_ESTABLISHED)
|
|
goto out;
|
|
goto out;
|
|
|
|
|
|
- sk->sk_state = TCP_CLOSE;
|
|
|
|
|
|
+ sk->sk_state = TCP_CLOSE;
|
|
sock->state = SS_UNCONNECTED;
|
|
sock->state = SS_UNCONNECTED;
|
|
|
|
|
|
rc = -EINVAL;
|
|
rc = -EINVAL;
|
|
@@ -778,7 +778,7 @@ static int x25_wait_for_data(struct sock *sk, long timeout)
|
|
remove_wait_queue(sk->sk_sleep, &wait);
|
|
remove_wait_queue(sk->sk_sleep, &wait);
|
|
return rc;
|
|
return rc;
|
|
}
|
|
}
|
|
-
|
|
|
|
|
|
+
|
|
static int x25_accept(struct socket *sock, struct socket *newsock, int flags)
|
|
static int x25_accept(struct socket *sock, struct socket *newsock, int flags)
|
|
{
|
|
{
|
|
struct sock *sk = sock->sk;
|
|
struct sock *sk = sock->sk;
|
|
@@ -837,7 +837,7 @@ static int x25_getname(struct socket *sock, struct sockaddr *uaddr,
|
|
|
|
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|
|
-
|
|
|
|
|
|
+
|
|
int x25_rx_call_request(struct sk_buff *skb, struct x25_neigh *nb,
|
|
int x25_rx_call_request(struct sk_buff *skb, struct x25_neigh *nb,
|
|
unsigned int lci)
|
|
unsigned int lci)
|
|
{
|
|
{
|
|
@@ -1120,7 +1120,7 @@ static int x25_sendmsg(struct kiocb *iocb, struct socket *sock,
|
|
if (msg->msg_flags & MSG_OOB)
|
|
if (msg->msg_flags & MSG_OOB)
|
|
skb_queue_tail(&x25->interrupt_out_queue, skb);
|
|
skb_queue_tail(&x25->interrupt_out_queue, skb);
|
|
else {
|
|
else {
|
|
- len = x25_output(sk, skb);
|
|
|
|
|
|
+ len = x25_output(sk, skb);
|
|
if (len < 0)
|
|
if (len < 0)
|
|
kfree_skb(skb);
|
|
kfree_skb(skb);
|
|
else if (x25->qbitincl)
|
|
else if (x25->qbitincl)
|
|
@@ -1219,7 +1219,7 @@ static int x25_recvmsg(struct kiocb *iocb, struct socket *sock,
|
|
msg->msg_flags |= MSG_TRUNC;
|
|
msg->msg_flags |= MSG_TRUNC;
|
|
}
|
|
}
|
|
|
|
|
|
- /* Currently, each datagram always contains a complete record */
|
|
|
|
|
|
+ /* Currently, each datagram always contains a complete record */
|
|
msg->msg_flags |= MSG_EOR;
|
|
msg->msg_flags |= MSG_EOR;
|
|
|
|
|
|
rc = skb_copy_datagram_iovec(skb, 0, msg->msg_iov, copied);
|
|
rc = skb_copy_datagram_iovec(skb, 0, msg->msg_iov, copied);
|
|
@@ -1277,8 +1277,8 @@ static int x25_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
|
|
case SIOCGSTAMP:
|
|
case SIOCGSTAMP:
|
|
rc = -EINVAL;
|
|
rc = -EINVAL;
|
|
if (sk)
|
|
if (sk)
|
|
- rc = sock_get_timestamp(sk,
|
|
|
|
- (struct timeval __user *)argp);
|
|
|
|
|
|
+ rc = sock_get_timestamp(sk,
|
|
|
|
+ (struct timeval __user *)argp);
|
|
break;
|
|
break;
|
|
case SIOCGIFADDR:
|
|
case SIOCGIFADDR:
|
|
case SIOCSIFADDR:
|
|
case SIOCSIFADDR:
|
|
@@ -1346,17 +1346,17 @@ static int x25_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
|
|
}
|
|
}
|
|
|
|
|
|
case SIOCX25GDTEFACILITIES: {
|
|
case SIOCX25GDTEFACILITIES: {
|
|
- rc = copy_to_user(argp, &x25->dte_facilities,
|
|
|
|
|
|
+ rc = copy_to_user(argp, &x25->dte_facilities,
|
|
sizeof(x25->dte_facilities));
|
|
sizeof(x25->dte_facilities));
|
|
if (rc)
|
|
if (rc)
|
|
rc = -EFAULT;
|
|
rc = -EFAULT;
|
|
- break;
|
|
|
|
- }
|
|
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
|
|
- case SIOCX25SDTEFACILITIES: {
|
|
|
|
- struct x25_dte_facilities dtefacs;
|
|
|
|
- rc = -EFAULT;
|
|
|
|
- if (copy_from_user(&dtefacs, argp, sizeof(dtefacs)))
|
|
|
|
|
|
+ case SIOCX25SDTEFACILITIES: {
|
|
|
|
+ struct x25_dte_facilities dtefacs;
|
|
|
|
+ rc = -EFAULT;
|
|
|
|
+ if (copy_from_user(&dtefacs, argp, sizeof(dtefacs)))
|
|
break;
|
|
break;
|
|
rc = -EINVAL;
|
|
rc = -EINVAL;
|
|
if (sk->sk_state != TCP_LISTEN &&
|
|
if (sk->sk_state != TCP_LISTEN &&
|
|
@@ -1414,7 +1414,7 @@ static int x25_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
|
|
if (copy_from_user(&sub_addr, argp,
|
|
if (copy_from_user(&sub_addr, argp,
|
|
sizeof(sub_addr)))
|
|
sizeof(sub_addr)))
|
|
break;
|
|
break;
|
|
- rc = -EINVAL;
|
|
|
|
|
|
+ rc = -EINVAL;
|
|
if(sub_addr.cudmatchlength > X25_MAX_CUD_LEN)
|
|
if(sub_addr.cudmatchlength > X25_MAX_CUD_LEN)
|
|
break;
|
|
break;
|
|
x25->cudmatchlength = sub_addr.cudmatchlength;
|
|
x25->cudmatchlength = sub_addr.cudmatchlength;
|
|
@@ -1443,7 +1443,7 @@ static int x25_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
|
|
break;
|
|
break;
|
|
}
|
|
}
|
|
|
|
|
|
- default:
|
|
|
|
|
|
+ default:
|
|
rc = -ENOIOCTLCMD;
|
|
rc = -ENOIOCTLCMD;
|
|
break;
|
|
break;
|
|
}
|
|
}
|