Commit bbe09a1b authored by Maciej Lipinski's avatar Maciej Lipinski

making Slave-only mode work after re-connecting link

parent 50067e31
...@@ -12,11 +12,22 @@ TODO-ptpx: ...@@ -12,11 +12,22 @@ TODO-ptpx:
6) switch-over and the possibility of locking on multiple ports is not implemented in HW yet, thus 6) switch-over and the possibility of locking on multiple ports is not implemented in HW yet, thus
I've introduced a very nasty hack, which is turned on with MACIEK_HACKs, as soon as HW I've introduced a very nasty hack, which is turned on with MACIEK_HACKs, as soon as HW
implementation is ready, I need to get rid of that. [this is mainly in ptpd_netif] implementation is ready, I need to get rid of that. [this is mainly in ptpd_netif]
7) aging of ForeignMaster records needs to be implemented (feature of a standard PTP, not provided
by the original daemoan)
8) the transition from PTP_SLAVE to PTP_UNCALIBRATED:
(Recommended State == BMC_SLAVE && new_master != old_master)
is not implemented (feature of a standard PTP, not provided by the original daemoan), this will
be of any use, if (8) is implemented, to make slave-only work
9)
Known bugs: Known bugs:
1) When a port x is a primary slave, but then port y becomes primary slave, the port x, which 1) When a port x is a primary slave, but then port y becomes primary slave, the port x, which
should become secondary slave, does not enter UNCALIBRATED state and does not should become secondary slave, does not enter UNCALIBRATED state and does not
start WR Link Setup. (grep for 'TODO: bug 1') start WR Link Setup. (grep for 'TODO: bug 1')
2) the transition from PTP_SLAVE to PTP_UNCALIBRATED:
(Recommended State == BMC_SLAVE && new_master != old_master) HACKS:
is not implemented (feature of the original ptpd). 1) in ptpd_netif_locking_enable () to make up for the lack of HW implementation of switch-over
\ No newline at end of file it's ifdef with MACIEK_HACKs
2) not-exactly-standard implementation of Slave-only mode, we go to PTP_LISTENING ptp state
as soon as the linkDown is detected, this is to make up for the lacking
implementation of (7) & (8) from TODO-ptpx list
...@@ -89,6 +89,7 @@ void initDataPort(RunTimeOpts *rtOpts, PtpPortDS *ptpPortDS) ...@@ -89,6 +89,7 @@ void initDataPort(RunTimeOpts *rtOpts, PtpPortDS *ptpPortDS)
ptpPortDS->max_foreign_records = rtOpts->max_foreign_records; ptpPortDS->max_foreign_records = rtOpts->max_foreign_records;
ptpPortDS->linkUP = FALSE; ptpPortDS->linkUP = FALSE;
} }
/* initialize ptpClockDS*/ /* initialize ptpClockDS*/
......
...@@ -450,6 +450,8 @@ typedef struct { ...@@ -450,6 +450,8 @@ typedef struct {
*/ */
Enumeration16 msgTmpManagementId; Enumeration16 msgTmpManagementId;
/*************************************White Rabbit ************************************************/ /*************************************White Rabbit ************************************************/
//////////////// White Rabbit staff specified in WR SPEC //////////////// White Rabbit staff specified in WR SPEC
......
...@@ -299,7 +299,7 @@ PtpPortDS * ptpdStartup(int argc, char **argv, Integer16 *ret, RunTimeOpts *rtOp ...@@ -299,7 +299,7 @@ PtpPortDS * ptpdStartup(int argc, char **argv, Integer16 *ret, RunTimeOpts *rtOp
case 'S': case 'S':
PTPD_TRACE(TRACE_STARTUP, NULL,"WR wrConfig=WR_S_ONLY\n"); PTPD_TRACE(TRACE_STARTUP, NULL,"WR wrConfig=WR_S_ONLY\n");
rtOpts->autoPortDiscovery = FALSE; rtOpts->autoPortDiscovery = FALSE;
//rtOpts->slaveOnly = TRUE; rtOpts->slaveOnly = TRUE;
rtOpts->portNumber = 1; rtOpts->portNumber = 1;
rtOpts->wrConfig = WR_S_ONLY; //only for ordinary clock rtOpts->wrConfig = WR_S_ONLY; //only for ordinary clock
break; break;
...@@ -308,7 +308,7 @@ PtpPortDS * ptpdStartup(int argc, char **argv, Integer16 *ret, RunTimeOpts *rtOp ...@@ -308,7 +308,7 @@ PtpPortDS * ptpdStartup(int argc, char **argv, Integer16 *ret, RunTimeOpts *rtOp
memset(rtOpts->ifaceName[0], 0, IFACE_NAME_LENGTH); memset(rtOpts->ifaceName[0], 0, IFACE_NAME_LENGTH);
strncpy(rtOpts->ifaceName[0], optarg, IFACE_NAME_LENGTH); strncpy(rtOpts->ifaceName[0], optarg, IFACE_NAME_LENGTH);
rtOpts->autoPortDiscovery = FALSE; rtOpts->autoPortDiscovery = FALSE;
//rtOpts->slaveOnly = TRUE; rtOpts->slaveOnly = TRUE;
rtOpts->portNumber = 1; rtOpts->portNumber = 1;
rtOpts->wrConfig = WR_S_ONLY; //only for ordinary clock rtOpts->wrConfig = WR_S_ONLY; //only for ordinary clock
......
...@@ -467,6 +467,16 @@ void doState(RunTimeOpts *rtOpts, PtpPortDS *ptpPortDS) ...@@ -467,6 +467,16 @@ void doState(RunTimeOpts *rtOpts, PtpPortDS *ptpPortDS)
ptpPortDS->record_update = TRUE; // foreign masters removed -> update needed ptpPortDS->record_update = TRUE; // foreign masters removed -> update needed
ptpPortDS->wrMode = NON_WR; ptpPortDS->wrMode = NON_WR;
/*
* HACK: This is not standard compliant... but will work
*/
if(ptpPortDS->ptpClockDS->slaveOnly)
{
PTPD_TRACE(TRACE_PROTO, ptpPortDS,"Slave-only: forcing PTP_LISTENING (a small non-standard hack)\n");
toState(PTP_LISTENING, rtOpts, ptpPortDS);
ptpPortDS->record_update = FALSE;
}
} }
if(ptpPortDS->linkUP != linkUP && linkUP == TRUE) if(ptpPortDS->linkUP != linkUP && linkUP == TRUE)
...@@ -504,11 +514,12 @@ void doState(RunTimeOpts *rtOpts, PtpPortDS *ptpPortDS) ...@@ -504,11 +514,12 @@ void doState(RunTimeOpts *rtOpts, PtpPortDS *ptpPortDS)
if(state != ptpPortDS->portState) if(state != ptpPortDS->portState)
{ {
if(state == PTP_SLAVE && ( if(state == PTP_SLAVE && (
ptpPortDS->portState == PTP_LISTENING || ptpPortDS->portState == PTP_LISTENING ||
ptpPortDS->portState == PTP_PRE_MASTER || ptpPortDS->portState == PTP_PRE_MASTER ||
ptpPortDS->portState == PTP_MASTER || ptpPortDS->portState == PTP_MASTER ||
ptpPortDS->portState == PTP_PASSIVE || ptpPortDS->portState == PTP_PASSIVE ||
ptpPortDS->portState == PTP_UNCALIBRATED )) ptpPortDS->portState == PTP_UNCALIBRATED )
)
{ {
/* implementation of PTP_UNCALIBRATED state /* implementation of PTP_UNCALIBRATED state
...@@ -875,6 +886,7 @@ void handleAnnounce(MsgHeader *header, Octet *msgIbuf, ssize_t length, Boolean i ...@@ -875,6 +886,7 @@ void handleAnnounce(MsgHeader *header, Octet *msgIbuf, ssize_t length, Boolean i
if(msgIsFromCurrentParent(header, ptpPortDS)) if(msgIsFromCurrentParent(header, ptpPortDS))
{ {
PTPD_TRACE(TRACE_PROTO, ptpPortDS,"handle ..... WR_ANNOUNCE: msg is from current parent\n");
msgUnpackAnnounce(ptpPortDS->msgIbuf,&ptpPortDS->msgTmp.announce,header); msgUnpackAnnounce(ptpPortDS->msgIbuf,&ptpPortDS->msgTmp.announce,header);
if(ptpPortDS->msgTmp.announce.wr_flags != NON_WR) if(ptpPortDS->msgTmp.announce.wr_flags != NON_WR)
...@@ -1886,13 +1898,14 @@ void addForeign(Octet *buf,MsgHeader *header,PtpPortDS *ptpPortDS) ...@@ -1886,13 +1898,14 @@ void addForeign(Octet *buf,MsgHeader *header,PtpPortDS *ptpPortDS)
Boolean found = FALSE; Boolean found = FALSE;
j = ptpPortDS->foreign_record_best; j = ptpPortDS->foreign_record_best;
PTPD_TRACE(TRACE_PROTO, ptpPortDS,"addForeign=>number_foreign_records = %d\n",ptpPortDS->number_foreign_records);
/*Check if Foreign master is already known*/ /*Check if Foreign master is already known*/
for (i=0;i<ptpPortDS->number_foreign_records;i++) for (i=0;i<ptpPortDS->number_foreign_records;i++)
{ {
if (!memcmp(header->sourcePortIdentity.clockIdentity,ptpPortDS->foreign[j].foreignMasterPortIdentity.clockIdentity,CLOCK_IDENTITY_LENGTH) if (!memcmp(header->sourcePortIdentity.clockIdentity,ptpPortDS->foreign[j].foreignMasterPortIdentity.clockIdentity,CLOCK_IDENTITY_LENGTH)
&& (header->sourcePortIdentity.portNumber == ptpPortDS->foreign[j].foreignMasterPortIdentity.portNumber)) && (header->sourcePortIdentity.portNumber == ptpPortDS->foreign[j].foreignMasterPortIdentity.portNumber))
{ {
PTPD_TRACE(TRACE_PROTO, ptpPortDS,"addForeign=>foreign master already in data set\n");
/*Foreign Master is already in Foreignmaster data set*/ /*Foreign Master is already in Foreignmaster data set*/
ptpPortDS->foreign[j].foreignMasterAnnounceMessages++; ptpPortDS->foreign[j].foreignMasterAnnounceMessages++;
found = TRUE; found = TRUE;
...@@ -1900,7 +1913,7 @@ void addForeign(Octet *buf,MsgHeader *header,PtpPortDS *ptpPortDS) ...@@ -1900,7 +1913,7 @@ void addForeign(Octet *buf,MsgHeader *header,PtpPortDS *ptpPortDS)
msgUnpackHeader(buf,&ptpPortDS->foreign[j].header); msgUnpackHeader(buf,&ptpPortDS->foreign[j].header);
msgUnpackAnnounce(buf,&ptpPortDS->foreign[j].announce,&ptpPortDS->foreign[j].header); msgUnpackAnnounce(buf,&ptpPortDS->foreign[j].announce,&ptpPortDS->foreign[j].header);
if(ptpPortDS->foreign[j].announce.wr_flags != NON_WR) if(ptpPortDS->foreign[j].announce.wr_flags != NON_WR)
PTPD_TRACE(TRACE_PROTO, ptpPortDS,"addForeign: message from another White Rabbit node [wr_flag != NON_WR]\n"); PTPD_TRACE(TRACE_PROTO, ptpPortDS,"addForeign=> message from another White Rabbit node [wr_flag != NON_WR]\n");
break; break;
} }
...@@ -1916,6 +1929,7 @@ void addForeign(Octet *buf,MsgHeader *header,PtpPortDS *ptpPortDS) ...@@ -1916,6 +1929,7 @@ void addForeign(Octet *buf,MsgHeader *header,PtpPortDS *ptpPortDS)
} }
j = ptpPortDS->foreign_record_i; j = ptpPortDS->foreign_record_i;
PTPD_TRACE(TRACE_PROTO, ptpPortDS,"addForeign=>brand new foreign master\n");
/*Copy new foreign master data set from Announce message*/ /*Copy new foreign master data set from Announce message*/
memcpy(ptpPortDS->foreign[j].foreignMasterPortIdentity.clockIdentity,header->sourcePortIdentity.clockIdentity,CLOCK_IDENTITY_LENGTH); memcpy(ptpPortDS->foreign[j].foreignMasterPortIdentity.clockIdentity,header->sourcePortIdentity.clockIdentity,CLOCK_IDENTITY_LENGTH);
ptpPortDS->foreign[j].foreignMasterPortIdentity.portNumber = header->sourcePortIdentity.portNumber; ptpPortDS->foreign[j].foreignMasterPortIdentity.portNumber = header->sourcePortIdentity.portNumber;
...@@ -2005,7 +2019,7 @@ Boolean globalSecondSlavesUpdate(PtpPortDS *ptpPortDS) ...@@ -2005,7 +2019,7 @@ Boolean globalSecondSlavesUpdate(PtpPortDS *ptpPortDS)
void clearForeignMasters(PtpPortDS *ptpPortDS) void clearForeignMasters(PtpPortDS *ptpPortDS)
{ {
Integer16 i; Integer16 i;
PTPD_TRACE(TRACE_PROTO, ptpPortDS,"addForeign=>clearing the number_foreign_records\n");
for (i=0;i<ptpPortDS->number_foreign_records;i++) for (i=0;i<ptpPortDS->number_foreign_records;i++)
ptpPortDS->foreign[i].receptionPortNumber = 0;// we recognize that ForeignMaster record is empty ptpPortDS->foreign[i].receptionPortNumber = 0;// we recognize that ForeignMaster record is empty
// by the value of receptionPortNumber - port numbers // by the value of receptionPortNumber - port numbers
......
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