mirror of
				https://gitlab.freedesktop.org/pipewire/pipewire.git
				synced 2025-11-03 09:01:54 -05:00 
			
		
		
		
	bluez5: retry sco connect if it got aborted by ECONNABORTED
When I enforing HFP codec switching between HFP profiles, it has a chance of being aborted by ECONNABORTED. Seems a retry is sufficient for work around it.
This commit is contained in:
		
							parent
							
								
									53024c1747
								
							
						
					
					
						commit
						d439b7cdd7
					
				
					 1 changed files with 8 additions and 1 deletions
				
			
		| 
						 | 
					@ -699,6 +699,7 @@ static int sco_do_connect(struct spa_bt_transport *t)
 | 
				
			||||||
	int sock;
 | 
						int sock;
 | 
				
			||||||
	bdaddr_t src;
 | 
						bdaddr_t src;
 | 
				
			||||||
	bdaddr_t dst;
 | 
						bdaddr_t dst;
 | 
				
			||||||
 | 
						int retry = 2;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	spa_log_debug(backend->log, NAME": transport %p: enter sco_do_connect", t);
 | 
						spa_log_debug(backend->log, NAME": transport %p: enter sco_do_connect", t);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -708,6 +709,7 @@ static int sco_do_connect(struct spa_bt_transport *t)
 | 
				
			||||||
	str2ba(d->adapter->address, &src);
 | 
						str2ba(d->adapter->address, &src);
 | 
				
			||||||
	str2ba(d->address, &dst);
 | 
						str2ba(d->address, &dst);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					again:
 | 
				
			||||||
	sock = socket(PF_BLUETOOTH, SOCK_SEQPACKET, BTPROTO_SCO);
 | 
						sock = socket(PF_BLUETOOTH, SOCK_SEQPACKET, BTPROTO_SCO);
 | 
				
			||||||
	if (sock < 0) {
 | 
						if (sock < 0) {
 | 
				
			||||||
		spa_log_error(backend->log, NAME": socket(SEQPACKET, SCO) %s", strerror(errno));
 | 
							spa_log_error(backend->log, NAME": socket(SEQPACKET, SCO) %s", strerror(errno));
 | 
				
			||||||
| 
						 | 
					@ -742,7 +744,12 @@ static int sco_do_connect(struct spa_bt_transport *t)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	spa_log_debug(backend->log, NAME": transport %p: doing connect", t);
 | 
						spa_log_debug(backend->log, NAME": transport %p: doing connect", t);
 | 
				
			||||||
	err = connect(sock, (struct sockaddr *) &addr, len);
 | 
						err = connect(sock, (struct sockaddr *) &addr, len);
 | 
				
			||||||
	if (err < 0 && !(errno == EAGAIN || errno == EINPROGRESS)) {
 | 
						if (err < 0 && errno == ECONNABORTED && retry-- > 0) {
 | 
				
			||||||
 | 
							spa_log_warn(backend->log, NAME": connect(): %s. Remaining retry:%d",
 | 
				
			||||||
 | 
									strerror(errno), retry);
 | 
				
			||||||
 | 
							close(sock);
 | 
				
			||||||
 | 
							goto again;
 | 
				
			||||||
 | 
						} else if (err < 0 && !(errno == EAGAIN || errno == EINPROGRESS)) {
 | 
				
			||||||
		spa_log_error(backend->log, NAME": connect(): %s", strerror(errno));
 | 
							spa_log_error(backend->log, NAME": connect(): %s", strerror(errno));
 | 
				
			||||||
		goto fail_close;
 | 
							goto fail_close;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue