NFC: Add tx skb allocation routine
Samuel Ortiz [Wed, 14 Dec 2011 15:43:06 +0000 (16:43 +0100)]
This is a factorization of the current rawsock tx skb allocation routine,
as it will be used by the LLCP code.
We also rename nfc_alloc_skb to nfc_alloc_recv_skb for consistency sake.

Signed-off-by: Samuel Ortiz <sameo@linux.intel.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>

drivers/nfc/pn533.c
include/net/nfc/nfc.h
net/nfc/core.c
net/nfc/rawsock.c

index dbf214e..ea1caae 100644 (file)
@@ -1368,7 +1368,7 @@ static int pn533_data_exchange(struct nfc_dev *nfc_dev, u32 target_idx,
                        PN533_CMD_DATAEXCH_DATA_MAXLEN +
                        PN533_FRAME_TAIL_SIZE;
 
-       skb_resp = nfc_alloc_skb(skb_resp_len, GFP_KERNEL);
+       skb_resp = nfc_alloc_recv_skb(skb_resp_len, GFP_KERNEL);
        if (!skb_resp) {
                rc = -ENOMEM;
                goto error;
index 6a7f602..3a3304c 100644 (file)
@@ -157,7 +157,10 @@ static inline const char *nfc_device_name(struct nfc_dev *dev)
        return dev_name(&dev->dev);
 }
 
-struct sk_buff *nfc_alloc_skb(unsigned int size, gfp_t gfp);
+struct sk_buff *nfc_alloc_send_skb(struct nfc_dev *dev, struct sock *sk,
+                                       unsigned int flags, unsigned int size,
+                                       unsigned int *err);
+struct sk_buff *nfc_alloc_recv_skb(unsigned int size, gfp_t gfp);
 
 int nfc_targets_found(struct nfc_dev *dev, struct nfc_target *targets,
                                                        int ntargets);
index 2a838b0..f53f88a 100644 (file)
@@ -27,6 +27,7 @@
 #include <linux/kernel.h>
 #include <linux/module.h>
 #include <linux/slab.h>
+#include <linux/nfc.h>
 
 #include "nfc.h"
 
@@ -275,12 +276,35 @@ error:
 }
 
 /**
- * nfc_alloc_skb - allocate a skb for data exchange responses
+ * nfc_alloc_send_skb - allocate a skb for data exchange responses
  *
  * @size: size to allocate
  * @gfp: gfp flags
  */
-struct sk_buff *nfc_alloc_skb(unsigned int size, gfp_t gfp)
+struct sk_buff *nfc_alloc_send_skb(struct nfc_dev *dev, struct sock *sk,
+                                       unsigned int flags, unsigned int size,
+                                       unsigned int *err)
+{
+       struct sk_buff *skb;
+       unsigned int total_size;
+
+       total_size = size +
+               dev->tx_headroom + dev->tx_tailroom + NFC_HEADER_SIZE;
+
+       skb = sock_alloc_send_skb(sk, total_size, flags & MSG_DONTWAIT, err);
+       if (skb)
+               skb_reserve(skb, dev->tx_headroom + NFC_HEADER_SIZE);
+
+       return skb;
+}
+
+/**
+ * nfc_alloc_recv_skb - allocate a skb for data exchange responses
+ *
+ * @size: size to allocate
+ * @gfp: gfp flags
+ */
+struct sk_buff *nfc_alloc_recv_skb(unsigned int size, gfp_t gfp)
 {
        struct sk_buff *skb;
        unsigned int total_size;
@@ -293,7 +317,7 @@ struct sk_buff *nfc_alloc_skb(unsigned int size, gfp_t gfp)
 
        return skb;
 }
-EXPORT_SYMBOL(nfc_alloc_skb);
+EXPORT_SYMBOL(nfc_alloc_recv_skb);
 
 /**
  * nfc_targets_found - inform that targets were found
index 5e9b991..11ac0a1 100644 (file)
@@ -208,13 +208,10 @@ static int rawsock_sendmsg(struct kiocb *iocb, struct socket *sock,
        if (sock->state != SS_CONNECTED)
                return -ENOTCONN;
 
-       skb = sock_alloc_send_skb(sk, len + dev->tx_headroom + dev->tx_tailroom + NFC_HEADER_SIZE,
-                                       msg->msg_flags & MSG_DONTWAIT, &rc);
-       if (!skb)
+       skb = nfc_alloc_send_skb(dev, sk, msg->msg_flags, len, &rc);
+       if (skb == NULL)
                return rc;
 
-       skb_reserve(skb, dev->tx_headroom + NFC_HEADER_SIZE);
-
        rc = memcpy_fromiovec(skb_put(skb, len), msg->msg_iov, len);
        if (rc < 0) {
                kfree_skb(skb);