|
|
ae5d40 |
Patches backported from the upstream repository.
|
|
|
ae5d40 |
|
|
|
ae5d40 |
commit acc045034dd0db9dd4c4aca4b26528f8fed2ae78
|
|
|
ae5d40 |
Author: Miroslav Lichvar <mlichvar@redhat.com>
|
|
|
ae5d40 |
Date: Thu Feb 11 16:47:08 2021 +0100
|
|
|
ae5d40 |
|
|
|
ae5d40 |
port: Ignore non-management messages on UDS port.
|
|
|
ae5d40 |
|
|
|
ae5d40 |
Drop non-management messages on the UDS port early in the processing to
|
|
|
ae5d40 |
prevent them from changing the port or clock state.
|
|
|
ae5d40 |
|
|
|
ae5d40 |
Signed-off-by: Miroslav Lichvar <mlichvar@redhat.com>
|
|
|
ae5d40 |
|
|
|
ae5d40 |
diff --git a/port.c b/port.c
|
|
|
ae5d40 |
index fa49663..3fd06b1 100644
|
|
|
ae5d40 |
--- a/port.c
|
|
|
ae5d40 |
+++ b/port.c
|
|
|
ae5d40 |
@@ -56,6 +56,7 @@ enum syfu_event {
|
|
|
ae5d40 |
};
|
|
|
ae5d40 |
|
|
|
ae5d40 |
static int port_is_ieee8021as(struct port *p);
|
|
|
ae5d40 |
+static int port_is_uds(struct port *p);
|
|
|
ae5d40 |
static void port_nrate_initialize(struct port *p);
|
|
|
ae5d40 |
|
|
|
ae5d40 |
static int announce_compare(struct ptp_message *m1, struct ptp_message *m2)
|
|
|
ae5d40 |
@@ -691,6 +692,9 @@ static int port_ignore(struct port *p, struct ptp_message *m)
|
|
|
ae5d40 |
{
|
|
|
ae5d40 |
struct ClockIdentity c1, c2;
|
|
|
ae5d40 |
|
|
|
ae5d40 |
+ if (port_is_uds(p) && msg_type(m) != MANAGEMENT) {
|
|
|
ae5d40 |
+ return 1;
|
|
|
ae5d40 |
+ }
|
|
|
ae5d40 |
if (incapable_ignore(p, m)) {
|
|
|
ae5d40 |
return 1;
|
|
|
ae5d40 |
}
|
|
|
ae5d40 |
@@ -771,6 +775,11 @@ static int port_is_ieee8021as(struct port *p)
|
|
|
ae5d40 |
return p->follow_up_info ? 1 : 0;
|
|
|
ae5d40 |
}
|
|
|
ae5d40 |
|
|
|
ae5d40 |
+static int port_is_uds(struct port *p)
|
|
|
ae5d40 |
+{
|
|
|
ae5d40 |
+ return transport_type(p->trp) == TRANS_UDS;
|
|
|
ae5d40 |
+}
|
|
|
ae5d40 |
+
|
|
|
ae5d40 |
static void port_management_send_error(struct port *p, struct port *ingress,
|
|
|
ae5d40 |
struct ptp_message *msg, int error_id)
|
|
|
ae5d40 |
{
|
|
|
ae5d40 |
|
|
|
ae5d40 |
commit 72ec806fa62a87cb7e5444e27fa6bdcbfe4e27ca
|
|
|
ae5d40 |
Author: Miroslav Lichvar <mlichvar@redhat.com>
|
|
|
ae5d40 |
Date: Thu Feb 11 16:47:09 2021 +0100
|
|
|
ae5d40 |
|
|
|
ae5d40 |
clock: Don't allow COMMAND action on non-UDS port.
|
|
|
ae5d40 |
|
|
|
ae5d40 |
No COMMAND actions are currently supported, but check the port early in
|
|
|
ae5d40 |
clock_manage() before reaching port_manage().
|
|
|
ae5d40 |
|
|
|
ae5d40 |
Signed-off-by: Miroslav Lichvar <mlichvar@redhat.com>
|
|
|
ae5d40 |
|
|
|
ae5d40 |
diff --git a/clock.c b/clock.c
|
|
|
ae5d40 |
index a66d189..a6947bc 100644
|
|
|
ae5d40 |
--- a/clock.c
|
|
|
ae5d40 |
+++ b/clock.c
|
|
|
ae5d40 |
@@ -1423,6 +1423,11 @@ int clock_manage(struct clock *c, struct port *p, struct ptp_message *msg)
|
|
|
ae5d40 |
return changed;
|
|
|
ae5d40 |
break;
|
|
|
ae5d40 |
case COMMAND:
|
|
|
ae5d40 |
+ if (p != c->uds_port) {
|
|
|
ae5d40 |
+ /* Sorry, only allowed on the UDS port. */
|
|
|
ae5d40 |
+ clock_management_send_error(p, msg, TLV_NOT_SUPPORTED);
|
|
|
ae5d40 |
+ return changed;
|
|
|
ae5d40 |
+ }
|
|
|
ae5d40 |
break;
|
|
|
ae5d40 |
default:
|
|
|
ae5d40 |
return changed;
|
|
|
ae5d40 |
|
|
|
ae5d40 |
commit 2b45d80eadcb81c8bdf45baf98dabeebd912b1b0
|
|
|
ae5d40 |
Author: Miroslav Lichvar <mlichvar@redhat.com>
|
|
|
ae5d40 |
Date: Thu Feb 11 16:47:10 2021 +0100
|
|
|
ae5d40 |
|
|
|
ae5d40 |
clock: Rename UDS variables to read-write.
|
|
|
ae5d40 |
|
|
|
ae5d40 |
In preparation for a new read-only UDS port, rename variables of the
|
|
|
ae5d40 |
current UDS port to make it clear it is read-write, as opposed to
|
|
|
ae5d40 |
read-only.
|
|
|
ae5d40 |
|
|
|
ae5d40 |
Signed-off-by: Miroslav Lichvar <mlichvar@redhat.com>
|
|
|
ae5d40 |
|
|
|
ae5d40 |
diff --git a/clock.c b/clock.c
|
|
|
ae5d40 |
index a6947bc..d013b19 100644
|
|
|
ae5d40 |
--- a/clock.c
|
|
|
ae5d40 |
+++ b/clock.c
|
|
|
ae5d40 |
@@ -95,7 +95,7 @@ struct clock {
|
|
|
ae5d40 |
struct foreign_clock *best;
|
|
|
ae5d40 |
struct ClockIdentity best_id;
|
|
|
ae5d40 |
LIST_HEAD(ports_head, port) ports;
|
|
|
ae5d40 |
- struct port *uds_port;
|
|
|
ae5d40 |
+ struct port *uds_rw_port;
|
|
|
ae5d40 |
struct pollfd *pollfd;
|
|
|
ae5d40 |
int pollfd_valid;
|
|
|
ae5d40 |
int nports; /* does not include the UDS port */
|
|
|
ae5d40 |
@@ -129,7 +129,7 @@ struct clock {
|
|
|
ae5d40 |
struct clock_stats stats;
|
|
|
ae5d40 |
int stats_interval;
|
|
|
ae5d40 |
struct clockcheck *sanity_check;
|
|
|
ae5d40 |
- struct interface *udsif;
|
|
|
ae5d40 |
+ struct interface *uds_rw_if;
|
|
|
ae5d40 |
LIST_HEAD(clock_subscribers_head, clock_subscriber) subscribers;
|
|
|
ae5d40 |
struct monitor *slave_event_monitor;
|
|
|
ae5d40 |
};
|
|
|
ae5d40 |
@@ -245,7 +245,7 @@ void clock_send_notification(struct clock *c, struct ptp_message *msg,
|
|
|
ae5d40 |
{
|
|
|
ae5d40 |
unsigned int event_pos = event / 8;
|
|
|
ae5d40 |
uint8_t mask = 1 << (event % 8);
|
|
|
ae5d40 |
- struct port *uds = c->uds_port;
|
|
|
ae5d40 |
+ struct port *uds = c->uds_rw_port;
|
|
|
ae5d40 |
struct clock_subscriber *s;
|
|
|
ae5d40 |
|
|
|
ae5d40 |
LIST_FOREACH(s, &c->subscribers, list) {
|
|
|
ae5d40 |
@@ -267,13 +267,13 @@ void clock_destroy(struct clock *c)
|
|
|
ae5d40 |
{
|
|
|
ae5d40 |
struct port *p, *tmp;
|
|
|
ae5d40 |
|
|
|
ae5d40 |
- interface_destroy(c->udsif);
|
|
|
ae5d40 |
+ interface_destroy(c->uds_rw_if);
|
|
|
ae5d40 |
clock_flush_subscriptions(c);
|
|
|
ae5d40 |
LIST_FOREACH_SAFE(p, &c->ports, list, tmp) {
|
|
|
ae5d40 |
clock_remove_port(c, p);
|
|
|
ae5d40 |
}
|
|
|
ae5d40 |
monitor_destroy(c->slave_event_monitor);
|
|
|
ae5d40 |
- port_close(c->uds_port);
|
|
|
ae5d40 |
+ port_close(c->uds_rw_port);
|
|
|
ae5d40 |
free(c->pollfd);
|
|
|
ae5d40 |
if (c->clkid != CLOCK_REALTIME) {
|
|
|
ae5d40 |
phc_close(c->clkid);
|
|
|
ae5d40 |
@@ -442,7 +442,7 @@ static int clock_management_fill_response(struct clock *c, struct port *p,
|
|
|
ae5d40 |
datalen = sizeof(*gsn);
|
|
|
ae5d40 |
break;
|
|
|
ae5d40 |
case TLV_SUBSCRIBE_EVENTS_NP:
|
|
|
ae5d40 |
- if (p != c->uds_port) {
|
|
|
ae5d40 |
+ if (p != c->uds_rw_port) {
|
|
|
ae5d40 |
/* Only the UDS port allowed. */
|
|
|
ae5d40 |
break;
|
|
|
ae5d40 |
}
|
|
|
ae5d40 |
@@ -784,7 +784,7 @@ static int forwarding(struct clock *c, struct port *p)
|
|
|
ae5d40 |
default:
|
|
|
ae5d40 |
break;
|
|
|
ae5d40 |
}
|
|
|
ae5d40 |
- if (p == c->uds_port && ps != PS_FAULTY) {
|
|
|
ae5d40 |
+ if (p == c->uds_rw_port && ps != PS_FAULTY) {
|
|
|
ae5d40 |
return 1;
|
|
|
ae5d40 |
}
|
|
|
ae5d40 |
return 0;
|
|
|
ae5d40 |
@@ -1044,20 +1044,20 @@ struct clock *clock_create(enum clock_type type, struct config *config,
|
|
|
ae5d40 |
|
|
|
ae5d40 |
/* Configure the UDS. */
|
|
|
ae5d40 |
uds_ifname = config_get_string(config, NULL, "uds_address");
|
|
|
ae5d40 |
- c->udsif = interface_create(uds_ifname);
|
|
|
ae5d40 |
- if (config_set_section_int(config, interface_name(c->udsif),
|
|
|
ae5d40 |
+ c->uds_rw_if = interface_create(uds_ifname);
|
|
|
ae5d40 |
+ if (config_set_section_int(config, interface_name(c->uds_rw_if),
|
|
|
ae5d40 |
"announceReceiptTimeout", 0)) {
|
|
|
ae5d40 |
return NULL;
|
|
|
ae5d40 |
}
|
|
|
ae5d40 |
- if (config_set_section_int(config, interface_name(c->udsif),
|
|
|
ae5d40 |
+ if (config_set_section_int(config, interface_name(c->uds_rw_if),
|
|
|
ae5d40 |
"delay_mechanism", DM_AUTO)) {
|
|
|
ae5d40 |
return NULL;
|
|
|
ae5d40 |
}
|
|
|
ae5d40 |
- if (config_set_section_int(config, interface_name(c->udsif),
|
|
|
ae5d40 |
+ if (config_set_section_int(config, interface_name(c->uds_rw_if),
|
|
|
ae5d40 |
"network_transport", TRANS_UDS)) {
|
|
|
ae5d40 |
return NULL;
|
|
|
ae5d40 |
}
|
|
|
ae5d40 |
- if (config_set_section_int(config, interface_name(c->udsif),
|
|
|
ae5d40 |
+ if (config_set_section_int(config, interface_name(c->uds_rw_if),
|
|
|
ae5d40 |
"delay_filter_length", 1)) {
|
|
|
ae5d40 |
return NULL;
|
|
|
ae5d40 |
}
|
|
|
ae5d40 |
@@ -1180,14 +1180,15 @@ struct clock *clock_create(enum clock_type type, struct config *config,
|
|
|
ae5d40 |
}
|
|
|
ae5d40 |
|
|
|
ae5d40 |
/* Create the UDS interface. */
|
|
|
ae5d40 |
- c->uds_port = port_open(phc_device, phc_index, timestamping, 0, c->udsif, c);
|
|
|
ae5d40 |
- if (!c->uds_port) {
|
|
|
ae5d40 |
+ c->uds_rw_port = port_open(phc_device, phc_index, timestamping, 0,
|
|
|
ae5d40 |
+ c->uds_rw_if, c);
|
|
|
ae5d40 |
+ if (!c->uds_rw_port) {
|
|
|
ae5d40 |
pr_err("failed to open the UDS port");
|
|
|
ae5d40 |
return NULL;
|
|
|
ae5d40 |
}
|
|
|
ae5d40 |
clock_fda_changed(c);
|
|
|
ae5d40 |
|
|
|
ae5d40 |
- c->slave_event_monitor = monitor_create(config, c->uds_port);
|
|
|
ae5d40 |
+ c->slave_event_monitor = monitor_create(config, c->uds_rw_port);
|
|
|
ae5d40 |
if (!c->slave_event_monitor) {
|
|
|
ae5d40 |
pr_err("failed to create slave event monitor");
|
|
|
ae5d40 |
return NULL;
|
|
|
ae5d40 |
@@ -1206,7 +1207,7 @@ struct clock *clock_create(enum clock_type type, struct config *config,
|
|
|
ae5d40 |
LIST_FOREACH(p, &c->ports, list) {
|
|
|
ae5d40 |
port_dispatch(p, EV_INITIALIZE, 0);
|
|
|
ae5d40 |
}
|
|
|
ae5d40 |
- port_dispatch(c->uds_port, EV_INITIALIZE, 0);
|
|
|
ae5d40 |
+ port_dispatch(c->uds_rw_port, EV_INITIALIZE, 0);
|
|
|
ae5d40 |
|
|
|
ae5d40 |
return c;
|
|
|
ae5d40 |
}
|
|
|
ae5d40 |
@@ -1314,7 +1315,7 @@ static void clock_check_pollfd(struct clock *c)
|
|
|
ae5d40 |
clock_fill_pollfd(dest, p);
|
|
|
ae5d40 |
dest += N_CLOCK_PFD;
|
|
|
ae5d40 |
}
|
|
|
ae5d40 |
- clock_fill_pollfd(dest, c->uds_port);
|
|
|
ae5d40 |
+ clock_fill_pollfd(dest, c->uds_rw_port);
|
|
|
ae5d40 |
c->pollfd_valid = 1;
|
|
|
ae5d40 |
}
|
|
|
ae5d40 |
|
|
|
ae5d40 |
@@ -1331,7 +1332,7 @@ static int clock_do_forward_mgmt(struct clock *c,
|
|
|
ae5d40 |
return 0;
|
|
|
ae5d40 |
|
|
|
ae5d40 |
/* Don't forward any requests to the UDS port. */
|
|
|
ae5d40 |
- if (out == c->uds_port) {
|
|
|
ae5d40 |
+ if (out == c->uds_rw_port) {
|
|
|
ae5d40 |
switch (management_action(msg)) {
|
|
|
ae5d40 |
case GET:
|
|
|
ae5d40 |
case SET:
|
|
|
ae5d40 |
@@ -1362,7 +1363,7 @@ static void clock_forward_mgmt_msg(struct clock *c, struct port *p, struct ptp_m
|
|
|
ae5d40 |
pr_err("port %d: management forward failed",
|
|
|
ae5d40 |
port_number(piter));
|
|
|
ae5d40 |
}
|
|
|
ae5d40 |
- if (clock_do_forward_mgmt(c, p, c->uds_port, msg, &msg_ready))
|
|
|
ae5d40 |
+ if (clock_do_forward_mgmt(c, p, c->uds_rw_port, msg, &msg_ready))
|
|
|
ae5d40 |
pr_err("uds port: management forward failed");
|
|
|
ae5d40 |
if (msg_ready) {
|
|
|
ae5d40 |
msg_post_recv(msg, pdulen);
|
|
|
ae5d40 |
@@ -1414,7 +1415,7 @@ int clock_manage(struct clock *c, struct port *p, struct ptp_message *msg)
|
|
|
ae5d40 |
clock_management_send_error(p, msg, TLV_WRONG_LENGTH);
|
|
|
ae5d40 |
return changed;
|
|
|
ae5d40 |
}
|
|
|
ae5d40 |
- if (p != c->uds_port) {
|
|
|
ae5d40 |
+ if (p != c->uds_rw_port) {
|
|
|
ae5d40 |
/* Sorry, only allowed on the UDS port. */
|
|
|
ae5d40 |
clock_management_send_error(p, msg, TLV_NOT_SUPPORTED);
|
|
|
ae5d40 |
return changed;
|
|
|
ae5d40 |
@@ -1423,7 +1424,7 @@ int clock_manage(struct clock *c, struct port *p, struct ptp_message *msg)
|
|
|
ae5d40 |
return changed;
|
|
|
ae5d40 |
break;
|
|
|
ae5d40 |
case COMMAND:
|
|
|
ae5d40 |
- if (p != c->uds_port) {
|
|
|
ae5d40 |
+ if (p != c->uds_rw_port) {
|
|
|
ae5d40 |
/* Sorry, only allowed on the UDS port. */
|
|
|
ae5d40 |
clock_management_send_error(p, msg, TLV_NOT_SUPPORTED);
|
|
|
ae5d40 |
return changed;
|
|
|
ae5d40 |
@@ -1435,7 +1436,7 @@ int clock_manage(struct clock *c, struct port *p, struct ptp_message *msg)
|
|
|
ae5d40 |
|
|
|
ae5d40 |
switch (mgt->id) {
|
|
|
ae5d40 |
case TLV_PORT_PROPERTIES_NP:
|
|
|
ae5d40 |
- if (p != c->uds_port) {
|
|
|
ae5d40 |
+ if (p != c->uds_rw_port) {
|
|
|
ae5d40 |
/* Only the UDS port allowed. */
|
|
|
ae5d40 |
clock_management_send_error(p, msg, TLV_NOT_SUPPORTED);
|
|
|
ae5d40 |
return 0;
|
|
|
ae5d40 |
@@ -1500,7 +1501,7 @@ int clock_manage(struct clock *c, struct port *p, struct ptp_message *msg)
|
|
|
ae5d40 |
|
|
|
ae5d40 |
void clock_notify_event(struct clock *c, enum notification event)
|
|
|
ae5d40 |
{
|
|
|
ae5d40 |
- struct port *uds = c->uds_port;
|
|
|
ae5d40 |
+ struct port *uds = c->uds_rw_port;
|
|
|
ae5d40 |
struct PortIdentity pid = port_identity(uds);
|
|
|
ae5d40 |
struct ptp_message *msg;
|
|
|
ae5d40 |
int id;
|
|
|
ae5d40 |
@@ -1604,7 +1605,7 @@ int clock_poll(struct clock *c)
|
|
|
ae5d40 |
/* Check the UDS port. */
|
|
|
ae5d40 |
for (i = 0; i < N_POLLFD; i++) {
|
|
|
ae5d40 |
if (cur[i].revents & (POLLIN|POLLPRI)) {
|
|
|
ae5d40 |
- event = port_event(c->uds_port, i);
|
|
|
ae5d40 |
+ event = port_event(c->uds_rw_port, i);
|
|
|
ae5d40 |
if (EV_STATE_DECISION_EVENT == event) {
|
|
|
ae5d40 |
c->sde = 1;
|
|
|
ae5d40 |
}
|
|
|
ae5d40 |
|
|
|
ae5d40 |
commit 1f74a16502b55ce8eaed3d7488542e5469ac8263
|
|
|
ae5d40 |
Author: Miroslav Lichvar <mlichvar@redhat.com>
|
|
|
ae5d40 |
Date: Thu Feb 11 16:47:11 2021 +0100
|
|
|
ae5d40 |
|
|
|
ae5d40 |
clock: Add read-only UDS port for monitoring.
|
|
|
ae5d40 |
|
|
|
ae5d40 |
Add a second UDS port to allow untrusted applications to monitor ptp4l.
|
|
|
ae5d40 |
On this "read-only" UDS port disable non-GET actions and forwarding.
|
|
|
ae5d40 |
The path can be configured with the uds_ro_address option (default is
|
|
|
ae5d40 |
/var/run/ptp4lro).
|
|
|
ae5d40 |
|
|
|
ae5d40 |
Forwarding is disabled to limit the access to the local ptp4l instance.
|
|
|
ae5d40 |
|
|
|
ae5d40 |
Subscriptions are not enabled to prevent the applications from making a
|
|
|
ae5d40 |
large number of subscriptions or interfere with applications that have
|
|
|
ae5d40 |
access to the read-write UDS port.
|
|
|
ae5d40 |
|
|
|
ae5d40 |
Signed-off-by: Miroslav Lichvar <mlichvar@redhat.com>
|
|
|
ae5d40 |
|
|
|
ae5d40 |
diff --git a/clock.c b/clock.c
|
|
|
ae5d40 |
index d013b19..8592d29 100644
|
|
|
ae5d40 |
--- a/clock.c
|
|
|
ae5d40 |
+++ b/clock.c
|
|
|
ae5d40 |
@@ -96,9 +96,10 @@ struct clock {
|
|
|
ae5d40 |
struct ClockIdentity best_id;
|
|
|
ae5d40 |
LIST_HEAD(ports_head, port) ports;
|
|
|
ae5d40 |
struct port *uds_rw_port;
|
|
|
ae5d40 |
+ struct port *uds_ro_port;
|
|
|
ae5d40 |
struct pollfd *pollfd;
|
|
|
ae5d40 |
int pollfd_valid;
|
|
|
ae5d40 |
- int nports; /* does not include the UDS port */
|
|
|
ae5d40 |
+ int nports; /* does not include the two UDS ports */
|
|
|
ae5d40 |
int last_port_number;
|
|
|
ae5d40 |
int sde;
|
|
|
ae5d40 |
int free_running;
|
|
|
ae5d40 |
@@ -130,6 +131,7 @@ struct clock {
|
|
|
ae5d40 |
int stats_interval;
|
|
|
ae5d40 |
struct clockcheck *sanity_check;
|
|
|
ae5d40 |
struct interface *uds_rw_if;
|
|
|
ae5d40 |
+ struct interface *uds_ro_if;
|
|
|
ae5d40 |
LIST_HEAD(clock_subscribers_head, clock_subscriber) subscribers;
|
|
|
ae5d40 |
struct monitor *slave_event_monitor;
|
|
|
ae5d40 |
};
|
|
|
ae5d40 |
@@ -268,12 +270,14 @@ void clock_destroy(struct clock *c)
|
|
|
ae5d40 |
struct port *p, *tmp;
|
|
|
ae5d40 |
|
|
|
ae5d40 |
interface_destroy(c->uds_rw_if);
|
|
|
ae5d40 |
+ interface_destroy(c->uds_ro_if);
|
|
|
ae5d40 |
clock_flush_subscriptions(c);
|
|
|
ae5d40 |
LIST_FOREACH_SAFE(p, &c->ports, list, tmp) {
|
|
|
ae5d40 |
clock_remove_port(c, p);
|
|
|
ae5d40 |
}
|
|
|
ae5d40 |
monitor_destroy(c->slave_event_monitor);
|
|
|
ae5d40 |
port_close(c->uds_rw_port);
|
|
|
ae5d40 |
+ port_close(c->uds_ro_port);
|
|
|
ae5d40 |
free(c->pollfd);
|
|
|
ae5d40 |
if (c->clkid != CLOCK_REALTIME) {
|
|
|
ae5d40 |
phc_close(c->clkid);
|
|
|
ae5d40 |
@@ -443,7 +447,7 @@ static int clock_management_fill_response(struct clock *c, struct port *p,
|
|
|
ae5d40 |
break;
|
|
|
ae5d40 |
case TLV_SUBSCRIBE_EVENTS_NP:
|
|
|
ae5d40 |
if (p != c->uds_rw_port) {
|
|
|
ae5d40 |
- /* Only the UDS port allowed. */
|
|
|
ae5d40 |
+ /* Only the UDS-RW port allowed. */
|
|
|
ae5d40 |
break;
|
|
|
ae5d40 |
}
|
|
|
ae5d40 |
sen = (struct subscribe_events_np *)tlv->data;
|
|
|
ae5d40 |
@@ -774,6 +778,10 @@ static int clock_utc_correct(struct clock *c, tmv_t ingress)
|
|
|
ae5d40 |
static int forwarding(struct clock *c, struct port *p)
|
|
|
ae5d40 |
{
|
|
|
ae5d40 |
enum port_state ps = port_state(p);
|
|
|
ae5d40 |
+
|
|
|
ae5d40 |
+ if (p == c->uds_ro_port)
|
|
|
ae5d40 |
+ return 0;
|
|
|
ae5d40 |
+
|
|
|
ae5d40 |
switch (ps) {
|
|
|
ae5d40 |
case PS_MASTER:
|
|
|
ae5d40 |
case PS_GRAND_MASTER:
|
|
|
ae5d40 |
@@ -818,7 +826,7 @@ static int clock_add_port(struct clock *c, const char *phc_device,
|
|
|
ae5d40 |
{
|
|
|
ae5d40 |
struct port *p, *piter, *lastp = NULL;
|
|
|
ae5d40 |
|
|
|
ae5d40 |
- if (clock_resize_pollfd(c, c->nports + 1)) {
|
|
|
ae5d40 |
+ if (clock_resize_pollfd(c, c->nports + 2)) {
|
|
|
ae5d40 |
return -1;
|
|
|
ae5d40 |
}
|
|
|
ae5d40 |
p = port_open(phc_device, phc_index, timestamping,
|
|
|
ae5d40 |
@@ -1043,6 +1051,7 @@ struct clock *clock_create(enum clock_type type, struct config *config,
|
|
|
ae5d40 |
}
|
|
|
ae5d40 |
|
|
|
ae5d40 |
/* Configure the UDS. */
|
|
|
ae5d40 |
+
|
|
|
ae5d40 |
uds_ifname = config_get_string(config, NULL, "uds_address");
|
|
|
ae5d40 |
c->uds_rw_if = interface_create(uds_ifname);
|
|
|
ae5d40 |
if (config_set_section_int(config, interface_name(c->uds_rw_if),
|
|
|
ae5d40 |
@@ -1062,6 +1071,25 @@ struct clock *clock_create(enum clock_type type, struct config *config,
|
|
|
ae5d40 |
return NULL;
|
|
|
ae5d40 |
}
|
|
|
ae5d40 |
|
|
|
ae5d40 |
+ uds_ifname = config_get_string(config, NULL, "uds_ro_address");
|
|
|
ae5d40 |
+ c->uds_ro_if = interface_create(uds_ifname);
|
|
|
ae5d40 |
+ if (config_set_section_int(config, interface_name(c->uds_ro_if),
|
|
|
ae5d40 |
+ "announceReceiptTimeout", 0)) {
|
|
|
ae5d40 |
+ return NULL;
|
|
|
ae5d40 |
+ }
|
|
|
ae5d40 |
+ if (config_set_section_int(config, interface_name(c->uds_ro_if),
|
|
|
ae5d40 |
+ "delay_mechanism", DM_AUTO)) {
|
|
|
ae5d40 |
+ return NULL;
|
|
|
ae5d40 |
+ }
|
|
|
ae5d40 |
+ if (config_set_section_int(config, interface_name(c->uds_ro_if),
|
|
|
ae5d40 |
+ "network_transport", TRANS_UDS)) {
|
|
|
ae5d40 |
+ return NULL;
|
|
|
ae5d40 |
+ }
|
|
|
ae5d40 |
+ if (config_set_section_int(config, interface_name(c->uds_ro_if),
|
|
|
ae5d40 |
+ "delay_filter_length", 1)) {
|
|
|
ae5d40 |
+ return NULL;
|
|
|
ae5d40 |
+ }
|
|
|
ae5d40 |
+
|
|
|
ae5d40 |
c->config = config;
|
|
|
ae5d40 |
c->free_running = config_get_int(config, NULL, "free_running");
|
|
|
ae5d40 |
c->freq_est_interval = config_get_int(config, NULL, "freq_est_interval");
|
|
|
ae5d40 |
@@ -1179,11 +1207,18 @@ struct clock *clock_create(enum clock_type type, struct config *config,
|
|
|
ae5d40 |
return NULL;
|
|
|
ae5d40 |
}
|
|
|
ae5d40 |
|
|
|
ae5d40 |
- /* Create the UDS interface. */
|
|
|
ae5d40 |
+ /* Create the UDS interfaces. */
|
|
|
ae5d40 |
+
|
|
|
ae5d40 |
c->uds_rw_port = port_open(phc_device, phc_index, timestamping, 0,
|
|
|
ae5d40 |
c->uds_rw_if, c);
|
|
|
ae5d40 |
if (!c->uds_rw_port) {
|
|
|
ae5d40 |
- pr_err("failed to open the UDS port");
|
|
|
ae5d40 |
+ pr_err("failed to open the UDS-RW port");
|
|
|
ae5d40 |
+ return NULL;
|
|
|
ae5d40 |
+ }
|
|
|
ae5d40 |
+ c->uds_ro_port = port_open(phc_device, phc_index, timestamping, 0,
|
|
|
ae5d40 |
+ c->uds_ro_if, c);
|
|
|
ae5d40 |
+ if (!c->uds_ro_port) {
|
|
|
ae5d40 |
+ pr_err("failed to open the UDS-RO port");
|
|
|
ae5d40 |
return NULL;
|
|
|
ae5d40 |
}
|
|
|
ae5d40 |
clock_fda_changed(c);
|
|
|
ae5d40 |
@@ -1208,6 +1243,7 @@ struct clock *clock_create(enum clock_type type, struct config *config,
|
|
|
ae5d40 |
port_dispatch(p, EV_INITIALIZE, 0);
|
|
|
ae5d40 |
}
|
|
|
ae5d40 |
port_dispatch(c->uds_rw_port, EV_INITIALIZE, 0);
|
|
|
ae5d40 |
+ port_dispatch(c->uds_ro_port, EV_INITIALIZE, 0);
|
|
|
ae5d40 |
|
|
|
ae5d40 |
return c;
|
|
|
ae5d40 |
}
|
|
|
ae5d40 |
@@ -1278,9 +1314,9 @@ static int clock_resize_pollfd(struct clock *c, int new_nports)
|
|
|
ae5d40 |
{
|
|
|
ae5d40 |
struct pollfd *new_pollfd;
|
|
|
ae5d40 |
|
|
|
ae5d40 |
- /* Need to allocate one whole extra block of fds for UDS. */
|
|
|
ae5d40 |
+ /* Need to allocate two whole extra blocks of fds for UDS ports. */
|
|
|
ae5d40 |
new_pollfd = realloc(c->pollfd,
|
|
|
ae5d40 |
- (new_nports + 1) * N_CLOCK_PFD *
|
|
|
ae5d40 |
+ (new_nports + 2) * N_CLOCK_PFD *
|
|
|
ae5d40 |
sizeof(struct pollfd));
|
|
|
ae5d40 |
if (!new_pollfd) {
|
|
|
ae5d40 |
return -1;
|
|
|
ae5d40 |
@@ -1316,6 +1352,8 @@ static void clock_check_pollfd(struct clock *c)
|
|
|
ae5d40 |
dest += N_CLOCK_PFD;
|
|
|
ae5d40 |
}
|
|
|
ae5d40 |
clock_fill_pollfd(dest, c->uds_rw_port);
|
|
|
ae5d40 |
+ dest += N_CLOCK_PFD;
|
|
|
ae5d40 |
+ clock_fill_pollfd(dest, c->uds_ro_port);
|
|
|
ae5d40 |
c->pollfd_valid = 1;
|
|
|
ae5d40 |
}
|
|
|
ae5d40 |
|
|
|
ae5d40 |
@@ -1331,7 +1369,8 @@ static int clock_do_forward_mgmt(struct clock *c,
|
|
|
ae5d40 |
if (in == out || !forwarding(c, out))
|
|
|
ae5d40 |
return 0;
|
|
|
ae5d40 |
|
|
|
ae5d40 |
- /* Don't forward any requests to the UDS port. */
|
|
|
ae5d40 |
+ /* Don't forward any requests to the UDS-RW port
|
|
|
ae5d40 |
+ (the UDS-RO port doesn't allow any forwarding). */
|
|
|
ae5d40 |
if (out == c->uds_rw_port) {
|
|
|
ae5d40 |
switch (management_action(msg)) {
|
|
|
ae5d40 |
case GET:
|
|
|
ae5d40 |
@@ -1416,7 +1455,7 @@ int clock_manage(struct clock *c, struct port *p, struct ptp_message *msg)
|
|
|
ae5d40 |
return changed;
|
|
|
ae5d40 |
}
|
|
|
ae5d40 |
if (p != c->uds_rw_port) {
|
|
|
ae5d40 |
- /* Sorry, only allowed on the UDS port. */
|
|
|
ae5d40 |
+ /* Sorry, only allowed on the UDS-RW port. */
|
|
|
ae5d40 |
clock_management_send_error(p, msg, TLV_NOT_SUPPORTED);
|
|
|
ae5d40 |
return changed;
|
|
|
ae5d40 |
}
|
|
|
ae5d40 |
@@ -1425,7 +1464,7 @@ int clock_manage(struct clock *c, struct port *p, struct ptp_message *msg)
|
|
|
ae5d40 |
break;
|
|
|
ae5d40 |
case COMMAND:
|
|
|
ae5d40 |
if (p != c->uds_rw_port) {
|
|
|
ae5d40 |
- /* Sorry, only allowed on the UDS port. */
|
|
|
ae5d40 |
+ /* Sorry, only allowed on the UDS-RW port. */
|
|
|
ae5d40 |
clock_management_send_error(p, msg, TLV_NOT_SUPPORTED);
|
|
|
ae5d40 |
return changed;
|
|
|
ae5d40 |
}
|
|
|
ae5d40 |
@@ -1437,7 +1476,7 @@ int clock_manage(struct clock *c, struct port *p, struct ptp_message *msg)
|
|
|
ae5d40 |
switch (mgt->id) {
|
|
|
ae5d40 |
case TLV_PORT_PROPERTIES_NP:
|
|
|
ae5d40 |
if (p != c->uds_rw_port) {
|
|
|
ae5d40 |
- /* Only the UDS port allowed. */
|
|
|
ae5d40 |
+ /* Only the UDS-RW port allowed. */
|
|
|
ae5d40 |
clock_management_send_error(p, msg, TLV_NOT_SUPPORTED);
|
|
|
ae5d40 |
return 0;
|
|
|
ae5d40 |
}
|
|
|
ae5d40 |
@@ -1548,7 +1587,7 @@ int clock_poll(struct clock *c)
|
|
|
ae5d40 |
struct port *p;
|
|
|
ae5d40 |
|
|
|
ae5d40 |
clock_check_pollfd(c);
|
|
|
ae5d40 |
- cnt = poll(c->pollfd, (c->nports + 1) * N_CLOCK_PFD, -1);
|
|
|
ae5d40 |
+ cnt = poll(c->pollfd, (c->nports + 2) * N_CLOCK_PFD, -1);
|
|
|
ae5d40 |
if (cnt < 0) {
|
|
|
ae5d40 |
if (EINTR == errno) {
|
|
|
ae5d40 |
return 0;
|
|
|
ae5d40 |
@@ -1602,7 +1641,7 @@ int clock_poll(struct clock *c)
|
|
|
ae5d40 |
cur += N_CLOCK_PFD;
|
|
|
ae5d40 |
}
|
|
|
ae5d40 |
|
|
|
ae5d40 |
- /* Check the UDS port. */
|
|
|
ae5d40 |
+ /* Check the UDS ports. */
|
|
|
ae5d40 |
for (i = 0; i < N_POLLFD; i++) {
|
|
|
ae5d40 |
if (cur[i].revents & (POLLIN|POLLPRI)) {
|
|
|
ae5d40 |
event = port_event(c->uds_rw_port, i);
|
|
|
ae5d40 |
@@ -1611,6 +1650,13 @@ int clock_poll(struct clock *c)
|
|
|
ae5d40 |
}
|
|
|
ae5d40 |
}
|
|
|
ae5d40 |
}
|
|
|
ae5d40 |
+ cur += N_CLOCK_PFD;
|
|
|
ae5d40 |
+ for (i = 0; i < N_POLLFD; i++) {
|
|
|
ae5d40 |
+ if (cur[i].revents & (POLLIN|POLLPRI)) {
|
|
|
ae5d40 |
+ event = port_event(c->uds_ro_port, i);
|
|
|
ae5d40 |
+ /* sde is not expected on the UDS-RO port */
|
|
|
ae5d40 |
+ }
|
|
|
ae5d40 |
+ }
|
|
|
ae5d40 |
|
|
|
ae5d40 |
if (c->sde) {
|
|
|
ae5d40 |
handle_state_decision_event(c);
|
|
|
ae5d40 |
diff --git a/config.c b/config.c
|
|
|
ae5d40 |
index d237de9..96a5351 100644
|
|
|
ae5d40 |
--- a/config.c
|
|
|
ae5d40 |
+++ b/config.c
|
|
|
ae5d40 |
@@ -323,6 +323,7 @@ struct config_item config_tab[] = {
|
|
|
ae5d40 |
PORT_ITEM_INT("udp_ttl", 1, 1, 255),
|
|
|
ae5d40 |
PORT_ITEM_INT("udp6_scope", 0x0E, 0x00, 0x0F),
|
|
|
ae5d40 |
GLOB_ITEM_STR("uds_address", "/var/run/ptp4l"),
|
|
|
ae5d40 |
+ GLOB_ITEM_STR("uds_ro_address", "/var/run/ptp4lro"),
|
|
|
ae5d40 |
PORT_ITEM_INT("unicast_listen", 0, 0, 1),
|
|
|
ae5d40 |
PORT_ITEM_INT("unicast_master_table", 0, 0, INT_MAX),
|
|
|
ae5d40 |
PORT_ITEM_INT("unicast_req_duration", 3600, 10, INT_MAX),
|
|
|
ae5d40 |
diff --git a/configs/default.cfg b/configs/default.cfg
|
|
|
ae5d40 |
index 8c19129..d5bab7d 100644
|
|
|
ae5d40 |
--- a/configs/default.cfg
|
|
|
ae5d40 |
+++ b/configs/default.cfg
|
|
|
ae5d40 |
@@ -90,6 +90,7 @@ p2p_dst_mac 01:80:C2:00:00:0E
|
|
|
ae5d40 |
udp_ttl 1
|
|
|
ae5d40 |
udp6_scope 0x0E
|
|
|
ae5d40 |
uds_address /var/run/ptp4l
|
|
|
ae5d40 |
+uds_ro_address /var/run/ptp4lro
|
|
|
ae5d40 |
#
|
|
|
ae5d40 |
# Default interface options
|
|
|
ae5d40 |
#
|
|
|
ae5d40 |
diff --git a/ptp4l.8 b/ptp4l.8
|
|
|
ae5d40 |
index b179b81..f9bd228 100644
|
|
|
ae5d40 |
--- a/ptp4l.8
|
|
|
ae5d40 |
+++ b/ptp4l.8
|
|
|
ae5d40 |
@@ -615,6 +615,12 @@ is only relevant with IPv6 transport. See RFC 4291. The default is
|
|
|
ae5d40 |
Specifies the address of the UNIX domain socket for receiving local
|
|
|
ae5d40 |
management messages. The default is /var/run/ptp4l.
|
|
|
ae5d40 |
.TP
|
|
|
ae5d40 |
+.B uds_ro_address
|
|
|
ae5d40 |
+Specifies the address of the second UNIX domain socket for receiving local
|
|
|
ae5d40 |
+management messages, which is restricted to GET actions and does not forward
|
|
|
ae5d40 |
+messages to other ports. Access to this socket can be given to untrusted
|
|
|
ae5d40 |
+applications for monitoring purposes. The default is /var/run/ptp4lro.
|
|
|
ae5d40 |
+.TP
|
|
|
ae5d40 |
.B dscp_event
|
|
|
ae5d40 |
Defines the Differentiated Services Codepoint (DSCP) to be used for PTP
|
|
|
ae5d40 |
event messages. Must be a value between 0 and 63. There are several media
|
|
|
ae5d40 |
|
|
|
ae5d40 |
commit d4c5343237588d265c605f3772337bc88cabe787
|
|
|
ae5d40 |
Author: Miroslav Lichvar <mlichvar@redhat.com>
|
|
|
ae5d40 |
Date: Thu Feb 11 16:47:12 2021 +0100
|
|
|
ae5d40 |
|
|
|
ae5d40 |
timemaster: Set uds_ro_address for ptp4l instances.
|
|
|
ae5d40 |
|
|
|
ae5d40 |
This prevents conflicts on the new UDS-RO port.
|
|
|
ae5d40 |
|
|
|
ae5d40 |
Signed-off-by: Miroslav Lichvar <mlichvar@redhat.com>
|
|
|
ae5d40 |
|
|
|
ae5d40 |
diff --git a/timemaster.c b/timemaster.c
|
|
|
ae5d40 |
index 00db59f..02408d6 100644
|
|
|
ae5d40 |
--- a/timemaster.c
|
|
|
ae5d40 |
+++ b/timemaster.c
|
|
|
ae5d40 |
@@ -712,7 +712,7 @@ static int add_ptp_source(struct ptp_domain *source,
|
|
|
ae5d40 |
char **ntp_config, struct script *script)
|
|
|
ae5d40 |
{
|
|
|
ae5d40 |
struct config_file *config_file;
|
|
|
ae5d40 |
- char **command, *uds_path, **interfaces, *message_tag;
|
|
|
ae5d40 |
+ char **command, *uds_path, *uds_path2, **interfaces, *message_tag;
|
|
|
ae5d40 |
char ts_interface[IF_NAMESIZE];
|
|
|
ae5d40 |
int i, j, num_interfaces, *phc, *phcs, hw_ts, sw_ts;
|
|
|
ae5d40 |
struct sk_ts_info ts_info;
|
|
|
ae5d40 |
@@ -809,6 +809,8 @@ static int add_ptp_source(struct ptp_domain *source,
|
|
|
ae5d40 |
|
|
|
ae5d40 |
uds_path = string_newf("%s/ptp4l.%d.socket",
|
|
|
ae5d40 |
config->rundir, *shm_segment);
|
|
|
ae5d40 |
+ uds_path2 = string_newf("%s/ptp4lro.%d.socket",
|
|
|
ae5d40 |
+ config->rundir, *shm_segment);
|
|
|
ae5d40 |
|
|
|
ae5d40 |
message_tag = string_newf("[%d", source->domain);
|
|
|
ae5d40 |
for (j = 0; interfaces[j]; j++)
|
|
|
ae5d40 |
@@ -832,8 +834,10 @@ static int add_ptp_source(struct ptp_domain *source,
|
|
|
ae5d40 |
"slaveOnly 1\n"
|
|
|
ae5d40 |
"domainNumber %d\n"
|
|
|
ae5d40 |
"uds_address %s\n"
|
|
|
ae5d40 |
+ "uds_ro_address %s\n"
|
|
|
ae5d40 |
"message_tag %s\n",
|
|
|
ae5d40 |
- source->domain, uds_path, message_tag);
|
|
|
ae5d40 |
+ source->domain, uds_path, uds_path2,
|
|
|
ae5d40 |
+ message_tag);
|
|
|
ae5d40 |
|
|
|
ae5d40 |
if (phcs[i] >= 0) {
|
|
|
ae5d40 |
/* HW time stamping */
|
|
|
ae5d40 |
@@ -868,6 +872,7 @@ static int add_ptp_source(struct ptp_domain *source,
|
|
|
ae5d40 |
|
|
|
ae5d40 |
free(message_tag);
|
|
|
ae5d40 |
free(uds_path);
|
|
|
ae5d40 |
+ free(uds_path2);
|
|
|
ae5d40 |
free(interfaces);
|
|
|
ae5d40 |
}
|
|
|
ae5d40 |
|