UInteger8 bmcStateDecision(MsgHeader *header, MsgSync *sync, RunTimeOpts *rtOpts, PtpClock *ptpClock) { if(rtOpts->slaveOnly) { s1(header, sync, ptpClock); return PTP_SLAVE; } copyD0(&ptpClock->msgTmpHeader, &ptpClock->msgTmp.sync, ptpClock); if(ptpClock->msgTmp.sync.grandmasterClockStratum < 3) { if(bmcDataSetComparison(&ptpClock->msgTmpHeader, &ptpClock->msgTmp.sync, header, sync, ptpClock) > 0) { m1(ptpClock); return PTP_MASTER; } s1(header, sync, ptpClock); return PTP_PASSIVE; } else if(bmcDataSetComparison(&ptpClock->msgTmpHeader, &ptpClock->msgTmp.sync, header, sync, ptpClock) > 0 && ptpClock->msgTmp.sync.grandmasterClockStratum != 255) { m1(ptpClock); return PTP_MASTER; } else { s1(header, sync, ptpClock); return PTP_SLAVE; } }
UInteger8 bmcStateDecision(MsgHeader *header, // PTP header info MsgSync *sync, // Sync message data RunTimeOpts *rtOpts, // Run time options PtpClock *ptpClock // Main PTP data structure ) { /* Test if run time option is set for Slave only, * if so, run s1 and return SLAVE state */ if(rtOpts->slaveOnly) { s1(header, sync, ptpClock); return PTP_SLAVE; } copyD0(&ptpClock->msgTmpHeader, &ptpClock->msgTmp.sync, ptpClock); if(ptpClock->msgTmp.sync.grandmasterClockStratum < 3) { /* Grandmaster Statum is less than 3 (accurate clock) */ if( bmcDataSetComparison(&ptpClock->msgTmpHeader, // Current RX PTP header &ptpClock->msgTmp.sync, // Current RX SYNC data header, sync, ptpClock ) > 0 ) { /* Stratum is less 3 and we are a better clock, run m1 and return MASTER state */ m1(ptpClock); return PTP_MASTER; } s1(header, sync, ptpClock); return PTP_PASSIVE; } else if(bmcDataSetComparison(&ptpClock->msgTmpHeader, &ptpClock->msgTmp.sync, header, sync, ptpClock ) > 0 && ptpClock->msgTmp.sync.grandmasterClockStratum != 255 ) { /* Grandmaster stratum is 3 or more, but not equal to 255 and we are a better clock, * return MASTER */ m1(ptpClock); return PTP_MASTER; } else { /* Grandmaster stratum is 255 or we are not a better clock, return SLAVE state */ s1(header, sync, ptpClock); return PTP_SLAVE; } }
/*State decision algorithm 9.3.3 Fig 26*/ UInteger8 bmcStateDecision(MsgHeader *header, MsgAnnounce *announce, RunTimeOpts *rtOpts, PtpClock *ptpClock) { Integer8 comp; if (rtOpts->slaveOnly) { s1(header,announce,ptpClock, rtOpts); return PTP_SLAVE; } if ((!ptpClock->number_foreign_records) && (ptpClock->portState == PTP_LISTENING)) return PTP_LISTENING; copyD0(&ptpClock->msgTmpHeader,&ptpClock->msgTmp.announce,ptpClock); DBGV("local clockQuality.clockClass: %d \n", ptpClock->clockQuality.clockClass); comp = bmcDataSetComparison(&ptpClock->msgTmpHeader, &ptpClock->msgTmp.announce, header, announce, ptpClock); if (ptpClock->clockQuality.clockClass < 128) { if (comp < 0) { m1(rtOpts, ptpClock); return PTP_MASTER; } else if (comp > 0) { s1(header,announce,ptpClock, rtOpts); return PTP_PASSIVE; } else { DBG("Error in bmcDataSetComparison..\n"); } } else { if (comp < 0) { m1(rtOpts,ptpClock); return PTP_MASTER; } else if (comp > 0) { s1(header,announce,ptpClock, rtOpts); return PTP_SLAVE; } else { DBG("Error in bmcDataSetComparison..\n"); } } /* MB: Is this the return code below correct? */ /* Anyway, it's a valid return code. */ return PTP_FAULTY; }