亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? bmc.c

?? IEEE 1588-2002編程源碼
?? C
字號:
/* bmc.c */

#include "ptpd.h"

/* see spec table 18 */
void M1(PtpClock *ptpClock)
{
  /* Default data set */
  ptpClock->steps_removed = 0;
  ptpClock->offset_from_master.seconds = 0;
  ptpClock->offset_from_master.nanoseconds = 0;
  ptpClock->one_way_delay.seconds = 0;
  ptpClock->one_way_delay.nanoseconds = 0;
  
  /* Parent data set */
  ptpClock->parent_communication_technology = ptpClock->clock_communication_technology;
  memcpy(ptpClock->parent_uuid, ptpClock->clock_uuid_field, PTP_UUID_LENGTH);
  ptpClock->parent_port_id = ptpClock->clock_port_id_field;
  ptpClock->parent_last_sync_sequence_number = 0;
  ptpClock->parent_followup_capable = ptpClock->clock_followup_capable;
  ptpClock->parent_external_timing = ptpClock->external_timing;
  ptpClock->parent_variance = ptpClock->clock_variance;
  ptpClock->grandmaster_communication_technology = ptpClock->clock_communication_technology;
  memcpy(ptpClock->grandmaster_uuid_field, ptpClock->clock_uuid_field, PTP_UUID_LENGTH);
  ptpClock->grandmaster_port_id_field  = ptpClock->clock_port_id_field;
  ptpClock->grandmaster_stratum = ptpClock->clock_stratum;
  memcpy(ptpClock->grandmaster_identifier, ptpClock->clock_identifier, PTP_CODE_STRING_LENGTH);
  ptpClock->grandmaster_variance = ptpClock->clock_variance;
  ptpClock->grandmaster_preferred  = ptpClock->preferred;
  ptpClock->grandmaster_is_boundary_clock  = ptpClock->is_boundary_clock;
  ptpClock->grandmaster_sequence_number = ptpClock->last_sync_event_sequence_number;
}

/* see spec table 21 */
void S1(MsgHeader *header, MsgSync *sync, PtpClock *ptpClock)
{
  /* Current data set */
  ptpClock->steps_removed = sync->localStepsRemoved + 1;
  
  /* Parent data set */
  ptpClock->parent_communication_technology = header->sourceCommunicationTechnology;
  memcpy(ptpClock->parent_uuid,  header->sourceUuid, PTP_UUID_LENGTH);
  ptpClock->parent_port_id = header->sourcePortId;
  ptpClock->parent_last_sync_sequence_number = header->sequenceId;
  ptpClock->parent_followup_capable  = getFlag(header->flags, PTP_ASSIST);
  ptpClock->parent_external_timing = getFlag(header->flags, PTP_EXT_SYNC);
  ptpClock->parent_variance = sync->localClockVariance;
  ptpClock->grandmaster_communication_technology = sync->grandmasterCommunicationTechnology;
  memcpy(ptpClock->grandmaster_uuid_field, sync->grandmasterClockUuid, PTP_UUID_LENGTH);
  ptpClock->grandmaster_port_id_field = sync->grandmasterPortId;
  ptpClock->grandmaster_stratum = sync->grandmasterClockStratum;
  memcpy(ptpClock->grandmaster_identifier, sync->grandmasterClockIdentifier, PTP_CODE_STRING_LENGTH); 
  ptpClock->grandmaster_variance = sync->grandmasterClockVariance;
  ptpClock->grandmaster_preferred = sync->grandmasterPreferred;
  ptpClock->grandmaster_is_boundary_clock = sync->grandmasterIsBoundaryClock;
  ptpClock->grandmaster_sequence_number = sync->grandmasterSequenceId;
  
  /* Global time properties data set */
  ptpClock->current_utc_offset = sync->currentUTCOffset;
  ptpClock->leap_59 =  getFlag(header->flags, PTP_LI_59);
  ptpClock->leap_61 =  getFlag(header->flags, PTP_LI_61);
  ptpClock->epoch_number = sync->epochNumber;  
}

void copyD0(MsgHeader *header, MsgSync *sync, PtpClock *ptpClock)
{
  sync->grandmasterCommunicationTechnology = ptpClock->clock_communication_technology;
  memcpy(sync->grandmasterClockUuid, ptpClock->clock_uuid_field, PTP_UUID_LENGTH);
  sync->grandmasterPortId = ptpClock->clock_port_id_field;
  sync->grandmasterClockStratum = ptpClock->clock_stratum;
  memcpy(sync->grandmasterClockIdentifier, ptpClock->clock_identifier, PTP_CODE_STRING_LENGTH);
  sync->grandmasterClockVariance = ptpClock->clock_variance;
  sync->grandmasterIsBoundaryClock = ptpClock->is_boundary_clock;
  sync->grandmasterPreferred = ptpClock->preferred;
  sync->localStepsRemoved = ptpClock->steps_removed;
  header->sourceCommunicationTechnology= ptpClock->clock_communication_technology;
  memcpy(header->sourceUuid, ptpClock->clock_uuid_field, PTP_UUID_LENGTH); 
  header->sourcePortId = ptpClock->clock_port_id_field;
  sync->grandmasterSequenceId = ptpClock->grandmaster_sequence_number;
  header->sequenceId = ptpClock->grandmaster_sequence_number;
  header->sourcePortId = ptpClock->clock_port_id_field;
}

int getIdentifierOrder(Octet identifier[PTP_CODE_STRING_LENGTH])
{
  if(!memcmp(identifier, IDENTIFIER_ATOM, PTP_CODE_STRING_LENGTH))
    return 1;
  else if(!memcmp(identifier, IDENTIFIER_GPS, PTP_CODE_STRING_LENGTH))
    return 1;
  else if(!memcmp(identifier, IDENTIFIER_NTP, PTP_CODE_STRING_LENGTH))
    return 2;
  else if(!memcmp(identifier, IDENTIFIER_HAND, PTP_CODE_STRING_LENGTH))
    return 3;
  else if(!memcmp(identifier, IDENTIFIER_INIT, PTP_CODE_STRING_LENGTH))
    return 4;
  else if(!memcmp(identifier, IDENTIFIER_DFLT, PTP_CODE_STRING_LENGTH))
    return 5;
  
  return 6;
}

/* return similar to memcmp()s
   note: communicationTechnology can be ignored because 
   if they differed they would not have made it here */
Integer8 bmcDataSetComparison(MsgHeader *headerA, MsgSync *syncA,
  MsgHeader *headerB, MsgSync *syncB, PtpClock *ptpClock)
{
  DBGV("bmcDataSetComparison: start\n");
  if( !( syncA->grandmasterPortId == syncB->grandmasterPortId
    && !memcmp(syncA->grandmasterClockUuid, syncB->grandmasterClockUuid, PTP_UUID_LENGTH) ) )
  {
    if(syncA->grandmasterClockStratum < syncB->grandmasterClockStratum)
      goto A;
    else if(syncA->grandmasterClockStratum > syncB->grandmasterClockStratum)
      goto B;
    
    /* grandmasterClockStratums same */
    if(getIdentifierOrder(syncA->grandmasterClockIdentifier) < getIdentifierOrder(syncB->grandmasterClockIdentifier))
      goto A;
    if(getIdentifierOrder(syncA->grandmasterClockIdentifier) > getIdentifierOrder(syncB->grandmasterClockIdentifier))
      goto B;
    
    /* grandmasterClockIdentifiers same */
    if(syncA->grandmasterClockStratum > 2)
    {
      if(syncA->grandmasterClockVariance > syncB->grandmasterClockVariance + PTP_LOG_VARIANCE_THRESHOLD
        || syncA->grandmasterClockVariance < syncB->grandmasterClockVariance - PTP_LOG_VARIANCE_THRESHOLD)
      {
        /* grandmasterClockVariances are not similar */
        if(syncA->grandmasterClockVariance < syncB->grandmasterClockVariance)
          goto A;
        else
          goto B;
      }
      /* grandmasterClockVariances are similar */
      if(!syncA->grandmasterIsBoundaryClock != !syncB->grandmasterIsBoundaryClock) /* XOR */
      {
        if(syncA->grandmasterIsBoundaryClock)
          goto A;
        else
          goto B;
      }
      /* neither is grandmasterIsBoundaryClock */
      if(memcmp(syncA->grandmasterClockUuid, syncB->grandmasterClockUuid, PTP_UUID_LENGTH) < 0)
        goto A;
      else
        goto B;
    }
    
    /* syncA->grandmasterClockStratum <= 2 */
    if(!syncA->grandmasterPreferred != !syncB->grandmasterPreferred) /* XOR */
    {
      if(syncA->grandmasterPreferred)
        return 1;  /* A1 */
      else
        return -1;  /* B1 */
    }
    /* neither or both grandmasterPreferred */
  }
  
  DBGV("bmcDataSetComparison: X\n");
  if(syncA->localStepsRemoved > syncB->localStepsRemoved + 1
    || syncA->localStepsRemoved < syncB->localStepsRemoved -1)
  {
    /* localStepsRemoved not within 1 */
    if(syncA->localStepsRemoved < syncB->localStepsRemoved)
      return 1;  /* A1 */
    else
      return -1;  /* B1 */
  }
  
  /* localStepsRemoved within 1 */
  if(syncA->localStepsRemoved < syncB->localStepsRemoved)
  {
    DBGV("bmcDataSetComparison: A3\n");
    if(memcmp(ptpClock->port_uuid_field, headerB->sourceUuid, PTP_UUID_LENGTH) < 0)
      return 1;  /* A1 */
    else if(memcmp(ptpClock->port_uuid_field, headerB->sourceUuid, PTP_UUID_LENGTH) > 0)
      return 2;  /* A2 */
    
    /* this port_uuid_field same as headerB->sourceUuid */
    if(ptpClock->port_id_field < headerB->sourcePortId)
      return 1;  /* A1 */
    else if(ptpClock->port_id_field > headerB->sourcePortId)
      return 2;  /* A2 */
    
    /* this port_id_field same as headerB->sourcePortId */
    return 0;  /* same */
  }
  if(syncA->localStepsRemoved > syncB->localStepsRemoved)
  {
    DBGV("bmcDataSetComparison: B3\n");
    if(memcmp(ptpClock->port_uuid_field, headerA->sourceUuid, PTP_UUID_LENGTH) < 0)
      return -1;  /* B1 */
    else if(memcmp(ptpClock->port_uuid_field, headerB->sourceUuid, PTP_UUID_LENGTH) > 0)
      return -2;  /* B2 */
    
    /* this port_uuid_field same as headerA->sourceUuid */
    if(ptpClock->port_id_field < headerA->sourcePortId)
      return -1;  /* B1 */
    else if(ptpClock->port_id_field > headerA->sourcePortId)
      return -2;  /* B2 */
    
    /* this port_id_field same as headerA->sourcePortId */
    return 0;  /* same */
  }
  
  /* localStepsRemoved same */
  if(memcmp(headerA->sourceUuid, headerB->sourceUuid, PTP_UUID_LENGTH) < 0)
    return 2;  /* A2 */
  else if(memcmp(headerA->sourceUuid, headerB->sourceUuid, PTP_UUID_LENGTH) > 0)
    return -2;  /* B2 */
  
  /* sourceUuid same */
  DBGV("bmcDataSetComparison: Z\n");
  if(syncA->grandmasterSequenceId > syncB->grandmasterSequenceId)
    return 3;
  else if(syncA->grandmasterSequenceId < syncB->grandmasterSequenceId)
    return -3;
  
  /* grandmasterSequenceId same */
  if(headerA->sequenceId > headerB->sequenceId)
    return 3;
  else if(headerA->sequenceId < headerB->sequenceId)
    return -3;
  
  /* sequenceId same */
  return 0;  /* same */
  
  /* oh no, a goto label! the horror! */
A:
  if(!syncA->grandmasterPreferred && syncB->grandmasterPreferred)
    return -1;  /* B1 */
  else
    return 1;  /* A1 */
B:
  if(syncA->grandmasterPreferred && !syncB->grandmasterPreferred)
    return 1;  /* A1 */
  else
    return -1;  /* B1 */
}

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)
  {
    M1(ptpClock);
    return PTP_MASTER;
  }
  else
  {
    S1(header, sync, ptpClock);
    return PTP_SLAVE;
  }
}

