Commit fb26d591 authored by Jean-Claude BAU's avatar Jean-Claude BAU Committed by Adam Wujek

PPS configuration enhancement

- New  parameters added
- Parameter check with min/max values
- Updated fied mask suppressed: At startup the conf structure in each
ppsi instance must be initialized with the default values.
parent 5dd8ccf3
......@@ -189,6 +189,10 @@ int main(int argc, char **argv)
fprintf(stderr, "ppsi: out of memory\n");
exit(1);
}
/* Set default configuration value for all instances */
for (i = 0; i < ppg->max_links; i++) {
memcpy(INST(ppg, i), &__pp_default_instance_cfg,sizeof(__pp_default_instance_cfg));
}
/* Set offset here, so config parsing can override it */
if (adjtimex(&t) >= 0) {
......
......@@ -19,22 +19,49 @@
#define PP_DEFAULT_FLAGS 0
#define PP_DEFAULT_ROLE PPSI_ROLE_AUTO
#define PP_DEFAULT_PROTO PPSI_PROTO_UDP /* overridden by arch */
#define PP_DEFAULT_DOMAIN_NUMBER 0
#define PP_DEFAULT_AP 10
#define PP_DEFAULT_AI 1000
#define PP_DEFAULT_DELAY_S 6
#define PP_MIN_DOMAIN_NUMBER 0
#define PP_MAX_DOMAIN_NUMBER 255
#define PP_DEFAULT_DOMAIN_NUMBER 0
#define PP_DEFAULT_ANNOUNCE_INTERVAL 1 /* 0 in 802.1AS */
#define PP_DEFAULT_DELAYREQ_INTERVAL 0
#define PP_DEFAULT_SYNC_INTERVAL 0 /* -7 in 802.1AS */
#define PP_DEFAULT_SYNC_RECEIPT_TIMEOUT 3
#define PP_MIN_ANNOUNCE_INTERVAL 0
#define PP_MAX_ANNOUNCE_INTERVAL 4
#define PP_DEFAULT_ANNOUNCE_RECEIPT_TIMEOUT 3 /* 3 by default */
#define PP_MIN_ANNOUNCE_RECEIPT_TIMEOUT 2
#define PP_MAX_ANNOUNCE_RECEIPT_TIMEOUT 255
#define PP_DEFAULT_MIN_DELAY_REQ_INTERVAL 0
#define PP_MIN_MIN_DELAY_REQ_INTERVAL 0
#define PP_MAX_MIN_DELAY_REQ_INTERVAL 5
#define PP_DEFAULT_MIN_PDELAY_REQ_INTERVAL 0
#define PP_MIN_MIN_PDELAY_REQ_INTERVAL 0
#define PP_MAX_MIN_PDELAY_REQ_INTERVAL 5
#define PP_DEFAULT_SYNC_INTERVAL 0 /* -7 in 802.1AS */
#define PP_MIN_SYNC_INTERVAL -1
#define PP_MAX_SYNC_INTERVAL 1
#define PP_DEFAULT_UTC_OFFSET 37
#define PP_MIN_PRIORITY1 0
#define PP_MAX_PRIORITY1 255
#define PP_DEFAULT_PRIORITY1 128
#define PP_MIN_PRIORITY2 0
#define PP_MAX_PRIORITY2 255
#define PP_DEFAULT_PRIORITY2 128
#define PP_DEFAULT_EXT_PORT_CONFIG_ENABLE 0
/* Clock classes (pag 55, PTP-2008). See ppsi-manual for an explanation */
#define PP_CLASS_SLAVE_ONLY 255
#define PP_CLASS_DEFAULT 248
#define PP_MIN_CLOCK_CLASS 0
#define PP_MAX_CLOCK_CLASS 255
#define PP_CLASS_SLAVE_ONLY 255
#define PP_CLASS_DEFAULT 248
#define PP_PTP_CLASS_GM_LOCKED 6
#define PP_PTP_CLASS_GM_HOLDOVER 7
#define PP_PTP_CLASS_GM_UNLOCKED 52
......@@ -42,7 +69,9 @@
#define PP_ARB_CLASS_GM_HOLDOVER 14
#define PP_ARB_CLASS_GM_UNLOCKED 58
#define PP_ACCURACY_DEFAULT 0xFE
#define PP_MIN_CLOCK_ACCURACY 0
#define PP_MAX_CLOCK_ACCURACY 255
#define PP_ACCURACY_DEFAULT 0xFE
#define PP_PTP_ACCURACY_GM_LOCKED 0x21
#define PP_PTP_ACCURACY_GM_HOLDOVER 0x21
#define PP_PTP_ACCURACY_GM_UNLOCKED 0xFE
......@@ -50,7 +79,9 @@
#define PP_ARB_ACCURACY_GM_HOLDOVER 0x21
#define PP_ARB_ACCURACY_GM_UNLOCKED 0xFE
#define PP_VARIANCE_DEFAULT 0xC71D
#define PP_MIN_CLOCK_VARIANCE 0
#define PP_MAX_CLOCK_VARIANCE 65535
#define PP_VARIANCE_DEFAULT 0xC71D
#define PP_PTP_VARIANCE_GM_LOCKED 0xB900
#define PP_PTP_VARIANCE_GM_HOLDOVER 0xC71D
#define PP_PTP_VARIANCE_GM_UNLOCKED 0xC71D
......@@ -90,6 +121,7 @@ enum pp_timeouts {
#define PP_ALTERNATE_MASTER_FLAG 1
#define PP_TWO_STEP_FLAG 2
#define PP_VERSION_PTP 2
#define PP_MINOR_VERSION_PTP 1
#define PP_HEADER_LENGTH 34
#define PP_ANNOUNCE_LENGTH 64
......
......@@ -21,8 +21,6 @@ struct pp_runtime_opts {
int flags; /* see below */
Integer16 ap, ai;
Integer16 s;
Integer8 logAnnounceInterval;
int logSyncInterval;
int priority1;
int priority2;
int domainNumber;
......@@ -42,9 +40,9 @@ struct pp_runtime_opts {
/* We need a globally-accessible structure with preset defaults */
/* We need globally-accessible structures with preset defaults */
extern struct pp_runtime_opts __pp_default_rt_opts;
extern struct pp_instance_cfg __pp_default_instance_cfg;
/*
* Communication channel. Is the abstraction of a unix socket, so that
* this struct is platform independent
......@@ -130,18 +128,26 @@ enum { /* The two sockets. They are called "net path" for historical reasons */
/*
* Struct containg the result of ppsi.conf parsing: one for each link
* (see lib/conf.c). Actually, protocol and role are in the main ppi.
* (see lib/conf.c). Actually, protocol are in the main ppi.
*/
struct pp_instance_cfg {
uint32_t updated_fields_mask;
char port_name[16];
char port_name[16];
char iface_name[16];
int profile; /* PPSI_PROFILE_PTP, PPSI_PROFILE_WR, PPSI_PROFILE_HA */
int delayMechanism; /* Should be enum ENDelayMechanism but forced to int for configuration parsing */
int64_t egressLatency_ps;
int64_t ingressLatency_ps;
int64_t constantAsymmetry_ps;
double delayCoefficient;
int announce_interval; /* Announce messages interval */
int announce_receipt_timeout; /* Announce interval receipt timeout*/
int sync_interval; /* Sync messages interval */
int min_delay_req_interval; /* delay request messages interval */
int min_pdelay_req_interval;/* pdelay request messages interval */
int l1sync_interval; /* L1SYNC/HA: l1sync messages interval */
int l1sync_receipt_timeout; /* L1SYNC/HA: l1sync messages receipttimeout */
int64_t egressLatency_ps; /* egressLatency in picos */
int64_t ingressLatency_ps; /* ingressLatency in picos */
int64_t constantAsymmetry_ps; /* constantAsymmetry in picos */
double delayCoefficient; /* fiber delay coefficient as a double */
int desiredState; /* externalPortConfigurationPortDS.desiredState */
Boolean masterOnly; /* masterOnly */
};
/*
......@@ -157,8 +163,7 @@ struct pp_instance {
struct pp_ext_hooks *ext_hooks; /* if protocol ext needs it */
unsigned long d_flags; /* diagnostics, ppi-specific flags */
unsigned char flags; /* protocol flags (see below) */
int role, /* same as in config file */
proto; /* same as in config file */
int proto; /* same as in config file */
int delayMechanism; /* same as in config file */
/* Pointer to global instance owning this pp_instance*/
......@@ -222,7 +227,9 @@ struct pp_instance {
unsigned long ptp_tx_count;
unsigned long ptp_rx_count;
};
/* The following things used to be bit fields. Other flags are now enums */
#define PPI_FLAG_WAITING_FOR_F_UP 0x02
#define PPI_FLAG_WAITING_FOR_RF_UP 0x04
......
......@@ -11,6 +11,7 @@
#include <stdint.h>
#include <stdarg.h>
#include <float.h>
#include <stddef.h>
#include <ppsi/lib.h>
#include <ppsi/ieee1588_types.h>
......@@ -215,7 +216,6 @@ extern struct pp_network_operations DEFAULT_NET_OPS;
/* These can be liked and used as fallback by a different timing engine */
extern struct pp_network_operations unix_net_ops;
/*
* Time operations, like network operations above, are encapsulated.
* They may live in their own time-<name> subdirectory.
......@@ -317,43 +317,47 @@ enum pp_argtype {
ARG_INT64
};
/* This enumeration gives the list of instance options that should be marked when they are set in the configuration */
enum {
OPT_INST_NO_UPDATE=0,
OPT_INST_UPDATE_DESIRED_STATE, /* desiredState default value for HA is PASSIVE */
};
/* This enumeration gives the list of run-time options that should be marked when they are set in the configuration */
enum {
OPT_RT_NO_UPDATE=0,
};
typedef struct {
union min {
int min_int;
Integer64 min_int64;
double min_double;
}min;
union max{
int max_int;
Integer64 max_int64;
double max_double;
}max;
}pp_argline_min_max_t;
struct pp_argline {
cfg_handler f;
char *keyword; /* Each line starts with a keyword */
enum pp_argtype t;
struct pp_argname *args;
size_t field_offset;
size_t updated_field_offset;
int updated_field_index; /* 0=not used , >0 = used to build bit mask 1<(index-1) */
int needs_port;
pp_argline_min_max_t min_max;
};
/* Below are macros for setting up pp_argline arrays */
#define OFFS(s,f) offsetof(s, f)
#define OPTION(s,func,k,typ,a,field,ufield,findex,np) \
{ \
#define OPTION_OPEN() {
#define OPTION_CLOSE() }
#define OPTION(s,func,k,typ,a,field,np) \
.f = func, \
.keyword = k, \
.t = typ, \
.args = a, \
.field_offset = OFFS(s,field), \
.updated_field_offset=OFFS(s,ufield), \
.updated_field_index=findex,\
.needs_port = np, \
}
.needs_port = np,
#define LEGACY_OPTION(func,k,typ) \
{ \
......@@ -362,61 +366,86 @@ struct pp_argline {
.t = typ, \
}
#define INST_OPTION(func,k,t,a,field,field_index) \
OPTION(struct pp_instance,func,k,t,a,field,cfg.updated_fields_mask,field_index,1)
#define INST_OPTION(func,k,t,a,field) \
OPTION_OPEN() \
OPTION(struct pp_instance,func,k,t,a,field,1) \
OPTION_CLOSE()
#define INST_OPTION_FCT(func,k,t) \
OPTION_OPEN() \
OPTION(struct pp_instance,func,k,t,NULL,cfg,1) \
OPTION_CLOSE()
#define INST_OPTION_INT_TRACK(k,t,a,field,field_index) \
INST_OPTION(f_simple_int,k,t,a,field,field_index)
#define INST_OPTION_STR(k,field) \
INST_OPTION(f_string,k,ARG_STR,NULL,field)
#define INST_OPTION_INT_RANGE(k,t,a,field,mn,mx) \
OPTION_OPEN() \
OPTION(struct pp_instance,f_simple_int,k,t,a,field,1) \
.min_max.min.min_int = mn,\
.min_max.max.max_int = mx,\
OPTION_CLOSE()
#define INST_OPTION_INT(k,t,a,field) \
INST_OPTION_INT_TRACK(k,t,a,field,OPT_INST_NO_UPDATE)
INST_OPTION_INT_RANGE(k,t,a,field,INT_MIN,INT_MAX)
#define INST_OPTION_BOOL_TRACK(k,field,field_index) \
INST_OPTION(f_simple_bool,k,ARG_NAMES,arg_bool,field,field_index)
#define INST_OPTION_BOOL(k,field) \
INST_OPTION_BOOL_TRACK(k,field,OPT_INST_NO_UPDATE)
INST_OPTION(f_simple_bool,k,ARG_NAMES,arg_bool,field)
#define INST_OPTION_INT64_TRACK(k,t,a,field,field_index) \
INST_OPTION(f_simple_int64,k,t,a,field,field_index)
#define INST_OPTION_INT64_RANGE(k,t,a,field,mn,mx) \
OPTION_OPEN() \
OPTION(struct pp_instance,f_simple_int64,k,t,a,field,1) \
.min_max.min.min_int64 = mn,\
.min_max.max.max_int64 = mx,\
OPTION_CLOSE()
#define INST_OPTION_INT64(k,t,a,field) \
INST_OPTION_INT64_TRACK(k,t,a,field,OPT_INST_NO_UPDATE)
INST_OPTION_INT64_RANGE(k,t,a,field,INT64_MIN,INT64_MAX)
#define INST_OPTION_DOUBLE_TRACK(k,t,a,field,field_index) \
INST_OPTION(f_simple_double,k,t,a,field,field_index)
#define INST_OPTION_DOUBLE_RANGE(k,t,a,field,mn,mx) \
OPTION_OPEN() \
OPTION(struct pp_instance,f_simple_double,k,t,a,field,1) \
.min_max.min.min_double = mn,\
.min_max.max.max_double = mx,\
OPTION_CLOSE()
#define INST_OPTION_DOUBLE(k,t,a,field) \
INST_OPTION_DOUBLE_TRACK(k,t,a,field,OPT_INST_NO_UPDATE)
INST_OPTION_DOUBLE_RANGE(k,t,a,field,DBL_MIN,DBL_MAX)
#define RT_OPTION(func,k,t,a,field,field_index) \
OPTION(struct pp_runtime_opts,func,k,t,a,field,updated_fields_mask,field_index,0)
#define GLOB_OPTION(func,k,t,a,field) \
OPTION(struct pp_globals,func,k,t,a,field,field,0,0)
#define RT_OPTION(func,k,t,a,field) \
OPTION_OPEN() \
OPTION(struct pp_runtime_opts,func,k,t,a,field,0)\
OPTION_CLOSE()
#define RT_OPTION_INT_TRACK(k,t,a,field,field_index) \
RT_OPTION(f_simple_int,k,t,a,field,field_index)
#define RT_OPTION_INT_RANGE(k,t,a,field,mn,mx) \
OPTION_OPEN() \
OPTION(struct pp_runtime_opts,f_simple_int,k,t,a,field,0) \
.min_max.min.min_int = mn,\
.min_max.max.max_int = mx,\
OPTION_CLOSE()
#define RT_OPTION_INT(k,t,a,field) \
RT_OPTION_INT_TRACK(k,t,a,field,OPT_RT_NO_UPDATE)
#define RT_OPTION_BOOL_TRACK(k,field,field_index) \
RT_OPTION(f_simple_bool,k,ARG_NAMES,arg_bool,field,field_index)
RT_OPTION_INT_RANGE(k,t,a,field,INT_MIN,INT_MAX)
#define RT_OPTION_BOOL(k,field) \
RT_OPTION(f_simple_bool,k,ARG_NAMES,arg_bool,field,OPT_RT_NO_UPDATE)
RT_OPTION(f_simple_bool,k,ARG_NAMES,arg_bool,field)
#define GLOB_OPTION_INT(k,t,a,field) \
GLOB_OPTION(f_simple_int,k,t,a,field)
#define IS_INST_OPTION_UPDATED(ppi, index) \
(( ppi->cfg.updated_fields_mask & (1 << (index-1)))!=0 )
#define GLOB_OPTION(func,k,t,a,field) \
OPTION_OPEN() \
OPTION(struct pp_globals,func,k,t,a,field,0) \
OPTION_CLOSE()
#define IS_RT_OPTION_UPDATED(ppg, index) \
(( ppg->rt_opts.updated_fields_mask & (1 << (index-1)))!=0 )
#define GLOB_OPTION_INT_RANGE(k,t,a,field,mn,mx) \
OPTION_OPEN() \
OPTION(struct pp_globals,f_simple_int,k,t,a,field,0) \
.min_max.min.min_int = mn,\
.min_max.max.max_int = mx,\
OPTION_CLOSE()
#define GLOB_OPTION_INT(k,t,a,field) \
GLOB_OPTION_INT_RANGE(k,t,a,field,INT_MIN,INT_MAX)
/* Both the architecture and the extension can provide config arguments */
extern struct pp_argline pp_arch_arglines[];
......
This diff is collapsed.
......@@ -21,12 +21,33 @@ struct pp_runtime_opts __pp_default_rt_opts = {
.ap = PP_DEFAULT_AP,
.ai = PP_DEFAULT_AI,
.s = PP_DEFAULT_DELAY_S,
.logAnnounceInterval = PP_DEFAULT_ANNOUNCE_INTERVAL,
.logSyncInterval = PP_DEFAULT_SYNC_INTERVAL,
.priority1 = PP_DEFAULT_PRIORITY1,
.priority2 = PP_DEFAULT_PRIORITY2,
.domainNumber = PP_DEFAULT_DOMAIN_NUMBER,
.ttl = PP_DEFAULT_TTL,
.externalPortConfigurationEnabled = PP_DEFAULT_EXT_PORT_CONFIG_ENABLE,
};
/* Default values used to fill configurable parameters associated to each instance */
/* These parameters can be then overwritten with the config file ppsi.conf */
struct pp_instance_cfg __pp_default_instance_cfg = {
.profile=PPSI_PROFILE_PTP,
.delayMechanism=E2E,
.announce_interval=PP_DEFAULT_ANNOUNCE_INTERVAL,
.announce_receipt_timeout=PP_DEFAULT_ANNOUNCE_RECEIPT_TIMEOUT,
.sync_interval=PP_DEFAULT_SYNC_INTERVAL,
.min_delay_req_interval=PP_DEFAULT_MIN_DELAY_REQ_INTERVAL,
.min_pdelay_req_interval=PP_DEFAULT_MIN_PDELAY_REQ_INTERVAL,
#if CONFIG_EXT_L1SYNC == 1
.l1sync_interval=L1E_DEFAULT_L1SYNC_INTERVAL,
.l1sync_receipt_timeout=L1E_DEFAULT_L1SYNC_RECEIPT_TIMEOUT,
#endif
.egressLatency_ps=0,
.ingressLatency_ps=0,
.constantAsymmetry_ps=0,
.delayCoefficient=0,
.desiredState=PPS_PASSIVE, /* Clause 17.3.6.2 ; The default value should be PASSIVE unless otherwise specified */
.masterOnly=FALSE
};
/*
......
......@@ -168,7 +168,6 @@ struct dump_info ppi_info [] = {
DUMP_FIELD(pointer, servo), /* FIXME: follow this */
DUMP_FIELD(unsigned_long, d_flags),
DUMP_FIELD(unsigned_char, flags),
DUMP_FIELD(int, role),
DUMP_FIELD(int, proto),
DUMP_FIELD(int, delayMechanism),
DUMP_FIELD(pointer, glbs),
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment