X25: Enable setting of cause and diagnostic fields
Andrew Hendry [Thu, 19 Nov 2009 07:30:41 +0000 (23:30 -0800)]
Adds SIOCX25SCAUSEDIAG, allowing X.25 programs to set the cause and
diagnostic fields.

Normally used to indicate status upon closing connections.

Signed-off-by: Andrew Hendry <andrew.hendry@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>

include/linux/x25.h
net/x25/af_x25.c
net/x25/x25_subr.c

index d035e4e..6450a7f 100644 (file)
@@ -25,6 +25,7 @@
 #define SIOCX25SENDCALLACCPT    (SIOCPROTOPRIVATE + 9)
 #define SIOCX25GDTEFACILITIES (SIOCPROTOPRIVATE + 10)
 #define SIOCX25SDTEFACILITIES (SIOCPROTOPRIVATE + 11)
+#define SIOCX25SCAUSEDIAG      (SIOCPROTOPRIVATE + 12)
 
 /*
  *     Values for {get,set}sockopt.
index 39ce03e..ac7dba4 100644 (file)
@@ -1471,6 +1471,17 @@ static int x25_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
                        break;
                }
 
+               case SIOCX25SCAUSEDIAG: {
+                       struct x25_causediag causediag;
+                       rc = -EFAULT;
+                       if (copy_from_user(&causediag, argp, sizeof(causediag)))
+                               break;
+                       x25->causediag = causediag;
+                       rc = 0;
+                       break;
+
+               }
+
                case SIOCX25SCUDMATCHLEN: {
                        struct x25_subaddr sub_addr;
                        rc = -EINVAL;
@@ -1639,6 +1650,7 @@ static int compat_x25_ioctl(struct socket *sock, unsigned int cmd,
        case SIOCX25GCALLUSERDATA:
        case SIOCX25SCALLUSERDATA:
        case SIOCX25GCAUSEDIAG:
+       case SIOCX25SCAUSEDIAG:
        case SIOCX25SCUDMATCHLEN:
        case SIOCX25CALLACCPTAPPRV:
        case SIOCX25SENDCALLACCPT:
index 511a598..352b32d 100644 (file)
@@ -225,6 +225,12 @@ void x25_write_internal(struct sock *sk, int frametype)
                        break;
 
                case X25_CLEAR_REQUEST:
+                       dptr    = skb_put(skb, 3);
+                       *dptr++ = frametype;
+                       *dptr++ = x25->causediag.cause;
+                       *dptr++ = x25->causediag.diagnostic;
+                       break;
+
                case X25_RESET_REQUEST:
                        dptr    = skb_put(skb, 3);
                        *dptr++ = frametype;