mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 02:30:34 +02:00 
			
		
		
		
	Bluetooth: ISO: Add support for BT_PKT_STATUS
This adds support for BT_PKT_STATUS socketopt by setting BT_SK_PKT_STATUS. Then upon receiving an ISO packet the code would attempt to store the Packet_Status_Flag to hci_skb_pkt_status which is then forward to userspace in the form of BT_SCM_PKT_STATUS whenever BT_PKT_STATUS has been enabled/set. Signed-off-by: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
This commit is contained in:
		
							parent
							
								
									3f19ffb2f9
								
							
						
					
					
						commit
						0731c5ab4d
					
				
					 1 changed files with 20 additions and 0 deletions
				
			
		| 
						 | 
				
			
			@ -1288,6 +1288,18 @@ static int iso_sock_setsockopt(struct socket *sock, int level, int optname,
 | 
			
		|||
			clear_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags);
 | 
			
		||||
		break;
 | 
			
		||||
 | 
			
		||||
	case BT_PKT_STATUS:
 | 
			
		||||
		if (copy_from_sockptr(&opt, optval, sizeof(u32))) {
 | 
			
		||||
			err = -EFAULT;
 | 
			
		||||
			break;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if (opt)
 | 
			
		||||
			set_bit(BT_SK_PKT_STATUS, &bt_sk(sk)->flags);
 | 
			
		||||
		else
 | 
			
		||||
			clear_bit(BT_SK_PKT_STATUS, &bt_sk(sk)->flags);
 | 
			
		||||
		break;
 | 
			
		||||
 | 
			
		||||
	case BT_ISO_QOS:
 | 
			
		||||
		if (sk->sk_state != BT_OPEN && sk->sk_state != BT_BOUND &&
 | 
			
		||||
		    sk->sk_state != BT_CONNECT2) {
 | 
			
		||||
| 
						 | 
				
			
			@ -1373,6 +1385,12 @@ static int iso_sock_getsockopt(struct socket *sock, int level, int optname,
 | 
			
		|||
 | 
			
		||||
		break;
 | 
			
		||||
 | 
			
		||||
	case BT_PKT_STATUS:
 | 
			
		||||
		if (put_user(test_bit(BT_SK_PKT_STATUS, &bt_sk(sk)->flags),
 | 
			
		||||
			     (int __user *)optval))
 | 
			
		||||
			err = -EFAULT;
 | 
			
		||||
		break;
 | 
			
		||||
 | 
			
		||||
	case BT_ISO_QOS:
 | 
			
		||||
		qos = iso_sock_get_qos(sk);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1767,6 +1785,7 @@ void iso_recv(struct hci_conn *hcon, struct sk_buff *skb, u16 flags)
 | 
			
		|||
 | 
			
		||||
		if (len == skb->len) {
 | 
			
		||||
			/* Complete frame received */
 | 
			
		||||
			hci_skb_pkt_status(skb) = flags & 0x03;
 | 
			
		||||
			iso_recv_frame(conn, skb);
 | 
			
		||||
			return;
 | 
			
		||||
		}
 | 
			
		||||
| 
						 | 
				
			
			@ -1788,6 +1807,7 @@ void iso_recv(struct hci_conn *hcon, struct sk_buff *skb, u16 flags)
 | 
			
		|||
		if (!conn->rx_skb)
 | 
			
		||||
			goto drop;
 | 
			
		||||
 | 
			
		||||
		hci_skb_pkt_status(conn->rx_skb) = flags & 0x03;
 | 
			
		||||
		skb_copy_from_linear_data(skb, skb_put(conn->rx_skb, skb->len),
 | 
			
		||||
					  skb->len);
 | 
			
		||||
		conn->rx_len = len - skb->len;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue