86 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			86 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
| commit 77504ea63484dbc0c78b1ef58b29f06ced517223
 | |
| Author: Miroslav Lichvar <mlichvar@redhat.com>
 | |
| Date:   Wed Sep 25 14:16:16 2024 +0200
 | |
| 
 | |
|     udp: Fix port-specific ptp/p2p_dst_ipv4 configuration.
 | |
|     
 | |
|     If different ports are configured with a different ptp_dst_ipv4 or
 | |
|     p2p_dst_ipv4 address, only the last port in the configuration works
 | |
|     correctly. This is caused by a global variable holding the
 | |
|     destination address for all ports using the udp transport.
 | |
|     
 | |
|     Move the address to the udp structure to avoid the conflict between
 | |
|     different ports, same as when port-specific scope in udp6 was fixed
 | |
|     in commit a48666bee3dd ("udp6: Make mc6_addr transport-local").
 | |
|     
 | |
|     Fixes: 8a26c94cc88e ("udp+udp6: Make IP addresses configurable.")
 | |
|     Signed-off-by: Miroslav Lichvar <mlichvar@redhat.com>
 | |
| 
 | |
| diff --git a/udp.c b/udp.c
 | |
| index 38d0ec4..c9b5f39 100644
 | |
| --- a/udp.c
 | |
| +++ b/udp.c
 | |
| @@ -44,6 +44,7 @@ struct udp {
 | |
|  	struct transport t;
 | |
|  	struct address ip;
 | |
|  	struct address mac;
 | |
| +	struct in_addr mcast_addr[2];
 | |
|  };
 | |
|  
 | |
|  static int mcast_bind(int fd, int index)
 | |
| @@ -146,8 +147,6 @@ no_socket:
 | |
|  
 | |
|  enum { MC_PRIMARY, MC_PDELAY };
 | |
|  
 | |
| -static struct in_addr mcast_addr[2];
 | |
| -
 | |
|  static int udp_open(struct transport *t, struct interface *iface,
 | |
|  		    struct fdarray *fda, enum timestamp_type ts_type)
 | |
|  {
 | |
| @@ -165,22 +164,22 @@ static int udp_open(struct transport *t, struct interface *iface,
 | |
|  	sk_interface_addr(name, AF_INET, &udp->ip);
 | |
|  
 | |
|  	str = config_get_string(t->cfg, name, "ptp_dst_ipv4");
 | |
| -	if (!inet_aton(str, &mcast_addr[MC_PRIMARY])) {
 | |
| +	if (!inet_aton(str, &udp->mcast_addr[MC_PRIMARY])) {
 | |
|  		pr_err("invalid ptp_dst_ipv4 %s", str);
 | |
|  		return -1;
 | |
|  	}
 | |
|  
 | |
|  	str = config_get_string(t->cfg, name, "p2p_dst_ipv4");
 | |
| -	if (!inet_aton(str, &mcast_addr[MC_PDELAY])) {
 | |
| +	if (!inet_aton(str, &udp->mcast_addr[MC_PDELAY])) {
 | |
|  		pr_err("invalid p2p_dst_ipv4 %s", str);
 | |
|  		return -1;
 | |
|  	}
 | |
|  
 | |
| -	efd = open_socket(name, mcast_addr, EVENT_PORT, ttl);
 | |
| +	efd = open_socket(name, udp->mcast_addr, EVENT_PORT, ttl);
 | |
|  	if (efd < 0)
 | |
|  		goto no_event;
 | |
|  
 | |
| -	gfd = open_socket(name, mcast_addr, GENERAL_PORT, ttl);
 | |
| +	gfd = open_socket(name, udp->mcast_addr, GENERAL_PORT, ttl);
 | |
|  	if (gfd < 0)
 | |
|  		goto no_general;
 | |
|  
 | |
| @@ -223,6 +222,7 @@ static int udp_send(struct transport *t, struct fdarray *fda,
 | |
|  		    enum transport_event event, int peer, void *buf, int len,
 | |
|  		    struct address *addr, struct hw_timestamp *hwts)
 | |
|  {
 | |
| +	struct udp *udp = container_of(t, struct udp, t);
 | |
|  	struct address addr_buf;
 | |
|  	unsigned char junk[1600];
 | |
|  	ssize_t cnt;
 | |
| @@ -243,8 +243,8 @@ static int udp_send(struct transport *t, struct fdarray *fda,
 | |
|  	if (!addr) {
 | |
|  		memset(&addr_buf, 0, sizeof(addr_buf));
 | |
|  		addr_buf.sin.sin_family = AF_INET;
 | |
| -		addr_buf.sin.sin_addr = peer ? mcast_addr[MC_PDELAY] :
 | |
| -					       mcast_addr[MC_PRIMARY];
 | |
| +		addr_buf.sin.sin_addr = peer ? udp->mcast_addr[MC_PDELAY] :
 | |
| +					       udp->mcast_addr[MC_PRIMARY];
 | |
|  		addr_buf.len = sizeof(addr_buf.sin);
 | |
|  		addr = &addr_buf;
 | |
|  	}
 |