Merge the configurable UDS server path branch.

master
Richard Cochran 2013-10-26 18:14:37 +02:00
commit 25cf96d4ca
13 changed files with 161 additions and 20 deletions

View File

@ -576,7 +576,7 @@ struct clock *clock_create(int phc_index, struct interface *iface, int count,
struct interface udsif; struct interface udsif;
memset(&udsif, 0, sizeof(udsif)); memset(&udsif, 0, sizeof(udsif));
snprintf(udsif.name, sizeof(udsif.name), UDS_PATH); snprintf(udsif.name, sizeof(udsif.name), "%s", uds_path);
udsif.transport = TRANS_UDS; udsif.transport = TRANS_UDS;
srandom(time(NULL)); srandom(time(NULL));

View File

@ -393,6 +393,11 @@ static enum parser_result parse_global_setting(const char *option,
return r; return r;
*cfg->udp6_scope = uval; *cfg->udp6_scope = uval;
} else if (!strcmp(option, "uds_address")) {
if (strlen(value) > MAX_IFNAME_SIZE)
return OUT_OF_RANGE;
strncpy(cfg->uds_address, value, MAX_IFNAME_SIZE);
} else if (!strcmp(option, "logging_level")) { } else if (!strcmp(option, "logging_level")) {
r = get_ranged_int(value, &val, r = get_ranged_int(value, &val,
PRINT_LEVEL_MIN, PRINT_LEVEL_MAX); PRINT_LEVEL_MIN, PRINT_LEVEL_MAX);

View File

@ -27,7 +27,7 @@
#include "sk.h" #include "sk.h"
#define MAX_PORTS 8 #define MAX_PORTS 8
#define MAX_IFNAME_SIZE 16 #define MAX_IFNAME_SIZE 108 /* = UNIX_PATH_MAX */
/** Defines a network interface, with PTP options. */ /** Defines a network interface, with PTP options. */
struct interface { struct interface {
@ -89,6 +89,7 @@ struct config {
unsigned char *ptp_dst_mac; unsigned char *ptp_dst_mac;
unsigned char *p2p_dst_mac; unsigned char *p2p_dst_mac;
unsigned char *udp6_scope; unsigned char *udp6_scope;
char *uds_address;
int print_level; int print_level;
int use_syslog; int use_syslog;

View File

@ -59,6 +59,7 @@ transportSpecific 0x0
ptp_dst_mac 01:1B:19:00:00:00 ptp_dst_mac 01:1B:19:00:00:00
p2p_dst_mac 01:80:C2:00:00:0E p2p_dst_mac 01:80:C2:00:00:0E
udp6_scope 0x0E udp6_scope 0x0E
uds_address /var/run/ptp4l
# #
# Default interface options # Default interface options
# #

View File

@ -57,6 +57,7 @@ clock_servo pi
transportSpecific 0x1 transportSpecific 0x1
ptp_dst_mac 01:80:C2:00:00:0E ptp_dst_mac 01:80:C2:00:00:0E
p2p_dst_mac 01:80:C2:00:00:0E p2p_dst_mac 01:80:C2:00:00:0E
uds_address /var/run/ptp4l
# #
# Default interface options # Default interface options
# #

71
incdefs.sh 100755
View File

@ -0,0 +1,71 @@
#!/bin/sh
#
# Discover the CFLAGS to use during compilation.
#
# Copyright (C) 2013 Richard Cochran <richardcochran@gmail.com>
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License along
# with this program; if not, write to the Free Software Foundation, Inc.,
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
#
# Look for the clock_adjtime functional prototype in the C library.
#
user_flags()
{
dirs=$(echo "" | ${CROSS_COMPILE}cpp -Wp,-v 2>&1 >/dev/null | grep ^" /")
for d in $dirs; do
files=$(find $d -type f -name time.h)
for f in $files; do
if grep -q clock_adjtime $f; then
printf " -D_GNU_SOURCE -DHAVE_CLOCK_ADJTIME"
return
fi
done
done
}
#
# Find the most appropriate kernel header for the SIOCSHWTSTAMP ioctl.
#
# 1. custom kernel or cross build using KBUILD_OUTPUT
# 2. sanitized headers installed under /lib/modules/`uname -r`/build
# 3. normal build using standard system headers
#
kernel_flags()
{
prefix=""
tstamp=/usr/include/linux/net_tstamp.h
if [ "x$KBUILD_OUTPUT" != "x" ]; then
# With KBUILD_OUTPUT set, we are building against
# either a custom kernel or a cross compiled kernel.
build=${KBUILD_OUTPUT}
else
# If the currently running kernel is a custom build
# with the headers installed, then we should use them.
build=/lib/modules/`uname -r`/build
fi
if [ -f ${build}${tstamp} ]; then
prefix=${build}
printf " -I%s/usr/include" $prefix
fi
if grep -q HWTSTAMP_TX_ONESTEP_SYNC ${prefix}${tstamp}; then
printf " -DHAVE_ONESTEP_SYNC"
fi
}
flags="$(user_flags)$(kernel_flags)"
echo "$flags"

View File

@ -15,21 +15,12 @@
# with this program; if not, write to the Free Software Foundation, Inc., # with this program; if not, write to the Free Software Foundation, Inc.,
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
KBUILD_OUTPUT ?= /lib/modules/$(shell uname -r)/build KBUILD_OUTPUT =
FEAT_CFLAGS :=
ifneq ($(shell grep --no-messages clock_adjtime /usr/include/bits/time.h),)
FEAT_CFLAGS += -D_GNU_SOURCE -DHAVE_CLOCK_ADJTIME
endif
ifneq ($(shell grep --no-messages HWTSTAMP_TX_ONESTEP_SYNC $(KBUILD_OUTPUT)/usr/include/linux/net_tstamp.h),)
FEAT_CFLAGS += -DHAVE_ONESTEP_SYNC
endif
DEBUG = DEBUG =
CC = $(CROSS_COMPILE)gcc CC = $(CROSS_COMPILE)gcc
INC = -I$(KBUILD_OUTPUT)/usr/include
VER = -DVER=$(version) VER = -DVER=$(version)
CFLAGS = -Wall $(VER) $(INC) $(DEBUG) $(FEAT_CFLAGS) $(EXTRA_CFLAGS) CFLAGS = -Wall $(VER) $(incdefs) $(DEBUG) $(EXTRA_CFLAGS)
LDLIBS = -lm -lrt $(EXTRA_LDFLAGS) LDLIBS = -lm -lrt $(EXTRA_LDFLAGS)
PRG = ptp4l pmc phc2sys hwstamp_ctl PRG = ptp4l pmc phc2sys hwstamp_ctl
OBJ = bmc.o clock.o clockadj.o config.o fault.o fsm.o ptp4l.o mave.o \ OBJ = bmc.o clock.o clockadj.o config.o fault.o fsm.o ptp4l.o mave.o \
@ -40,6 +31,7 @@ OBJECTS = $(OBJ) hwstamp_ctl.o phc2sys.o pmc.o pmc_common.o sysoff.o
SRC = $(OBJECTS:.o=.c) SRC = $(OBJECTS:.o=.c)
DEPEND = $(OBJECTS:.o=.d) DEPEND = $(OBJECTS:.o=.d)
srcdir := $(dir $(lastword $(MAKEFILE_LIST))) srcdir := $(dir $(lastword $(MAKEFILE_LIST)))
incdefs := $(shell $(srcdir)/incdefs.sh)
version := $(shell $(srcdir)/version.sh $(srcdir)) version := $(shell $(srcdir)/version.sh $(srcdir))
VPATH = $(srcdir) VPATH = $(srcdir)

55
pmc.8
View File

@ -1,4 +1,4 @@
.TH PMC 8 "July 2013" "linuxptp" .TH PMC 8 "October 2013" "linuxptp"
.SH NAME .SH NAME
pmc \- PTP management client pmc \- PTP management client
@ -19,6 +19,8 @@ pmc \- PTP management client
] [ ] [
.BI \-i " interface" .BI \-i " interface"
] [ ] [
.BI \-s " uds-address"
] [
.BI \-t " transport-specific-field" .BI \-t " transport-specific-field"
] [ ] [
.B \-v .B \-v
@ -41,6 +43,11 @@ updates the specified information and
.BR COMMAND ) .BR COMMAND )
initiates the specified event. initiates the specified event.
By default the management commands are addressed to all ports. The
.B TARGET
command can be used to select a particular clock and port for the
subsequent messages.
Command Command
.B help .B help
can be used to get a list of supported actions and management IDs. can be used to get a list of supported actions and management IDs.
@ -69,6 +76,10 @@ Specify the domain number in sent messages. The default is 0.
Specify the network interface. The default is /var/run/pmc for the Unix Domain Specify the network interface. The default is /var/run/pmc for the Unix Domain
Socket transport and eth0 for the other transports. Socket transport and eth0 for the other transports.
.TP .TP
.BI \-s " uds-address"
Specifies the address of the server's UNIX domain socket.
The default is /var/run/ptp4l.
.TP
.BI \-t " transport-specific-field" .BI \-t " transport-specific-field"
Specify the transport specific field in sent messages as a hexadecimal number. Specify the transport specific field in sent messages as a hexadecimal number.
The default is 0x0. The default is 0x0.
@ -88,12 +99,52 @@ length TLV values instead.
.SH MANAGEMENT IDS .SH MANAGEMENT IDS
.TP
.B ANNOUNCE_RECEIPT_TIMEOUT
.TP
.B CLOCK_ACCURACY
.TP
.B CLOCK_DESCRIPTION
.TP .TP
.B CURRENT_DATA_SET .B CURRENT_DATA_SET
.TP .TP
.B DEFAULT_DATA_SET
.TP
.B DELAY_MECHANISM
.TP
.B DOMAIN
.TP
.B GRANDMASTER_SETTINGS_NP
.TP
.B LOG_ANNOUNCE_INTERVAL
.TP
.B LOG_MIN_PDELAY_REQ_INTERVAL
.TP
.B LOG_SYNC_INTERVAL
.TP
.B NULL_MANAGEMENT
.TP
.B PARENT_DATA_SET
.TP
.B PORT_DATA_SET
.TP
.B PRIORITY1
.TP
.B PRIORITY2
.TP
.B SLAVE_ONLY
.TP
.B TIMESCALE_PROPERTIES
.TP
.B TIME_PROPERTIES_DATA_SET
.TP
.B TIME_STATUS_NP .B TIME_STATUS_NP
.TP .TP
.B NULL_MANAGEMENT .B TRACEABILITY_PROPERTIES
.TP
.B USER_DESCRIPTION
.TP
.B VERSION_NUMBER
.SH SEE ALSO .SH SEE ALSO
.BR ptp4l (8) .BR ptp4l (8)

12
pmc.c
View File

@ -31,6 +31,7 @@
#include "pmc_common.h" #include "pmc_common.h"
#include "print.h" #include "print.h"
#include "tlv.h" #include "tlv.h"
#include "uds.h"
#include "util.h" #include "util.h"
#include "version.h" #include "version.h"
@ -676,6 +677,7 @@ static void usage(char *progname)
" -h prints this message and exits\n" " -h prints this message and exits\n"
" -i [dev] interface device to use, default 'eth0'\n" " -i [dev] interface device to use, default 'eth0'\n"
" for network and '/var/run/pmc' for UDS.\n" " for network and '/var/run/pmc' for UDS.\n"
" -s [path] server address for UDS, default '/var/run/ptp4l'.\n"
" -t [hex] transport specific field, default 0x0\n" " -t [hex] transport specific field, default 0x0\n"
" -v prints the software version and exits\n" " -v prints the software version and exits\n"
" -z send zero length TLV values with the GET actions\n" " -z send zero length TLV values with the GET actions\n"
@ -697,7 +699,7 @@ int main(int argc, char *argv[])
/* Process the command line arguments. */ /* Process the command line arguments. */
progname = strrchr(argv[0], '/'); progname = strrchr(argv[0], '/');
progname = progname ? 1+progname : argv[0]; progname = progname ? 1+progname : argv[0];
while (EOF != (c = getopt(argc, argv, "246u""b:d:hi:t:vz"))) { while (EOF != (c = getopt(argc, argv, "246u""b:d:hi:s:t:vz"))) {
switch (c) { switch (c) {
case '2': case '2':
transport_type = TRANS_IEEE_802_3; transport_type = TRANS_IEEE_802_3;
@ -720,6 +722,14 @@ int main(int argc, char *argv[])
case 'i': case 'i':
iface_name = optarg; iface_name = optarg;
break; break;
case 's':
if (strlen(optarg) > MAX_IFNAME_SIZE) {
fprintf(stderr, "path %s too long, max is %d\n",
optarg, MAX_IFNAME_SIZE);
return -1;
}
strncpy(uds_path, optarg, MAX_IFNAME_SIZE);
break;
case 't': case 't':
if (1 == sscanf(optarg, "%x", &c)) if (1 == sscanf(optarg, "%x", &c))
transport_specific = c << 4; transport_specific = c << 4;

View File

@ -1,4 +1,4 @@
.TH PTP4l 8 "July 2013" "linuxptp" .TH PTP4l 8 "October 2013" "linuxptp"
.SH NAME .SH NAME
ptp4l \- PTP Boundary/Ordinary Clock ptp4l \- PTP Boundary/Ordinary Clock
@ -354,6 +354,10 @@ will be used as the second byte of the primary address. This option
is only relevant with IPv6 transport. See RFC 4291. The default is is only relevant with IPv6 transport. See RFC 4291. The default is
0x0E for the global scope. 0x0E for the global scope.
.TP .TP
.B uds_address
Specifies the address of the UNIX domain socket for receiving local
management messages. The default is /var/run/ptp4l.
.TP
.B logging_level .B logging_level
The maximum logging level of messages which should be printed. The maximum logging level of messages which should be printed.
The default is 6 (LOG_INFO). The default is 6 (LOG_INFO).

View File

@ -32,6 +32,7 @@
#include "sk.h" #include "sk.h"
#include "transport.h" #include "transport.h"
#include "udp6.h" #include "udp6.h"
#include "uds.h"
#include "util.h" #include "util.h"
#include "version.h" #include "version.h"
@ -111,6 +112,7 @@ static struct config cfg_settings = {
.ptp_dst_mac = ptp_dst_mac, .ptp_dst_mac = ptp_dst_mac,
.p2p_dst_mac = p2p_dst_mac, .p2p_dst_mac = p2p_dst_mac,
.udp6_scope = &udp6_scope, .udp6_scope = &udp6_scope,
.uds_address = uds_path,
.print_level = LOG_INFO, .print_level = LOG_INFO,
.use_syslog = 1, .use_syslog = 1,

6
uds.c
View File

@ -30,6 +30,8 @@
#include "transport_private.h" #include "transport_private.h"
#include "uds.h" #include "uds.h"
char uds_path[MAX_IFNAME_SIZE + 1] = "/var/run/ptp4l";
#define UDS_FILEMODE (S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP) /*0660*/ #define UDS_FILEMODE (S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP) /*0660*/
struct uds { struct uds {
@ -58,7 +60,7 @@ static int uds_open(struct transport *t, char *name, struct fdarray *fda,
} }
memset(&sa, 0, sizeof(sa)); memset(&sa, 0, sizeof(sa));
sa.sun_family = AF_LOCAL; sa.sun_family = AF_LOCAL;
strcpy(sa.sun_path, name); strncpy(sa.sun_path, name, sizeof(sa.sun_path) - 1);
unlink(name); unlink(name);
@ -72,7 +74,7 @@ static int uds_open(struct transport *t, char *name, struct fdarray *fda,
/* For client use, pre load the server path. */ /* For client use, pre load the server path. */
memset(&sa, 0, sizeof(sa)); memset(&sa, 0, sizeof(sa));
sa.sun_family = AF_LOCAL; sa.sun_family = AF_LOCAL;
strcpy(sa.sun_path, UDS_PATH); strncpy(sa.sun_path, uds_path, sizeof(sa.sun_path) - 1);
uds->sa = sa; uds->sa = sa;
uds->len = sizeof(sa); uds->len = sizeof(sa);

3
uds.h
View File

@ -20,13 +20,14 @@
#ifndef HAVE_UDS_H #ifndef HAVE_UDS_H
#define HAVE_UDS_H #define HAVE_UDS_H
#include "config.h"
#include "fd.h" #include "fd.h"
#include "transport.h" #include "transport.h"
/** /**
* Address of the server. * Address of the server.
*/ */
#define UDS_PATH "/var/run/ptp4l" extern char uds_path[MAX_IFNAME_SIZE + 1];
/** /**
* Allocate an instance of a UDS transport. * Allocate an instance of a UDS transport.