Commit 6ab4378a authored by Aurelio Colosimo's avatar Aurelio Colosimo

Default Data Set initialized in pp_open_instance

Default Data Set is common to all ports, so it must be defined globally.
pp_open_instance now gets a pp_globals object; the same should be done for
pp_close_intance, but is not urgent since it is currently used by wrpc arch
only, which is a single port arch.
Signed-off-by: Aurelio Colosimo's avatarAurelio Colosimo <aurelio@aureliocolosimo.it>
parent 7b448676
......@@ -81,7 +81,7 @@ int main(int argc, char **argv)
struct pp_instance *ppi = &ppg->pp_instances[0];
ppi->iface_name = strdup(ifname);
ppi->ethernet_mode = PP_DEFAULT_ETHERNET_MODE;
pp_open_instance(ppi, NULL);
pp_open_instance(ppg, NULL);
if (pp_parse_cmdline(ppi, argc, argv) != 0)
return -1;
}
......
......@@ -146,7 +146,7 @@ int wrc_ptp_start()
{
struct pp_instance *ppi = &ppi_static;
pp_open_instance(ppi, 0 /* no opts */);
pp_open_instance(&ppg_static, 0 /* no opts */);
/* Call the state machine. Being it in "Initializing" state, make
* ppsi initialize what is necessary */
......
......@@ -95,8 +95,8 @@ extern void pp_prepare_pointers(struct pp_instance *ppi);
* allow NULL pointers.
*/
struct pp_ext_hooks {
int (*init)(struct pp_instance *ppi, unsigned char *pkt, int plen);
int (*open)(struct pp_instance *ppi, struct pp_runtime_opts *rt_opts);
int (*init)(struct pp_instance *ppg, unsigned char *pkt, int plen);
int (*open)(struct pp_globals *ppi, struct pp_runtime_opts *rt_opts);
int (*close)(struct pp_instance *ppi);
int (*listening)(struct pp_instance *ppi, unsigned char *pkt, int plen);
int (*master_msg)(struct pp_instance *ppi, unsigned char *pkt,
......@@ -218,7 +218,7 @@ static inline void pp_timeout_restart_annrec(struct pp_instance *ppi)
/* The channel for an instance must be created and possibly destroyed. */
extern int pp_open_instance(struct pp_instance *ppi,
extern int pp_open_instance(struct pp_globals *ppg,
struct pp_runtime_opts *rt_opts);
extern int pp_close_instance(struct pp_instance *ppi);
......
......@@ -53,7 +53,7 @@ int ppsi_main(int argc, char **argv)
ppi->iface_name = "eth0";
/* This just llocates the stuff */
pp_open_instance(ppi, NULL);
pp_open_instance(ppg, NULL);
if (pp_parse_cmdline(ppi, argc, argv) != 0)
return -1;
......
......@@ -18,12 +18,13 @@ static int wr_init(struct pp_instance *ppi, unsigned char *pkt, int plen)
}
/* This currently only works with one interface (i.e. WR Node) */
static int wr_open(struct pp_instance *ppi, struct pp_runtime_opts *rt_opts)
static int wr_open(struct pp_globals *ppg, struct pp_runtime_opts *rt_opts)
{
static struct wr_data_t wr_data; /* WR-specific global data */
ppi->iface_name = "wr1";
ppi->ext_data = &wr_data;
/* FIXME handle more ports */
ppg->pp_instances[0].iface_name = "wr1";
ppg->pp_instances[0].ext_data = &wr_data;
return 0;
}
......
......@@ -34,17 +34,39 @@ struct pp_runtime_opts default_rt_opts = {
.ttl = PP_DEFAULT_TTL,
};
int pp_open_instance(struct pp_instance *ppi, struct pp_runtime_opts *rt_opts)
int pp_open_instance(struct pp_globals *ppg, struct pp_runtime_opts *rt_opts)
{
/*
* Initialize default data set
*/
int i;
struct DSDefault *def = ppg->defaultDS;
def->twoStepFlag = TRUE;
def->numberPorts = ppg->nports;
memcpy(&def->clockQuality, &rt_opts->clock_quality, sizeof(ClockQuality));
def->priority1 = rt_opts->prio1;
def->priority2 = rt_opts->prio2;
def->domainNumber = rt_opts->domain_number;
if (ppg->nports == 1) {
def->slaveOnly = ppg->pp_instances[0].slave_only;
if (def->slaveOnly)
def->clockQuality.clockClass = 255;
}
else {
/* FIXME set def stuff when nports > 1 too */
}
if (rt_opts)
ppi->rt_opts = rt_opts;
ppg->rt_opts = rt_opts;
else
ppi->rt_opts = &default_rt_opts;
ppg->rt_opts = &default_rt_opts;
ppi->state = PPS_INITIALIZING;
for (i = 0; i < ppg->nports; i++)
ppg->pp_instances[i].state = PPS_INITIALIZING;
if (pp_hooks.open)
return pp_hooks.open(ppi, ppi->rt_opts);
return pp_hooks.open(ppg, rt_opts);
return 0;
}
......
......@@ -12,7 +12,6 @@
int pp_initializing(struct pp_instance *ppi, unsigned char *pkt, int plen)
{
unsigned char *id, *mac;
struct DSDefault *def = DSDEF(ppi);
struct DSPort *port = DSPOR(ppi);
struct pp_runtime_opts *opt = OPTS(ppi);
int ret = 0;
......@@ -20,12 +19,8 @@ int pp_initializing(struct pp_instance *ppi, unsigned char *pkt, int plen)
if (ppi->n_ops->init(ppi) < 0) /* it must handle being called twice */
goto failure;
/*
* Initialize default data set
*/
def->twoStepFlag = TRUE;
/* Clock identity comes from mac address with 0xff:0xfe intermixed */
id = (unsigned char *)&def->clockIdentity;
id = (unsigned char *)&DSDEF(ppi)->clockIdentity;
mac = NP(ppi)->ch[PP_NP_GEN].addr;
id[0] = mac[0];
id[1] = mac[1];
......@@ -36,20 +31,11 @@ int pp_initializing(struct pp_instance *ppi, unsigned char *pkt, int plen)
id[6] = mac[4];
id[7] = mac[5];
def->numberPorts = 1; /* Change this when multi-port */
memcpy(&def->clockQuality, &opt->clock_quality, sizeof(ClockQuality));
def->priority1 = opt->prio1;
def->priority2 = opt->prio2;
def->domainNumber = opt->domain_number;
def->slaveOnly = ppi->slave_only;
if (def->slaveOnly)
def->clockQuality.clockClass = 255;
/*
* Initialize port data set
*/
memcpy(&port->portIdentity.clockIdentity,
&def->clockIdentity, PP_CLOCK_IDENTITY_LENGTH);
&DSDEF(ppi)->clockIdentity, PP_CLOCK_IDENTITY_LENGTH);
port->portIdentity.portNumber = 1;
port->logMinDelayReqInterval = PP_DEFAULT_DELAYREQ_INTERVAL;
port->logAnnounceInterval = opt->announce_intvl;
......
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