UInteger8 bmc(ForeignMasterRecord *foreign, RunTimeOpts *rtOpts, PtpClock *ptpClock)
{
  int i, best;
  
  if(!ptpClock->number_foreign_records)
  {
    if(ptpClock->port_state == PTP_MASTER)
      M1(ptpClock);
    return ptpClock->port_state;  /* no change */
  }
  
  for(i = 1, best = 0; i < ptpClock->number_foreign_records; ++i)
  {
    if(bmcDataSetComparison(&foreign[i].header, &foreign[i].sync,
        &foreign[best].header, &foreign[best].sync, ptpClock) > 0)
      best = i;
  }
  
  DBGV("bmc: best record %d\n", best);
  ptpClock->foreign_record_best = best;
  
  return bmcStateDecision(&foreign[best].header, &foreign[best].sync, rtOpts, ptpClock);
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
播五月开心婷婷综合| 黄色小说综合网站| 国产亚洲女人久久久久毛片| 91麻豆精品国产| 欧洲日韩一区二区三区| 一本色道综合亚洲| 色综合久久99| 欧美老女人第四色| 制服.丝袜.亚洲.中文.综合| 制服丝袜日韩国产| 欧美大尺度电影在线| 日韩视频免费直播| 久久久久久久久一| 欧美国产日产图区| 亚洲精品综合在线| 亚洲永久免费视频| 青青草国产成人99久久| 国产一区二区三区黄视频| 国产不卡视频一区| 一本在线高清不卡dvd| 欧美日韩一区小说| 日韩欧美国产系列| 国产婷婷色一区二区三区| 18成人在线观看| 性做久久久久久| 国产一区二区三区在线观看免费视频 | 午夜av一区二区三区| 日韩国产欧美一区二区三区| 另类小说色综合网站| 成人中文字幕合集| 欧美日韩精品一区二区三区| 精品久久久久久久久久久院品网| 国产精品久久久久久久裸模| 午夜在线成人av| 国产做a爰片久久毛片| 色悠久久久久综合欧美99| 这里是久久伊人| 国产精品福利一区二区三区| 午夜一区二区三区视频| 国产成人综合亚洲网站| 欧美日韩一区视频| 久久精品在这里| 日韩一区精品字幕| av在线综合网| 久久久久久久久久电影| 午夜精品久久久久久不卡8050| 国产寡妇亲子伦一区二区| 欧美在线观看一二区| 国产亚洲成aⅴ人片在线观看| 一区二区三区中文在线| 国产宾馆实践打屁股91| 欧美一区二区三区视频免费播放 | 亚洲精品高清在线| 国产一区二区三区最好精华液| 在线一区二区视频| 亚洲视频图片小说| 国产一区二区三区四区五区入口| 欧美福利一区二区| 亚洲精品老司机| 成人在线综合网| 亚洲日本va午夜在线影院| 国内成人精品2018免费看| 在线成人免费观看| 亚洲精品国产成人久久av盗摄| 成人a级免费电影| 久久婷婷色综合| 日本成人在线视频网站| 欧美日韩国产高清一区二区| 亚洲日本免费电影| 色综合天天狠狠| 亚洲欧洲中文日韩久久av乱码| 成人黄页在线观看| 国产精品久久久久影视| 国产白丝精品91爽爽久久| 久久婷婷色综合| 国产成人一区二区精品非洲| 国产亚洲一区字幕| 国产一区二区主播在线| 久久久久国产精品人| 国产乱子伦视频一区二区三区| 欧美电影精品一区二区| 精彩视频一区二区| 国产亚洲人成网站| 国产91丝袜在线播放| 国产精品久久久久婷婷二区次 | 国产精品毛片大码女人| 国产91丝袜在线观看| 国产精品青草综合久久久久99| 成人免费三级在线| 亚洲欧美另类图片小说| 在线亚洲精品福利网址导航| 亚洲一级二级在线| 欧美一区二区三区在线| 秋霞午夜av一区二区三区| 欧美tickling挠脚心丨vk| 国产一区二区0| 亚洲三级免费电影| 欧美日韩国产乱码电影| 美腿丝袜亚洲综合| 国产精品沙发午睡系列990531| 99国产精品久| 午夜免费久久看| 久久综合久色欧美综合狠狠| av一区二区久久| 午夜精品久久久久影视| 26uuu久久综合| 日本国产一区二区| 美女性感视频久久| 亚洲人123区| 欧美一区二区三区白人| 国产v日产∨综合v精品视频| 亚洲成在线观看| 国产亚洲一区二区在线观看| 91蜜桃视频在线| 捆绑调教一区二区三区| |精品福利一区二区三区| 欧美一区二区女人| 97精品国产露脸对白| 日本少妇一区二区| 亚洲久草在线视频| 久久久久久一二三区| 欧亚洲嫩模精品一区三区| 国产一区二区三区在线观看免费视频| 亚洲欧美国产77777| 久久综合九色欧美综合狠狠| 欧美系列在线观看| 丁香婷婷深情五月亚洲| 蜜桃视频一区二区| 天天综合网 天天综合色| 国产精品久久久久婷婷| 久久综合久色欧美综合狠狠| 4438x亚洲最大成人网| 色老头久久综合| 成人午夜视频网站| 精品亚洲aⅴ乱码一区二区三区| 亚洲777理论| 亚洲综合色在线| 一区二区三区小说| 亚洲视频一区二区在线观看| 欧美激情综合网| 久久久久久久久久久久久女国产乱 | 国产福利一区二区三区视频| 男男gaygay亚洲| 性久久久久久久久| 天天色综合天天| 性感美女久久精品| 亚洲成人一区二区| 一区二区免费在线播放| 亚洲日本电影在线| 亚洲啪啪综合av一区二区三区| 国产精品福利一区二区三区| 欧美国产日韩a欧美在线观看| 久久美女艺术照精彩视频福利播放| 91精品国产高清一区二区三区蜜臀 | 精品国产免费视频| 欧美一区二区不卡视频| 91麻豆精品国产无毒不卡在线观看| 欧美日韩高清在线播放| 欧美日韩精品久久久| 欧美日韩精品久久久| 欧美一区二区视频在线观看2020 | 日本一区中文字幕| 老司机精品视频导航| 国内偷窥港台综合视频在线播放| 精品一区二区三区在线视频| 国产精品一区在线观看你懂的| 国产乱子伦视频一区二区三区| 丁香六月综合激情| 成人av网址在线| 欧美午夜精品久久久久久孕妇| 欧美日本精品一区二区三区| 日韩免费高清电影| 国产日韩综合av| 一区二区三区在线视频观看| 午夜久久久影院| 国产精品一区二区无线| 成人午夜视频在线| 欧美日韩亚洲综合在线| 欧美一区二区成人| 国产精品传媒视频| 午夜欧美在线一二页| 国产精品主播直播| 在线观看成人免费视频| 91精品国产欧美一区二区18| 日本一区二区三级电影在线观看| 国产精品久久久久久久久免费桃花| 亚洲成av人影院| 国产大陆a不卡| 欧美伊人精品成人久久综合97| 精品国产一区二区在线观看| 中文字幕在线一区| 奇米精品一区二区三区在线观看| 丁香天五香天堂综合| 91精品久久久久久久99蜜桃| 欧美国产精品久久| 免费国产亚洲视频| 一本高清dvd不卡在线观看| 日韩一级精品视频在线观看| 《视频一区视频二区| 国产在线国偷精品产拍免费yy|