fix port-specific ptp/p2p_dst_ipv4 configuration (RHEL-60055)

Resolves: RHEL-60055
This commit is contained in:
Miroslav Lichvar 2024-09-25 14:48:04 +02:00
parent 4e077c337d
commit 2a7baa686c
2 changed files with 87 additions and 0 deletions

85
linuxptp-udpaddr.patch Normal file
View File

@ -0,0 +1,85 @@
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;
}

View File

@ -29,6 +29,8 @@ Source22: linuxptp.te
# limit unicast message rate per address and grant duration
Patch1: linuxptp-ucastrate.patch
# fix port-specific ptp/p2p_dst_ipv4 configuration
Patch2: linuxptp-udpaddr.patch
BuildRequires: gcc gcc-c++ gnutls-devel make systemd