]> git.proxmox.com Git - mirror_ubuntu-zesty-kernel.git/blobdiff - net/ax25/af_ax25.c
[SK_BUFF]: Introduce skb_reset_transport_header(skb)
[mirror_ubuntu-zesty-kernel.git] / net / ax25 / af_ax25.c
index 000695c48583c07d2005fd9446a58671f8f8455f..14db01a4ff631ce255e7d6c5bcbea9fb0bef27c8 100644 (file)
@@ -263,9 +263,9 @@ static void ax25_destroy_timer(unsigned long data)
 {
        ax25_cb *ax25=(ax25_cb *)data;
        struct sock *sk;
-       
+
        sk=ax25->sk;
-       
+
        bh_lock_sock(sk);
        sock_hold(sk);
        ax25_destroy_socket(ax25);
@@ -369,57 +369,57 @@ static int ax25_ctl_ioctl(const unsigned int cmd, void __user *arg)
                ax25_disconnect(ax25, ENETRESET);
                break;
 
-       case AX25_WINDOW:
-               if (ax25->modulus == AX25_MODULUS) {
-                       if (ax25_ctl.arg < 1 || ax25_ctl.arg > 7)
-                               return -EINVAL;
-               } else {
-                       if (ax25_ctl.arg < 1 || ax25_ctl.arg > 63)
-                               return -EINVAL;
-               }
-               ax25->window = ax25_ctl.arg;
-               break;
-
-       case AX25_T1:
+       case AX25_WINDOW:
+               if (ax25->modulus == AX25_MODULUS) {
+                       if (ax25_ctl.arg < 1 || ax25_ctl.arg > 7)
+                               return -EINVAL;
+               } else {
+                       if (ax25_ctl.arg < 1 || ax25_ctl.arg > 63)
+                               return -EINVAL;
+               }
+               ax25->window = ax25_ctl.arg;
+               break;
+
+       case AX25_T1:
                if (ax25_ctl.arg < 1)
-                       return -EINVAL;
-               ax25->rtt = (ax25_ctl.arg * HZ) / 2;
-               ax25->t1  = ax25_ctl.arg * HZ;
-               break;
-
-       case AX25_T2:
-               if (ax25_ctl.arg < 1)
-                       return -EINVAL;
-               ax25->t2 = ax25_ctl.arg * HZ;
-               break;
-
-       case AX25_N2:
-               if (ax25_ctl.arg < 1 || ax25_ctl.arg > 31)
                        return -EINVAL;
-               ax25->n2count = 0;
-               ax25->n2 = ax25_ctl.arg;
-               break;
-
-       case AX25_T3:
-               if (ax25_ctl.arg < 0)
-                       return -EINVAL;
-               ax25->t3 = ax25_ctl.arg * HZ;
-               break;
-
-       case AX25_IDLE:
-               if (ax25_ctl.arg < 0)
-                       return -EINVAL;
-               ax25->idle = ax25_ctl.arg * 60 * HZ;
-               break;
-
-       case AX25_PACLEN:
-               if (ax25_ctl.arg < 16 || ax25_ctl.arg > 65535)
-                       return -EINVAL;
-               ax25->paclen = ax25_ctl.arg;
-               break;
-
-       default:
-               return -EINVAL;
+               ax25->rtt = (ax25_ctl.arg * HZ) / 2;
+               ax25->t1  = ax25_ctl.arg * HZ;
+               break;
+
+       case AX25_T2:
+               if (ax25_ctl.arg < 1)
+                       return -EINVAL;
+               ax25->t2 = ax25_ctl.arg * HZ;
+               break;
+
+       case AX25_N2:
+               if (ax25_ctl.arg < 1 || ax25_ctl.arg > 31)
+                       return -EINVAL;
+               ax25->n2count = 0;
+               ax25->n2 = ax25_ctl.arg;
+               break;
+
+       case AX25_T3:
+               if (ax25_ctl.arg < 0)
+                       return -EINVAL;
+               ax25->t3 = ax25_ctl.arg * HZ;
+               break;
+
+       case AX25_IDLE:
+               if (ax25_ctl.arg < 0)
+                       return -EINVAL;
+               ax25->idle = ax25_ctl.arg * 60 * HZ;
+               break;
+
+       case AX25_PACLEN:
+               if (ax25_ctl.arg < 16 || ax25_ctl.arg > 65535)
+                       return -EINVAL;
+               ax25->paclen = ax25_ctl.arg;
+               break;
+
+       default:
+               return -EINVAL;
          }
 
        return 0;
