diff options
Diffstat (limited to 'net/nfc/llcp_core.c')
| -rw-r--r-- | net/nfc/llcp_core.c | 36 | 
1 files changed, 17 insertions, 19 deletions
diff --git a/net/nfc/llcp_core.c b/net/nfc/llcp_core.c index 81cd3416c7d..51e78879731 100644 --- a/net/nfc/llcp_core.c +++ b/net/nfc/llcp_core.c @@ -12,9 +12,7 @@   * GNU General Public License for more details.   *   * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the - * Free Software Foundation, Inc., - * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * along with this program; if not, see <http://www.gnu.org/licenses/>.   */  #define pr_fmt(fmt) "llcp: %s: " fmt, __func__ @@ -29,7 +27,7 @@  static u8 llcp_magic[3] = {0x46, 0x66, 0x6d}; -static struct list_head llcp_devices; +static LIST_HEAD(llcp_devices);  static void nfc_llcp_rx_skb(struct nfc_llcp_local *local, struct sk_buff *skb); @@ -295,9 +293,9 @@ static void nfc_llcp_sdreq_timer(unsigned long data)  struct nfc_llcp_local *nfc_llcp_find_local(struct nfc_dev *dev)  { -	struct nfc_llcp_local *local, *n; +	struct nfc_llcp_local *local; -	list_for_each_entry_safe(local, n, &llcp_devices, list) +	list_for_each_entry(local, &llcp_devices, list)  		if (local->dev == dev)  			return local; @@ -611,14 +609,16 @@ u8 *nfc_llcp_general_bytes(struct nfc_dev *dev, size_t *general_bytes_len)  int nfc_llcp_set_remote_gb(struct nfc_dev *dev, u8 *gb, u8 gb_len)  { -	struct nfc_llcp_local *local = nfc_llcp_find_local(dev); +	struct nfc_llcp_local *local; + +	if (gb_len < 3 || gb_len > NFC_MAX_GT_LEN) +		return -EINVAL; +	local = nfc_llcp_find_local(dev);  	if (local == NULL) {  		pr_err("No LLCP device\n");  		return -ENODEV;  	} -	if (gb_len < 3) -		return -EINVAL;  	memset(local->remote_gb, 0, NFC_MAX_GT_LEN);  	memcpy(local->remote_gb, gb, gb_len); @@ -680,16 +680,17 @@ void nfc_llcp_send_to_raw_sock(struct nfc_llcp_local *local,  			continue;  		if (skb_copy == NULL) { -			skb_copy = __pskb_copy(skb, NFC_LLCP_RAW_HEADER_SIZE, -					       GFP_ATOMIC); +			skb_copy = __pskb_copy_fclone(skb, NFC_RAW_HEADER_SIZE, +						      GFP_ATOMIC, true);  			if (skb_copy == NULL)  				continue; -			data = skb_push(skb_copy, NFC_LLCP_RAW_HEADER_SIZE); +			data = skb_push(skb_copy, NFC_RAW_HEADER_SIZE);  			data[0] = local->dev ? local->dev->idx : 0xFF; -			data[1] = direction; +			data[1] = direction & 0x01; +			data[1] |= (RAW_PAYLOAD_LLCP << 1);  		}  		nskb = skb_clone(skb_copy, GFP_ATOMIC); @@ -747,7 +748,7 @@ static void nfc_llcp_tx_work(struct work_struct *work)  			__net_timestamp(skb);  			nfc_llcp_send_to_raw_sock(local, skb, -						  NFC_LLCP_DIRECTION_TX); +						  NFC_DIRECTION_TX);  			ret = nfc_data_exchange(local->dev, local->target_idx,  						skb, nfc_llcp_recv, local); @@ -945,7 +946,6 @@ static void nfc_llcp_recv_connect(struct nfc_llcp_local *local,  	new_sock->local = nfc_llcp_local_get(local);  	new_sock->rw = sock->rw;  	new_sock->miux = sock->miux; -	new_sock->remote_miu = local->remote_miu;  	new_sock->nfc_protocol = sock->nfc_protocol;  	new_sock->dsap = ssap;  	new_sock->target_idx = local->target_idx; @@ -977,7 +977,7 @@ static void nfc_llcp_recv_connect(struct nfc_llcp_local *local,  	new_sk->sk_state = LLCP_CONNECTED;  	/* Wake the listening processes */ -	parent->sk_data_ready(parent, 0); +	parent->sk_data_ready(parent);  	/* Send CC */  	nfc_llcp_send_cc(new_sock); @@ -1477,7 +1477,7 @@ static void nfc_llcp_rx_work(struct work_struct *work)  	__net_timestamp(skb); -	nfc_llcp_send_to_raw_sock(local, skb, NFC_LLCP_DIRECTION_RX); +	nfc_llcp_send_to_raw_sock(local, skb, NFC_DIRECTION_RX);  	nfc_llcp_rx_skb(local, skb); @@ -1625,8 +1625,6 @@ void nfc_llcp_unregister_device(struct nfc_dev *dev)  int __init nfc_llcp_init(void)  { -	INIT_LIST_HEAD(&llcp_devices); -  	return nfc_llcp_sock_init();  }  | 
