Skip to content

Commit

Permalink
Use the management message memory layout for the defaultDS.
Browse files Browse the repository at this point in the history
Reforming the data structure in this way will greatly simplify the
implementation of the management message for this data set.

Signed-off-by: Richard Cochran <[email protected]>
  • Loading branch information
richardcochran committed Nov 30, 2012
1 parent b26a36d commit d60ccc7
Show file tree
Hide file tree
Showing 6 changed files with 55 additions and 33 deletions.
17 changes: 11 additions & 6 deletions clock.c
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,8 @@ struct clock {
int fault_fd[CLK_N_PORTS];
time_t fault_timeout;
int nports; /* does not include the UDS port */
int free_running;
int freq_est_interval;
int utc_timescale;
tmv_t master_offset;
tmv_t path_delay;
Expand Down Expand Up @@ -398,7 +400,7 @@ UInteger8 clock_class(struct clock *c)
}

struct clock *clock_create(int phc_index, struct interface *iface, int count,
enum timestamp_type timestamping, struct defaultDS *ds,
enum timestamp_type timestamping, struct default_ds *dds,
enum servo_type servo)
{
int i, fadj = 0, max_adj = 0.0, sw_ts = timestamping == TS_SOFTWARE ? 1 : 0;
Expand All @@ -415,7 +417,10 @@ struct clock *clock_create(int phc_index, struct interface *iface, int count,
if (c->nports)
clock_destroy(c);

if (c->dds.free_running) {
c->free_running = dds->free_running;
c->freq_est_interval = dds->freq_est_interval;

if (c->free_running) {
c->clkid = CLOCK_INVALID;
} else if (phc_index >= 0) {
snprintf(phc, 31, "/dev/ptp%d", phc_index);
Expand Down Expand Up @@ -449,7 +454,7 @@ struct clock *clock_create(int phc_index, struct interface *iface, int count,
return NULL;
}

c->dds = *ds;
c->dds = dds->dds;

/* Initialize the parentDS. */
clock_update_grandmaster(c);
Expand Down Expand Up @@ -788,7 +793,7 @@ void clock_remove_fda(struct clock *c, struct port *p, struct fdarray fda)

int clock_slave_only(struct clock *c)
{
return c->dds.slaveOnly;
return c->dds.flags & DDS_SLAVE_ONLY;
}

UInteger16 clock_steps_removed(struct clock *c)
Expand Down Expand Up @@ -828,7 +833,7 @@ enum servo_state clock_synchronize(struct clock *c,
if (!c->path_delay)
return state;

if (c->dds.free_running)
if (c->free_running)
return clock_no_adjust(c);

adj = servo_sample(c->servo, c->master_offset, ingress, &state);
Expand All @@ -853,7 +858,7 @@ enum servo_state clock_synchronize(struct clock *c,

void clock_sync_interval(struct clock *c, int n)
{
int shift = c->dds.freq_est_interval - n;
int shift = c->freq_est_interval - n;

if (shift < 0)
shift = 0;
Expand Down
4 changes: 2 additions & 2 deletions clock.h
Original file line number Diff line number Diff line change
Expand Up @@ -65,12 +65,12 @@ UInteger8 clock_class(struct clock *c);
* @param interface An array of network interfaces.
* @param count The number of elements in @a interfaces.
* @param timestamping The timestamping mode for this clock.
* @param ds A pointer to a default data set for the clock.
* @param dds A pointer to a default data set for the clock.
* @param servo The servo that this clock will use.
* @return A pointer to the single global clock instance.
*/
struct clock *clock_create(int phc_index, struct interface *iface, int count,
enum timestamp_type timestamping, struct defaultDS *ds,
enum timestamp_type timestamping, struct default_ds *dds,
enum servo_type servo);

/**
Expand Down
19 changes: 13 additions & 6 deletions config.c
Original file line number Diff line number Diff line change
Expand Up @@ -153,7 +153,7 @@ static enum parser_result parse_global_setting(const char *option,
UInteger8 u8;
unsigned char mac[MAC_LEN];

struct defaultDS *dds = &cfg->dds;
struct defaultDS *dds = &cfg->dds.dds;
struct port_defaults *pod = &cfg->pod;

enum parser_result r;
Expand All @@ -165,13 +165,20 @@ static enum parser_result parse_global_setting(const char *option,
if (!strcmp(option, "twoStepFlag")) {
if (1 != sscanf(value, "%d", &val))
return BAD_VALUE;
dds->twoStepFlag = val ? 1 : 0;
if (val)
dds->flags |= DDS_TWO_STEP_FLAG;
else
dds->flags &= ~DDS_TWO_STEP_FLAG;

} else if (!strcmp(option, "slaveOnly")) {
if (1 != sscanf(value, "%d", &val))
return BAD_VALUE;
if (!(cfg_ignore & CFG_IGNORE_SLAVEONLY))
dds->slaveOnly = val ? 1 : 0;
if (!(cfg_ignore & CFG_IGNORE_SLAVEONLY)) {
if (val)
dds->flags |= DDS_SLAVE_ONLY;
else
dds->flags &= ~DDS_SLAVE_ONLY;
}

} else if (!strcmp(option, "priority1")) {
if (1 != sscanf(value, "%hhu", &u8))
Expand Down Expand Up @@ -207,12 +214,12 @@ static enum parser_result parse_global_setting(const char *option,
} else if (!strcmp(option, "free_running")) {
if (1 != sscanf(value, "%d", &val))
return BAD_VALUE;
dds->free_running = val ? 1 : 0;
cfg->dds.free_running = val ? 1 : 0;

} else if (!strcmp(option, "freq_est_interval")) {
if (1 != sscanf(value, "%d", &val) || !(val >= 0))
return BAD_VALUE;
dds->freq_est_interval = val;
cfg->dds.freq_est_interval = val;
pod->freq_est_interval = val;

} else if (!strcmp(option, "assume_two_step")) {
Expand Down
2 changes: 1 addition & 1 deletion config.h
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ struct config {
enum transport_type transport;
enum delay_mechanism dm;

struct defaultDS dds;
struct default_ds dds;
struct port_defaults pod;
int *assume_two_step;
int *tx_timestamp_retries;
Expand Down
16 changes: 12 additions & 4 deletions ds.h
Original file line number Diff line number Diff line change
Expand Up @@ -24,17 +24,25 @@

/* clock data sets */

#define DDS_TWO_STEP_FLAG (1<<0)
#define DDS_SLAVE_ONLY (1<<1)

struct defaultDS {
Boolean twoStepFlag;
Boolean slaveOnly;
UInteger8 flags;
UInteger8 reserved1;
UInteger16 numberPorts;
UInteger8 priority1;
struct ClockQuality clockQuality;
UInteger8 priority2;
struct ClockIdentity clockIdentity;
UInteger8 domainNumber;
int free_running;
int freq_est_interval; /*log seconds*/
UInteger8 reserved2;
} PACKED;

struct default_ds {
struct defaultDS dds;
int free_running;
int freq_est_interval; /*log seconds*/
};

struct dataset {
Expand Down
30 changes: 16 additions & 14 deletions ptp4l.c
Original file line number Diff line number Diff line change
Expand Up @@ -40,14 +40,15 @@ static int running = 1;

static struct config cfg_settings = {
.dds = {
.twoStepFlag = TRUE,
.slaveOnly = FALSE,
.priority1 = 128,
.clockQuality.clockClass = 248,
.clockQuality.clockAccuracy = 0xfe,
.clockQuality.offsetScaledLogVariance = 0xffff,
.priority2 = 128,
.domainNumber = 0,
.dds = {
.flags = DDS_TWO_STEP_FLAG,
.priority1 = 128,
.clockQuality.clockClass = 248,
.clockQuality.clockAccuracy = 0xfe,
.clockQuality.offsetScaledLogVariance = 0xffff,
.priority2 = 128,
.domainNumber = 0,
},
.free_running = 0,
.freq_est_interval = 1,
},
Expand Down Expand Up @@ -137,7 +138,7 @@ int main(int argc, char *argv[])
enum transport_type *transport = &cfg_settings.transport;
enum timestamp_type *timestamping = &cfg_settings.timestamping;
struct clock *clock;
struct defaultDS *ds = &cfg_settings.dds;
struct defaultDS *ds = &cfg_settings.dds.dds;
int phc_index = -1, required_modes = 0;

if (SIG_ERR == signal(SIGINT, handle_int_quit_term)) {
Expand Down Expand Up @@ -205,7 +206,7 @@ int main(int argc, char *argv[])
req_phc = optarg;
break;
case 's':
ds->slaveOnly = TRUE;
ds->flags |= DDS_SLAVE_ONLY;
*cfg_ignore |= CFG_IGNORE_SLAVEONLY;
break;
case 'l':
Expand Down Expand Up @@ -235,7 +236,7 @@ int main(int argc, char *argv[])
if (config && (c = config_read(config, &cfg_settings))) {
return c;
}
if (ds->slaveOnly) {
if (ds->flags & DDS_SLAVE_ONLY) {
ds->clockQuality.clockClass = 255;
}

Expand All @@ -256,7 +257,7 @@ int main(int argc, char *argv[])
return -1;
}

if (!ds->twoStepFlag) {
if (!(ds->flags & DDS_TWO_STEP_FLAG)) {
switch (*timestamping) {
case TS_SOFTWARE:
case TS_LEGACY_HW:
Expand Down Expand Up @@ -302,7 +303,7 @@ int main(int argc, char *argv[])
}

/* determine PHC Clock index */
if (ds->free_running) {
if (cfg_settings.dds.free_running) {
phc_index = -1;
} else if (*timestamping == TS_SOFTWARE || *timestamping == TS_LEGACY_HW) {
phc_index = -1;
Expand Down Expand Up @@ -330,7 +331,8 @@ int main(int argc, char *argv[])
}

clock = clock_create(phc_index, iface, cfg_settings.nports,
*timestamping, ds, cfg_settings.clock_servo);
*timestamping, &cfg_settings.dds,
cfg_settings.clock_servo);
if (!clock) {
fprintf(stderr, "failed to create a clock\n");
return -1;
Expand Down

0 comments on commit d60ccc7

Please sign in to comment.