@@ -906,13 +906,13 @@ struct sock *ax25_make_new(struct sock *osk, struct ax25_dev *ax25_dev)
        ax25->source_addr = oax25->source_addr;
 
        if (oax25->digipeat != NULL) {
-               if ((ax25->digipeat = kmalloc(sizeof(ax25_digi), GFP_ATOMIC)) == NULL) {
+               ax25->digipeat = kmemdup(oax25->digipeat, sizeof(ax25_digi),
+                                        GFP_ATOMIC);
+               if (ax25->digipeat == NULL) {
                        sk_free(sk);
                        ax25_cb_put(ax25);
                        return NULL;
                }
-
-               memcpy(ax25->digipeat, oax25->digipeat, sizeof(ax25_digi));
        }
 
        sk->sk_protinfo = ax25;
@@ -1088,8 +1088,8 @@ out:
 /*
  *     FIXME: nonblock behaviour looks like it may have a bug.
  */
-static int ax25_connect(struct socket *sock, struct sockaddr *uaddr,
-       int addr_len, int flags)
+static int __must_check ax25_connect(struct socket *sock,
+       struct sockaddr *uaddr, int addr_len, int flags)
 {
        struct sock *sk = sock->sk;
        ax25_cb *ax25 = ax25_sk(sk), *ax25t;
@@ -1209,7 +1209,7 @@ static int ax25_connect(struct socket *sock, struct sockaddr *uaddr,
 
        if (sk->sk_type == SOCK_SEQPACKET &&
            (ax25t=ax25_find_cb(&ax25->source_addr, &fsa->fsa_ax25.sax25_call, digi,
-                        ax25->ax25_dev->dev))) {
+                        ax25->ax25_dev->dev))) {
                kfree(digi);
                err = -EADDRINUSE;              /* Already such a connection */
                ax25_cb_put(ax25t);
@@ -1456,7 +1456,7 @@ static int ax25_sendmsg(struct kiocb *iocb, struct socket *sock,
                err = -EMSGSIZE;
                goto out;
        }
-               
+
        if (usax != NULL) {
                if (usax->sax25_family != AF_AX25) {
                        err = -EINVAL;
@@ -1470,8 +1470,8 @@ static int ax25_sendmsg(struct kiocb *iocb, struct socket *sock,
                else if (addr_len != sizeof(struct full_sockaddr_ax25)) {
                        /* support for old structure may go away some time */
                        if ((addr_len < sizeof(struct sockaddr_ax25) + sizeof(ax25_address) * 6) ||
-                           (addr_len > sizeof(struct full_sockaddr_ax25))) {
-                               err = -EINVAL;
+                           (addr_len > sizeof(struct full_sockaddr_ax25))) {
+                               err = -EINVAL;
                                goto out;
                        }
 
@@ -1548,7 +1548,7 @@ static int ax25_sendmsg(struct kiocb *iocb, struct socket *sock,
                goto out;
        }
 
-       skb->nh.raw = skb->data;
+       skb_reset_network_header(skb);
 
        /* Add the PID if one is not supplied by the user in the skb */
        if (!ax25->pidincl) {
@@ -1624,15 +1624,15 @@ static int ax25_recvmsg(struct kiocb *iocb, struct socket *sock,
 
        /* Now we can treat all alike */
        skb = skb_recv_datagram(sk, flags & ~MSG_DONTWAIT,
-                               flags & MSG_DONTWAIT, &err);
+                               flags & MSG_DONTWAIT, &err);
        if (skb == NULL)
                goto out;
 
        if (!ax25_sk(sk)->pidincl)
                skb_pull(skb, 1);               /* Remove PID */
 
-       skb->h.raw = skb->data;
-       copied     = skb->len;
+       skb_reset_transport_header(skb);
+       copied = skb->len;
 
        if (copied > size) {
                copied = size;
@@ -1645,9 +1645,10 @@ static int ax25_recvmsg(struct kiocb *iocb, struct socket *sock,
                struct sockaddr_ax25 *sax = (struct sockaddr_ax25 *)msg->msg_name;
                ax25_digi digi;
                ax25_address src;
+               const unsigned char *mac = skb_mac_header(skb);
 
-               ax25_addr_parse(skb->mac.raw+1, skb->data-skb->mac.raw-1, &src, NULL, &digi, NULL, NULL);
-
+               ax25_addr_parse(mac + 1, skb->data - mac - 1, &src, NULL,
+                               &digi, NULL, NULL);
                sax->sax25_family = AF_AX25;
                /* We set this correctly, even though we may not let the
                   application know the digi calls further down (because it
@@ -1711,6 +1712,10 @@ static int ax25_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
                res = sock_get_timestamp(sk, argp);
                break;
 
+       case SIOCGSTAMPNS:
+               res = sock_get_timestampns(sk, argp);
+               break;
+
        case SIOCAX25ADDUID:    /* Add a uid to the uid/call map table */
        case SIOCAX25DELUID:    /* Delete a uid from the uid/call map table */
        case SIOCAX25GETUID: {
@@ -1869,7 +1874,7 @@ static void *ax25_info_next(struct seq_file *seq, void *v, loff_t *pos)
        return hlist_entry( ((struct ax25_cb *)v)->ax25_node.next,
                            struct ax25_cb, ax25_node);
 }
-       
+
 static void ax25_info_stop(struct seq_file *seq, void *v)
 {
        spin_unlock_bh(&ax25_list_lock);
@@ -1938,7 +1943,7 @@ static int ax25_info_open(struct inode *inode, struct file *file)
        return seq_open(file, &ax25_info_seqops);
 }
 
-static struct file_operations ax25_info_fops = {
+static const struct file_operations ax25_info_fops = {
        .owner = THIS_MODULE,
        .open = ax25_info_open,
        .read = seq_read,