mirror of
				https://gitlab.freedesktop.org/pipewire/pipewire.git
				synced 2025-11-03 09:01:54 -05:00 
			
		
		
		
	module-rtp-sap/sink: try to bind sockets to an explicit interface
This commit is contained in:
		
							parent
							
								
									963ea1f57c
								
							
						
					
					
						commit
						5617fa0501
					
				
					 2 changed files with 16 additions and 3 deletions
				
			
		| 
						 | 
					@ -757,6 +757,11 @@ static int session_load_source(struct session *session, struct pw_properties *pr
 | 
				
			||||||
	if ((str = pw_properties_get(props, "rtp.session")) != NULL)
 | 
						if ((str = pw_properties_get(props, "rtp.session")) != NULL)
 | 
				
			||||||
		fprintf(f, "\"sess.name\" = \"%s\", ", str);
 | 
							fprintf(f, "\"sess.name\" = \"%s\", ", str);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* Use an interface if explicitly specified, else use the SAP interface if that was specified */
 | 
				
			||||||
 | 
						if ((str = pw_properties_get(props, "local.ifname")) != NULL || (str = impl->ifname) != NULL) {
 | 
				
			||||||
 | 
							fprintf(f, "\"local.ifname\" = \"%s\", ", str);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if ((media = pw_properties_get(props, "sess.media")) == NULL)
 | 
						if ((media = pw_properties_get(props, "sess.media")) == NULL)
 | 
				
			||||||
		media = "audio";
 | 
							media = "audio";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1540,7 +1545,7 @@ int pipewire__module_init(struct pw_impl_module *module, const char *args)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	pw_impl_module_update_properties(module, &SPA_DICT_INIT_ARRAY(module_info));
 | 
						pw_impl_module_update_properties(module, &SPA_DICT_INIT_ARRAY(module_info));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	pw_log_info("Successfully loaded module-rtp-sink");
 | 
						pw_log_info("Successfully loaded module-rtp-sap");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return 0;
 | 
						return 0;
 | 
				
			||||||
out:
 | 
					out:
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -253,7 +253,7 @@ static bool is_multicast(struct sockaddr *sa, socklen_t salen)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int make_socket(struct sockaddr_storage *src, socklen_t src_len,
 | 
					static int make_socket(struct sockaddr_storage *src, socklen_t src_len,
 | 
				
			||||||
		struct sockaddr_storage *dst, socklen_t dst_len,
 | 
							struct sockaddr_storage *dst, socklen_t dst_len,
 | 
				
			||||||
		bool loop, int ttl, int dscp)
 | 
							bool loop, int ttl, int dscp, char *ifname)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	int af, fd, val, res;
 | 
						int af, fd, val, res;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -267,6 +267,13 @@ static int make_socket(struct sockaddr_storage *src, socklen_t src_len,
 | 
				
			||||||
		pw_log_error("bind() failed: %m");
 | 
							pw_log_error("bind() failed: %m");
 | 
				
			||||||
		goto error;
 | 
							goto error;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					#ifdef SO_BINDTODEVICE
 | 
				
			||||||
 | 
						if (ifname && setsockopt(fd, SOL_SOCKET, SO_BINDTODEVICE, ifname, strlen(ifname)) < 0) {
 | 
				
			||||||
 | 
							res = -errno;
 | 
				
			||||||
 | 
							pw_log_error("setsockopt(SO_BINDTODEVICE) failed: %m");
 | 
				
			||||||
 | 
							goto error;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
	if (connect(fd, (struct sockaddr*)dst, dst_len) < 0) {
 | 
						if (connect(fd, (struct sockaddr*)dst, dst_len) < 0) {
 | 
				
			||||||
		res = -errno;
 | 
							res = -errno;
 | 
				
			||||||
		pw_log_error("connect() failed: %m");
 | 
							pw_log_error("connect() failed: %m");
 | 
				
			||||||
| 
						 | 
					@ -517,7 +524,8 @@ int pipewire__module_init(struct pw_impl_module *module, const char *args)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if ((res = make_socket(&impl->src_addr, impl->src_len,
 | 
						if ((res = make_socket(&impl->src_addr, impl->src_len,
 | 
				
			||||||
					&impl->dst_addr, impl->dst_len,
 | 
										&impl->dst_addr, impl->dst_len,
 | 
				
			||||||
					impl->mcast_loop, impl->ttl, impl->dscp)) < 0) {
 | 
										impl->mcast_loop, impl->ttl, impl->dscp,
 | 
				
			||||||
 | 
										impl->ifname)) < 0) {
 | 
				
			||||||
		pw_log_error("can't make socket: %s", spa_strerror(res));
 | 
							pw_log_error("can't make socket: %s", spa_strerror(res));
 | 
				
			||||||
		goto out;
 | 
							goto out;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue