示例#1
0
文件: bmc.c 项目: Pedersen175/BitsPTP
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;
  }
}
示例#2
0
文件: bmc.c 项目: artasoftkey/ptpv2d
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;
  }
}
示例#3
0
/*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;
}