fix port-specific ptp/p2p_dst_ipv4 configuration (RHEL-60055)
Resolves: RHEL-60055
This commit is contained in:
parent
4e077c337d
commit
2a7baa686c
85
linuxptp-udpaddr.patch
Normal file
85
linuxptp-udpaddr.patch
Normal 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;
|
||||||
|
}
|
@ -29,6 +29,8 @@ Source22: linuxptp.te
|
|||||||
|
|
||||||
# limit unicast message rate per address and grant duration
|
# limit unicast message rate per address and grant duration
|
||||||
Patch1: linuxptp-ucastrate.patch
|
Patch1: linuxptp-ucastrate.patch
|
||||||
|
# fix port-specific ptp/p2p_dst_ipv4 configuration
|
||||||
|
Patch2: linuxptp-udpaddr.patch
|
||||||
|
|
||||||
BuildRequires: gcc gcc-c++ gnutls-devel make systemd
|
BuildRequires: gcc gcc-c++ gnutls-devel make systemd
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user