Commit 9e5ebbd4 authored by Alessandro Rubini's avatar Alessandro Rubini

pdelay: remove state-pclock, as state-slave does it all

Signed-off-by: Alessandro Rubini's avatarAlessandro Rubini <rubini@gnudd.com>
parent e9d8b148
......@@ -21,11 +21,7 @@ struct pp_state_table_item pp_state_table[] = {
{ PPS_MASTER, "master", pp_master,},
/*{ PPS_PASSIVE, "passive", pp_passive,},*/
{ PPS_UNCALIBRATED, "uncalibrated", pp_uncalibrated,},
#ifdef CONFIG_E2E
{ PPS_SLAVE, "slave", pp_slave,},
#elif CONFIG_P2P
{ PPS_SLAVE, "slave", pp_pclock,},
#endif
{ WRS_PRESENT, "uncalibrated/wr-present", wr_present,},
{ WRS_M_LOCK, "master/wr-m-lock", wr_m_lock,},
{ WRS_S_LOCK, "uncalibrated/wr-s-lock", wr_s_lock,},
......
......@@ -13,7 +13,6 @@ OBJ-y += $D/fsm-table.o \
$D/state-passive.o \
$D/state-uncalibrated.o \
$D/state-slave.o \
$D/state-pclock.o \
$D/common-fun.o \
$D/bmc.o \
$D/msg.o \
......
......@@ -22,10 +22,6 @@ struct pp_state_table_item pp_state_table[] __attribute__((weak)) = {
{ PPS_MASTER, "master", pp_master,},
{ PPS_PASSIVE, "passive", pp_passive,},
{ PPS_UNCALIBRATED, "uncalibrated", pp_uncalibrated,},
#ifdef CONFIG_E2E
{ PPS_SLAVE, "slave", pp_slave,},
#elif CONFIG_P2P
{ PPS_SLAVE, "slave", pp_pclock,},
#endif
{ PPS_END_OF_TABLE,}
};
/*
* Copyright (C) 2014 GSI (www.gsi.de)
* Author: Cesar Prados
* Based on PTPd project v. 2.1.0 (see AUTHORS for details)
*
* Released according to the GNU LGPL, version 2.1 or any later version.
*/
#include <ppsi/ppsi.h>
#include "common-fun.h"
int pp_pclock(struct pp_instance *ppi, unsigned char *pkt, int plen)
{
int e = 0; /* error var, to check errors in msg handling */
MsgHeader *hdr = &ppi->received_ptp_header;
MsgPDelayRespFollowUp respFllw;
int d1, d2;
if (ppi->is_new_state) {
memset(&ppi->t1, 0, sizeof(ppi->t1));
pp_servo_init(ppi);
if (pp_hooks.new_slave)
e = pp_hooks.new_slave(ppi, pkt, plen);
if (e)
goto out;
ppi->flags &= ~PPI_FLAGS_WAITING;
pp_timeout_restart_annrec(ppi);
pp_timeout_rand(ppi, PP_TO_REQUEST,
DSPOR(ppi)->logMinDelayReqInterval);
}
if (plen == 0)
goto out;
switch (hdr->messageType) {
case PPM_ANNOUNCE:
e = st_com_slave_handle_announce(ppi, pkt, plen);
break;
case PPM_SYNC:
e = st_com_slave_handle_sync(ppi, pkt, plen);
break;
case PPM_FOLLOW_UP:
e = st_com_slave_handle_followup(ppi, pkt, plen);
break;
case PPM_DELAY_REQ:
/* Being slave, we are not waiting for a delay request */
break;
case PPM_PDELAY_REQ:
if (plen < PP_PDELAY_RESP_LENGTH)
break;
if (pp_hooks.handle_preq)
e = pp_hooks.handle_preq(ppi);
else
e = st_com_peer_handle_preq(ppi, pkt, plen);
if (e)
goto out;
break;
case PPM_PDELAY_RESP:
e = st_com_peer_handle_pres(ppi, pkt, plen);
break;
case PPM_PDELAY_RESP_FOLLOW_UP:
if (plen < PP_PDELAY_RESP_FOLLOW_UP_LENGTH)
break;
msg_unpack_pdelay_resp_follow_up(pkt, &respFllw);
if ((memcmp(&DSPOR(ppi)->portIdentity.clockIdentity,
&respFllw.requestingPortIdentity.clockIdentity,
PP_CLOCK_IDENTITY_LENGTH) == 0) &&
((ppi->sent_seq[PPM_PDELAY_REQ]) ==
hdr->sequenceId) &&
(DSPOR(ppi)->portIdentity.portNumber ==
respFllw.requestingPortIdentity.portNumber) &&
(ppi->flags & PPI_FLAG_FROM_CURRENT_PARENT)) {
to_TimeInternal(&ppi->t5,
&respFllw.responseOriginTimestamp);
ppi->flags |= PPI_FLAG_WAITING_FOR_RF_UP;
if (pp_hooks.handle_presp)
e = pp_hooks.handle_presp(ppi);
else
pp_servo_got_presp(ppi);
if (e)
goto out;
} else {
pp_diag(ppi, frames, 2, "pp_pclock : "
"PDelay Resp F-up doesn't match PDelay Req\n");
}
break;
default:
/* disregard, nothing to do */
break;
}
out:
if (e == 0)
e = st_com_execute_slave(ppi);
if (pp_timeout_z(ppi, PP_TO_REQUEST)) {
e = msg_issue_request(ppi);
ppi->t3 = ppi->last_snt_time;
/* Restart the timeout for next time */
pp_timeout_rand(ppi, PP_TO_REQUEST,
DSPOR(ppi)->logMinDelayReqInterval);
}
switch(e) {
case PP_SEND_OK: /* 0 */
break;
case PP_SEND_ERROR:
ppi->next_state = PPS_FAULTY;
break;
case PP_SEND_NO_STAMP:
/* nothing, just keep the ball rolling */
e = 0;
break;
}
if (ppi->next_state != ppi->state) {
pp_timeout_clr(ppi, PP_TO_ANN_RECEIPT);
pp_timeout_clr(ppi, PP_TO_REQUEST);
pp_servo_init(ppi);
}
d1 = d2 = pp_ms_to_timeout(ppi, PP_TO_ANN_RECEIPT);
if (ppi->timeouts[PP_TO_REQUEST])
d2 = pp_ms_to_timeout(ppi, PP_TO_REQUEST);
ppi->next_delay = d1 < d2 ? d1 : d2;
return e;
}
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