From: <gn...@us...> - 2010-08-17 16:04:49
|
Revision: 68 http://ptpd.svn.sourceforge.net/ptpd/?rev=68&view=rev Author: gnn Date: 2010-08-17 16:04:41 +0000 (Tue, 17 Aug 2010) Log Message: ----------- Properly indent code and make it mostly conform to style(9) from the BSD's. All developers please be aware that the convention going forwards for whitepace and indentation is style(9). http://www.freebsd.org/cgi/man.cgi?query=style&sektion=9&manpath=FreeBSD+9-current Modified Paths: -------------- branches/v2/src/arith.c branches/v2/src/bmc.c branches/v2/src/dep/msg.c branches/v2/src/dep/net.c branches/v2/src/dep/servo.c branches/v2/src/dep/startup.c branches/v2/src/dep/sys.c branches/v2/src/dep/timer.c branches/v2/src/display.c branches/v2/src/protocol.c branches/v2/src/ptpd.c Modified: branches/v2/src/arith.c =================================================================== --- branches/v2/src/arith.c 2010-08-09 16:15:36 UTC (rev 67) +++ branches/v2/src/arith.c 2010-08-17 16:04:41 UTC (rev 68) @@ -1,163 +1,178 @@ -/* arith.c */ +/** + * @file arith.c + * @date Tue Jul 20 16:12:51 2010 + * + * @brief Time format conversion routines and additional math functions. + * + * + */ #include "ptpd.h" -void integer64_to_internalTime(Integer64 bigint,TimeInternal *internal) +void +integer64_to_internalTime(Integer64 bigint, TimeInternal * internal) { int s_msb; double ns_msb; int entire; - char *p_lsb, *p_msb; + char *p_lsb, *p_msb; Boolean negative = FALSE; - p_lsb = (char *) &bigint.lsb; // lsb type is unsigned int - p_msb = (char *) &bigint.msb; // msb type is int - - /*Test if bigint is a negative number*/ + p_lsb = (char *)&bigint.lsb; + /* lsb type is unsigned int */ + p_msb = (char *)&bigint.msb; + /* msb type is int */ + /* Test if bigint is a negative number */ negative = ((bigint.msb & 0x80000000) == 0x80000000); - if (!negative) - { - /*Positive case*/ + if (!negative) { + /* Positive case */ - /*fractional nanoseconds are excluded (see 5.3.2)*/ - bigint.lsb = bigint.lsb>>16; - /*copy two least significant octet of msb to most significant octet of lsb*/ - *(p_lsb+2)=*p_msb; - *(p_lsb+3)=*(p_msb+1); - bigint.msb = bigint.msb>>16; + /* fractional nanoseconds are excluded (see 5.3.2) */ + bigint.lsb = bigint.lsb >> 16; + /* + * copy two least significant octet of msb to most + * significant octet of lsb + */ + *(p_lsb + 2) = *p_msb; + *(p_lsb + 3) = *(p_msb + 1); + bigint.msb = bigint.msb >> 16; - internal->nanoseconds = bigint.lsb % 1000000000; - internal->seconds = bigint.lsb / 1000000000; + internal->nanoseconds = bigint.lsb % 1000000000; + internal->seconds = bigint.lsb / 1000000000; - /*(2^32 / 10^9) = 4,294967296*/ - s_msb = 4*bigint.msb; - ns_msb = 0.294967296*(double)bigint.msb; - entire = (int)ns_msb; - s_msb += entire; - ns_msb -= entire; - ns_msb *= 1000000000; - internal->nanoseconds = (float)internal->nanoseconds + (float)ns_msb; - internal->seconds += s_msb; - normalizeTime(internal); + /* (2^32 / 10^9) = 4,294967296 */ + s_msb = 4 * bigint.msb; + ns_msb = 0.294967296 * (double)bigint.msb; + entire = (int)ns_msb; + s_msb += entire; + ns_msb -= entire; + ns_msb *= 1000000000; + internal->nanoseconds = (float)internal->nanoseconds + + (float)ns_msb; + internal->seconds += s_msb; + normalizeTime(internal); } - /*End of positive Case*/ + /* End of positive Case */ - else - { /*Negative case*/ + else { /* Negative case */ - /*Take the two complement*/ - bigint.lsb = ~bigint.lsb; - bigint.msb = ~bigint.msb; + /* Take the two complement */ + bigint.lsb = ~bigint.lsb; + bigint.msb = ~bigint.msb; - if (bigint.lsb == 0xffffffff){ - bigint.lsb = 0; - bigint.msb++; - } - else{ + if (bigint.lsb == 0xffffffff) { + bigint.lsb = 0; + bigint.msb++; + } else { bigint.lsb++; - } + } - /*fractional nanoseconds are excluded (see 5.3.2)*/ - bigint.lsb = bigint.lsb>>16; - /*copy two least significant octet of msb to most significant octet of lsb*/ - *(p_lsb+2)=*p_msb; - *(p_lsb+3)=*(p_msb+1); - bigint.msb = bigint.msb>>16; + /* fractional nanoseconds are excluded (see 5.3.2) */ + bigint.lsb = bigint.lsb >> 16; + /* + * copy two least significant octet of msb to most + * significant octet of lsb + */ + *(p_lsb + 2) = *p_msb; + *(p_lsb + 3) = *(p_msb + 1); + bigint.msb = bigint.msb >> 16; - internal->nanoseconds = bigint.lsb % 1000000000; - internal->seconds = bigint.lsb / 1000000000; + internal->nanoseconds = bigint.lsb % 1000000000; + internal->seconds = bigint.lsb / 1000000000; - /*(2^32 / 10^9) = 4,294967296*/ - s_msb = 4*bigint.msb; - ns_msb = 0.294967296*(double)bigint.msb; - entire = (int)ns_msb; - s_msb += entire; - ns_msb -= entire; - ns_msb *= 1000000000; + /* (2^32 / 10^9) = 4,294967296 */ + s_msb = 4 * bigint.msb; + ns_msb = 0.294967296 * (double)bigint.msb; + entire = (int)ns_msb; + s_msb += entire; + ns_msb -= entire; + ns_msb *= 1000000000; - internal->nanoseconds = (float)internal->nanoseconds + (float)ns_msb; - internal->seconds += s_msb; - normalizeTime(internal); + internal->nanoseconds = (float)internal->nanoseconds + + (float)ns_msb; + internal->seconds += s_msb; + normalizeTime(internal); - internal->nanoseconds = -internal->nanoseconds; - internal->seconds = -internal->seconds; + internal->nanoseconds = -internal->nanoseconds; + internal->seconds = -internal->seconds; } - /*End of negative Case*/ + /* End of negative Case */ } -void fromInternalTime(TimeInternal *internal, Timestamp *external) +void +fromInternalTime(TimeInternal * internal, Timestamp * external) { - /*fromInternalTime is only used to convert time given by the system to a timestamp - * As a consequence, no negative value can normally be found in (internal) + /* + * fromInternalTime is only used to convert time given by the system + * to a timestamp As a consequence, no negative value can normally + * be found in (internal) + * + * Note that offsets are also represented with TimeInternal structure, + * and can be negative, but offset are never convert into Timestamp + * so there is no problem here. + */ - * Note that offsets are also represented with TimeInternal structure, and can be negative, - * but offset are never convert into Timestamp so there is no problem here.*/ + if ((internal->seconds & ~INT_MAX) || + (internal->nanoseconds & ~INT_MAX)) { + DBG("Negative value canno't be converted into timestamp \n"); + return; + } else { + external->secondsField.lsb = internal->seconds; + external->nanosecondsField = internal->nanoseconds; + external->secondsField.msb = 0; + } - if ((internal->seconds & ~INT_MAX) || (internal->nanoseconds & ~INT_MAX)) - { - DBG("Negative value canno't be converted into timestamp \n"); - return; - } - else - { - external->secondsField.lsb = internal->seconds; - external->nanosecondsField = internal->nanoseconds; - external->secondsField.msb = 0; - } - } -void toInternalTime(TimeInternal *internal, Timestamp *external) +void +toInternalTime(TimeInternal * internal, Timestamp * external) { - /*Program will not run after 2038...*/ - if (external->secondsField.lsb < INT_MAX) - { + /* Program will not run after 2038... */ + if (external->secondsField.lsb < INT_MAX) { internal->seconds = external->secondsField.lsb; internal->nanoseconds = external->nanosecondsField; + } else { + DBG("Clock servo canno't be executed : " + "seconds field is higher than signed integer (32bits) \n"); + return; } - - else - { - DBG("Clock servo canno't be executed : seconds field is higher than signed integer (32bits) \n"); - return; - } } -void normalizeTime(TimeInternal *r) +void +normalizeTime(TimeInternal * r) { - r->seconds += r->nanoseconds/1000000000; - r->nanoseconds -= r->nanoseconds/1000000000*1000000000; + r->seconds += r->nanoseconds / 1000000000; + r->nanoseconds -= r->nanoseconds / 1000000000 * 1000000000; - if(r->seconds > 0 && r->nanoseconds < 0) - { - r->seconds -= 1; - r->nanoseconds += 1000000000; - } - else if(r->seconds < 0 && r->nanoseconds > 0) - { - r->seconds += 1; - r->nanoseconds -= 1000000000; - } + if (r->seconds > 0 && r->nanoseconds < 0) { + r->seconds -= 1; + r->nanoseconds += 1000000000; + } else if (r->seconds < 0 && r->nanoseconds > 0) { + r->seconds += 1; + r->nanoseconds -= 1000000000; + } } -void addTime(TimeInternal *r, TimeInternal *x, TimeInternal *y) +void +addTime(TimeInternal * r, TimeInternal * x, TimeInternal * y) { - r->seconds = x->seconds + y->seconds; - r->nanoseconds = x->nanoseconds + y->nanoseconds; + r->seconds = x->seconds + y->seconds; + r->nanoseconds = x->nanoseconds + y->nanoseconds; - normalizeTime(r); + normalizeTime(r); } -void subTime(TimeInternal *r, TimeInternal *x, TimeInternal *y) +void +subTime(TimeInternal * r, TimeInternal * x, TimeInternal * y) { - r->seconds = x->seconds - y->seconds; - r->nanoseconds = x->nanoseconds - y->nanoseconds; + r->seconds = x->seconds - y->seconds; + r->nanoseconds = x->nanoseconds - y->nanoseconds; - normalizeTime(r); + normalizeTime(r); } Modified: branches/v2/src/bmc.c =================================================================== --- branches/v2/src/bmc.c 2010-08-09 16:15:36 UTC (rev 67) +++ branches/v2/src/bmc.c 2010-08-17 16:04:41 UTC (rev 68) @@ -1,4 +1,12 @@ -/* bmc.c */ +/** + * @file bmc.c + * @date Wed Jun 23 09:36:09 2010 + * + * @brief Best master clock selection code. + * + * The functions in this file are used by the daemon to select the + * best master clock from any number of possibilities. + */ #include "ptpd.h" @@ -6,14 +14,17 @@ /* Init ptpClock with run time values (initialization constants are in constants.h)*/ void initData(RunTimeOpts *rtOpts, PtpClock *ptpClock) { - int i,j; - j=0; - DBG("initData\n"); - -/* Default data set */ + int i,j; + j=0; + DBG("initData\n"); + + /* Default data set */ ptpClock->twoStepFlag = TWO_STEP_FLAG; - /*init clockIdentity with MAC address and 0xFF and 0xFE. see spec 7.5.2.2.2*/ + /* + * init clockIdentity with MAC address and 0xFF and 0xFE. see + * spec 7.5.2.2.2 + */ for (i=0;i<CLOCK_IDENTITY_LENGTH;i++) { if (i==3) ptpClock->clockIdentity[i]=0xFF; @@ -26,9 +37,11 @@ } ptpClock->numberPorts = NUMBER_PORTS; - ptpClock->clockQuality.clockAccuracy = rtOpts->clockQuality.clockAccuracy; + ptpClock->clockQuality.clockAccuracy = + rtOpts->clockQuality.clockAccuracy; ptpClock->clockQuality.clockClass = rtOpts->clockQuality.clockClass; - ptpClock->clockQuality.offsetScaledLogVariance = rtOpts->clockQuality.offsetScaledLogVariance; + ptpClock->clockQuality.offsetScaledLogVariance = + rtOpts->clockQuality.offsetScaledLogVariance; ptpClock->priority1 = rtOpts->priority1; ptpClock->priority2 = rtOpts->priority2; @@ -36,12 +49,16 @@ ptpClock->domainNumber = rtOpts->domainNumber; ptpClock->slaveOnly = rtOpts->slaveOnly; if(rtOpts->slaveOnly) - rtOpts->clockQuality.clockClass = 255; + rtOpts->clockQuality.clockClass = 255; -/*Port configuration data set */ +/* Port configuration data set */ - /*PortIdentity Init (portNumber = 1 for an ardinary clock spec 7.5.2.3)*/ - memcpy(ptpClock->portIdentity.clockIdentity,ptpClock->clockIdentity,CLOCK_IDENTITY_LENGTH); + /* + * PortIdentity Init (portNumber = 1 for an ardinary clock spec + * 7.5.2.3) + */ + memcpy(ptpClock->portIdentity.clockIdentity,ptpClock->clockIdentity, + CLOCK_IDENTITY_LENGTH); ptpClock->portIdentity.portNumber = NUMBER_PORTS; ptpClock->logMinDelayReqInterval = DEFAULT_DELAYREQ_INTERVAL; @@ -56,7 +73,10 @@ ptpClock->logMinPdelayReqInterval = DEFAULT_PDELAYREQ_INTERVAL; ptpClock->versionNumber = VERSION_PTP; - /*Initialize seed for random number used with Announce Timeout (spec 9.2.6.11)*/ + /* + * Initialize seed for random number used with Announce Timeout + * (spec 9.2.6.11) + */ srand(time(NULL)); ptpClock->R = getRand(); @@ -77,15 +97,20 @@ ptpClock->meanPathDelay.seconds = 0; /*Parent data set*/ - memcpy(ptpClock->parentPortIdentity.clockIdentity,ptpClock->clockIdentity,CLOCK_IDENTITY_LENGTH); + memcpy(ptpClock->parentPortIdentity.clockIdentity, + ptpClock->clockIdentity,CLOCK_IDENTITY_LENGTH); ptpClock->parentPortIdentity.portNumber = 0; ptpClock->parentStats = DEFAULT_PARENTS_STATS; ptpClock->observedParentClockPhaseChangeRate = 0; ptpClock->observedParentOffsetScaledLogVariance = 0; - memcpy(ptpClock->grandmasterIdentity,ptpClock->clockIdentity,CLOCK_IDENTITY_LENGTH); - ptpClock->grandmasterClockQuality.clockAccuracy = ptpClock->clockQuality.clockAccuracy; - ptpClock->grandmasterClockQuality.clockClass = ptpClock->clockQuality.clockClass; - ptpClock->grandmasterClockQuality.offsetScaledLogVariance = ptpClock->clockQuality.offsetScaledLogVariance; + memcpy(ptpClock->grandmasterIdentity,ptpClock->clockIdentity, + CLOCK_IDENTITY_LENGTH); + ptpClock->grandmasterClockQuality.clockAccuracy = + ptpClock->clockQuality.clockAccuracy; + ptpClock->grandmasterClockQuality.clockClass = + ptpClock->clockQuality.clockClass; + ptpClock->grandmasterClockQuality.offsetScaledLogVariance = + ptpClock->clockQuality.offsetScaledLogVariance; ptpClock->grandmasterPriority1 = ptpClock->priority1; ptpClock->grandmasterPriority2 = ptpClock->priority2; @@ -97,22 +122,31 @@ /*Local clock is synchronized to Ebest Table 16 (9.3.5) of the spec*/ void s1(MsgHeader *header,MsgAnnounce *announce,PtpClock *ptpClock) { - /*Current DS*/ + /* Current DS */ ptpClock->stepsRemoved = announce->stepsRemoved + 1; - /*Parent DS*/ - memcpy(ptpClock->parentPortIdentity.clockIdentity,header->sourcePortIdentity.clockIdentity,CLOCK_IDENTITY_LENGTH); - ptpClock->parentPortIdentity.portNumber = header->sourcePortIdentity.portNumber; - memcpy(ptpClock->grandmasterIdentity,announce->grandmasterIdentity,CLOCK_IDENTITY_LENGTH); - ptpClock->grandmasterClockQuality.clockAccuracy = announce->grandmasterClockQuality.clockAccuracy; - ptpClock->grandmasterClockQuality.clockClass = announce->grandmasterClockQuality.clockClass; - ptpClock->grandmasterClockQuality.offsetScaledLogVariance = announce->grandmasterClockQuality.offsetScaledLogVariance; + /* Parent DS */ + memcpy(ptpClock->parentPortIdentity.clockIdentity, + header->sourcePortIdentity.clockIdentity,CLOCK_IDENTITY_LENGTH); + ptpClock->parentPortIdentity.portNumber = + header->sourcePortIdentity.portNumber; + memcpy(ptpClock->grandmasterIdentity,announce->grandmasterIdentity, + CLOCK_IDENTITY_LENGTH); + ptpClock->grandmasterClockQuality.clockAccuracy = + announce->grandmasterClockQuality.clockAccuracy; + ptpClock->grandmasterClockQuality.clockClass = + announce->grandmasterClockQuality.clockClass; + ptpClock->grandmasterClockQuality.offsetScaledLogVariance = + announce->grandmasterClockQuality.offsetScaledLogVariance; ptpClock->grandmasterPriority1 = announce->grandmasterPriority1; ptpClock->grandmasterPriority2 = announce->grandmasterPriority2; - /*Timeproperties DS*/ + /* Timeproperties DS */ ptpClock->currentUtcOffset = announce->currentUtcOffset; - ptpClock->currentUtcOffsetValid = ((header->flagField[1] & 0x04) == 0x04); //"Valid" is bit 2 in second octet of flagfield + /* "Valid" is bit 2 in second octet of flagfield */ + ptpClock->currentUtcOffsetValid = ((header->flagField[1] & 0x04) == + 0x04); + ptpClock->leap59 = ((header->flagField[1] & 0x02) == 0x02); ptpClock->leap61 = ((header->flagField[1] & 0x01) == 0x01); ptpClock->timeTraceable = ((header->flagField[1] & 0x10) == 0x10); @@ -126,13 +160,18 @@ void copyD0(MsgHeader *header, MsgAnnounce *announce, PtpClock *ptpClock) { announce->grandmasterPriority1 = ptpClock->priority1; - memcpy(announce->grandmasterIdentity,ptpClock->clockIdentity,CLOCK_IDENTITY_LENGTH); - announce->grandmasterClockQuality.clockClass = ptpClock->clockQuality.clockClass; - announce->grandmasterClockQuality.clockAccuracy = ptpClock->clockQuality.clockAccuracy; - announce->grandmasterClockQuality.offsetScaledLogVariance = ptpClock->clockQuality.offsetScaledLogVariance; + memcpy(announce->grandmasterIdentity,ptpClock->clockIdentity, + CLOCK_IDENTITY_LENGTH); + announce->grandmasterClockQuality.clockClass = + ptpClock->clockQuality.clockClass; + announce->grandmasterClockQuality.clockAccuracy = + ptpClock->clockQuality.clockAccuracy; + announce->grandmasterClockQuality.offsetScaledLogVariance = + ptpClock->clockQuality.offsetScaledLogVariance; announce->grandmasterPriority2 = ptpClock->priority2; announce->stepsRemoved = 0; - memcpy(header->sourcePortIdentity.clockIdentity,ptpClock->clockIdentity,CLOCK_IDENTITY_LENGTH); + memcpy(header->sourcePortIdentity.clockIdentity, + ptpClock->clockIdentity,CLOCK_IDENTITY_LENGTH); } @@ -145,274 +184,190 @@ DBGV("Data set comparison \n"); short comp = 0; /*Identity comparison*/ - if (!memcmp(announceA->grandmasterIdentity,announceB->grandmasterIdentity,CLOCK_IDENTITY_LENGTH)) - { - //Algorithm part2 Fig 28 - if (announceA->stepsRemoved > announceB->stepsRemoved+1) - { + if (!memcmp(announceA->grandmasterIdentity, + announceB->grandmasterIdentity,CLOCK_IDENTITY_LENGTH)){ + /* Algorithm part2 Fig 28 */ + if (announceA->stepsRemoved > announceB->stepsRemoved+1) { return 1; } - else if (announceB->stepsRemoved > announceA->stepsRemoved+1) - { + else if (announceB->stepsRemoved > announceA->stepsRemoved+1) { return -1; - } - else //A within 1 of B - { - if (announceA->stepsRemoved > announceB->stepsRemoved) - { - if (!memcmp(headerA->sourcePortIdentity.clockIdentity,ptpClock->parentPortIdentity.clockIdentity,CLOCK_IDENTITY_LENGTH)) - { + } else { /* A within 1 of B */ + if (announceA->stepsRemoved > announceB->stepsRemoved) { + if (!memcmp(headerA->sourcePortIdentity.clockIdentity,ptpClock->parentPortIdentity.clockIdentity,CLOCK_IDENTITY_LENGTH)) { DBG("Sender=Receiver : Error -1"); return 0; - } - else - { + } else { return 1; } - - } - else if (announceB->stepsRemoved > announceA->stepsRemoved) - { - if (!memcmp(headerB->sourcePortIdentity.clockIdentity,ptpClock->parentPortIdentity.clockIdentity,CLOCK_IDENTITY_LENGTH)) - { + } else if (announceB->stepsRemoved > + announceA->stepsRemoved) { + if (!memcmp(headerB->sourcePortIdentity.clockIdentity,ptpClock->parentPortIdentity.clockIdentity,CLOCK_IDENTITY_LENGTH)) { DBG("Sender=Receiver : Error -1"); return 0; - } - else - { + } else { return -1; } } - else // steps removed A = steps removed B - { - if (!memcmp(headerA->sourcePortIdentity.clockIdentity,headerB->sourcePortIdentity.clockIdentity,CLOCK_IDENTITY_LENGTH)) - { + else { /* steps removed A = steps removed B */ + if (!memcmp(headerA->sourcePortIdentity.clockIdentity,headerB->sourcePortIdentity.clockIdentity,CLOCK_IDENTITY_LENGTH)) { DBG("Sender=Receiver : Error -2"); return 0; - } - else if ((memcmp(headerA->sourcePortIdentity.clockIdentity,headerB->sourcePortIdentity.clockIdentity,CLOCK_IDENTITY_LENGTH))<0) - { + } else if ((memcmp(headerA->sourcePortIdentity.clockIdentity, + headerB->sourcePortIdentity.clockIdentity, + CLOCK_IDENTITY_LENGTH))<0) { return -1; - } - else - { + } else { return 1; } } } - } - else //GrandMaster are not identical - { - - if(announceA->grandmasterPriority1 == announceB->grandmasterPriority1) - { - - if (announceA->grandmasterClockQuality.clockClass == announceB->grandmasterClockQuality.clockClass) - { - - if (announceA->grandmasterClockQuality.clockAccuracy == announceB->grandmasterClockQuality.clockAccuracy) - { - - if (announceA->grandmasterClockQuality.offsetScaledLogVariance == announceB->grandmasterClockQuality.offsetScaledLogVariance) - { - if (announceA->grandmasterPriority2 == announceB->grandmasterPriority2) - { + } else { /* GrandMaster are not identical */ + if(announceA->grandmasterPriority1 == + announceB->grandmasterPriority1) { + if (announceA->grandmasterClockQuality.clockClass == + announceB->grandmasterClockQuality.clockClass) { + if (announceA->grandmasterClockQuality.clockAccuracy == announceB->grandmasterClockQuality.clockAccuracy) { + if (announceA->grandmasterClockQuality.offsetScaledLogVariance == announceB->grandmasterClockQuality.offsetScaledLogVariance) { + if (announceA->grandmasterPriority2 == announceB->grandmasterPriority2) { comp = memcmp(announceA->grandmasterIdentity,announceB->grandmasterIdentity,CLOCK_IDENTITY_LENGTH); if (comp < 0) - { return -1; - } else if (comp > 0) - { return 1; - } else - { return 0; - } - } - else //Priority2 are not identical - { + } else { +/* Priority2 are not identical */ comp =memcmp(&announceA->grandmasterPriority2,&announceB->grandmasterPriority2,1); if (comp < 0) - { return -1; - } else if (comp > 0) - { return 1; - } else - { return 0; - } } - } - - else //offsetScaledLogVariance are not identical - { + } else { +/* offsetScaledLogVariance are not identical */ comp= memcmp(&announceA->grandmasterClockQuality.clockClass,&announceB->grandmasterClockQuality.clockClass,1); if (comp < 0) - { return -1; - } else if (comp > 0) - { return 1; - } else - { return 0; - } } - } - - else // Accuracy are not identitcal - { + } else { /* Accuracy are not identitcal */ comp = memcmp(&announceA->grandmasterClockQuality.clockAccuracy,&announceB->grandmasterClockQuality.clockAccuracy,1); if (comp < 0) - { return -1; - } else if (comp > 0) - { return 1; - } else - { return 0; - } } - - } - - else //ClockClass are not identical - { + } else { /* ClockClass are not identical */ comp = memcmp(&announceA->grandmasterClockQuality.clockClass,&announceB->grandmasterClockQuality.clockClass,1); if (comp < 0) - { return -1; - } else if (comp > 0) - { return 1; - } else - { return 0; - } } - } - - else // Priority1 are not identical - { + } else { /* Priority1 are not identical */ comp = memcmp(&announceA->grandmasterPriority1,&announceB->grandmasterPriority1,1); if (comp < 0) - { return -1; - } else if (comp > 0) - { return 1; - } else - { return 0; - } } - } - } /*State decision algorithm 9.3.3 Fig 26*/ -UInteger8 bmcStateDecision (MsgHeader *header,MsgAnnounce *announce,RunTimeOpts *rtOpts,PtpClock *ptpClock) +UInteger8 +bmcStateDecision(MsgHeader *header, MsgAnnounce *announce, + RunTimeOpts *rtOpts, PtpClock *ptpClock) { - if (rtOpts->slaveOnly) - { + if (rtOpts->slaveOnly) { s1(header,announce,ptpClock); return PTP_SLAVE; } - if ((!ptpClock->number_foreign_records) && (ptpClock->portState == PTP_LISTENING)) - { + if ((!ptpClock->number_foreign_records) && + (ptpClock->portState == PTP_LISTENING)) return PTP_LISTENING; - } copyD0(&ptpClock->msgTmpHeader,&ptpClock->msgTmp.announce,ptpClock); - if (ptpClock->clockQuality.clockClass<128) - { - if ((bmcDataSetComparison(&ptpClock->msgTmpHeader,&ptpClock->msgTmp.announce,header,announce,ptpClock)<0)) - { + if (ptpClock->clockQuality.clockClass<128) { + if ((bmcDataSetComparison(&ptpClock->msgTmpHeader, + &ptpClock->msgTmp.announce, + header,announce,ptpClock)<0)) { m1(ptpClock); return PTP_MASTER; - } - else if ((bmcDataSetComparison(&ptpClock->msgTmpHeader,&ptpClock->msgTmp.announce,header,announce,ptpClock)>0)) - { + } else if ((bmcDataSetComparison(&ptpClock->msgTmpHeader, + &ptpClock->msgTmp.announce, + header,announce,ptpClock)>0)) { s1(header,announce,ptpClock); return PTP_PASSIVE; - } - else - { + } else { DBG("Error in bmcDataSetComparison..\n"); } - } - - else - { - if ((bmcDataSetComparison(&ptpClock->msgTmpHeader,&ptpClock->msgTmp.announce,header,announce,ptpClock))<0) - { + } else { + if ((bmcDataSetComparison(&ptpClock->msgTmpHeader, + &ptpClock->msgTmp.announce, + header,announce,ptpClock))<0) { m1(ptpClock); return PTP_MASTER; - } - else if ((bmcDataSetComparison(&ptpClock->msgTmpHeader,&ptpClock->msgTmp.announce,header,announce,ptpClock)>0)) - { + } else if ((bmcDataSetComparison(&ptpClock->msgTmpHeader, + &ptpClock->msgTmp.announce, + header,announce,ptpClock)>0)) { s1(header,announce,ptpClock); return PTP_SLAVE; - } - else - { + } else { DBG("Error in bmcDataSetComparison..\n"); } - } - // MB: Is this the return code below correct? - // Anyway, it's a valid return code. + /* MB: Is this the return code below correct? */ + /* Anyway, it's a valid return code. */ return PTP_FAULTY; } -UInteger8 bmc(ForeignMasterRecord *foreignMaster,RunTimeOpts *rtOpts ,PtpClock *ptpClock ) +UInteger8 +bmc(ForeignMasterRecord *foreignMaster, + RunTimeOpts *rtOpts, PtpClock *ptpClock) { Integer16 i,best; if (!ptpClock->number_foreign_records) - { - if (ptpClock->portState == PTP_MASTER) - { + if (ptpClock->portState == PTP_MASTER) { m1(ptpClock); return ptpClock->portState; } - } for (i=1,best = 0; i<ptpClock->number_foreign_records;i++) - { - if ((bmcDataSetComparison(&foreignMaster[i].header,&foreignMaster[i].announce, - &foreignMaster[best].header,&foreignMaster[best].announce,ptpClock)) < 0) - { + if ((bmcDataSetComparison(&foreignMaster[i].header, + &foreignMaster[i].announce, + &foreignMaster[best].header, + &foreignMaster[best].announce, + ptpClock)) < 0) best = i; - } - } DBGV("Best record : %d \n",best); ptpClock->foreign_record_best = best; - return bmcStateDecision(&foreignMaster[best].header,&foreignMaster[best].announce,rtOpts,ptpClock); + return (bmcStateDecision(&foreignMaster[best].header, + &foreignMaster[best].announce, + rtOpts,ptpClock)); } Modified: branches/v2/src/dep/msg.c =================================================================== --- branches/v2/src/dep/msg.c 2010-08-09 16:15:36 UTC (rev 67) +++ branches/v2/src/dep/msg.c 2010-08-17 16:04:41 UTC (rev 68) @@ -1,207 +1,274 @@ -/* msg.c */ +/** + * @file msg.c + * @author George Neville-Neil <gn...@ne...> + * @date Tue Jul 20 16:17:05 2010 + * + * @brief Functions to pack and unpack messages. + * + * See spec annex d + */ - #include "../ptpd.h" - /*Unpack Header from IN buffer to msgTmpHeader field */ -void msgUnpackHeader(void *buf, MsgHeader *header) +void +msgUnpackHeader(void *buf, MsgHeader * header) { - header->transportSpecific = (*(Nibble*)(buf+0))>>4; - header->messageType = (*(Enumeration4*)(buf+0)) & 0x0F; - header->versionPTP = (*(UInteger4*)(buf+1)) & 0x0F; //force reserved bit to zero if not - header->messageLength = flip16(*(UInteger16*)(buf+2)); - header->domainNumber = (*(UInteger8*)(buf+4)); - memcpy(header->flagField,(buf+6),FLAG_FIELD_LENGTH); - memcpy(&header->correctionfield.msb,(buf+8),4); - memcpy(&header->correctionfield.lsb,(buf+12),4); - header->correctionfield.msb=flip32(header->correctionfield.msb); - header->correctionfield.lsb=flip32(header->correctionfield.lsb); - memcpy(header->sourcePortIdentity.clockIdentity,(buf+20),CLOCK_IDENTITY_LENGTH); - header->sourcePortIdentity.portNumber = flip16(*(UInteger16*)(buf+28)); - header->sequenceId = flip16(*(UInteger16*)(buf+30)); - header->controlField = (*(UInteger8*)(buf+32)); - header->logMessageInterval = (*(Integer8*)(buf+33)); + header->transportSpecific = (*(Nibble *) (buf + 0)) >> 4; + header->messageType = (*(Enumeration4 *) (buf + 0)) & 0x0F; + header->versionPTP = (*(UInteger4 *) (buf + 1)) & 0x0F; + /* force reserved bit to zero if not */ + header->messageLength = flip16(*(UInteger16 *) (buf + 2)); + header->domainNumber = (*(UInteger8 *) (buf + 4)); + memcpy(header->flagField, (buf + 6), FLAG_FIELD_LENGTH); + memcpy(&header->correctionfield.msb, (buf + 8), 4); + memcpy(&header->correctionfield.lsb, (buf + 12), 4); + header->correctionfield.msb = flip32(header->correctionfield.msb); + header->correctionfield.lsb = flip32(header->correctionfield.lsb); + memcpy(header->sourcePortIdentity.clockIdentity, (buf + 20), + CLOCK_IDENTITY_LENGTH); + header->sourcePortIdentity.portNumber = + flip16(*(UInteger16 *) (buf + 28)); + header->sequenceId = flip16(*(UInteger16 *) (buf + 30)); + header->controlField = (*(UInteger8 *) (buf + 32)); + header->logMessageInterval = (*(Integer8 *) (buf + 33)); } + /*Pack header message into OUT buffer of ptpClock*/ -void msgPackHeader(void *buf, PtpClock *ptpClock) +void +msgPackHeader(void *buf, PtpClock * ptpClock) { - Nibble transport= 0x80; //(spec annex D) - *(UInteger8*)(buf+0) = transport; - *(UInteger4*)(buf+1) = ptpClock->versionNumber; - *(UInteger8*)(buf+4) = ptpClock->domainNumber; + Nibble transport = 0x80; + /* (spec annex D) */ + *(UInteger8 *) (buf + 0) = transport; + *(UInteger4 *) (buf + 1) = ptpClock->versionNumber; + *(UInteger8 *) (buf + 4) = ptpClock->domainNumber; + if (ptpClock->twoStepFlag) - *(UInteger8*)(buf+6) = TWO_STEP_FLAG; + *(UInteger8 *) (buf + 6) = TWO_STEP_FLAG; - memset((buf+8),0,8); - memcpy((buf+20),ptpClock->portIdentity.clockIdentity,CLOCK_IDENTITY_LENGTH); - *(UInteger16*)(buf+28) = flip16(ptpClock->portIdentity.portNumber); - *(UInteger8*)(buf+33) = 0x7F; //Default value (spec Table 24) - + memset((buf + 8), 0, 8); + memcpy((buf + 20), ptpClock->portIdentity.clockIdentity, + CLOCK_IDENTITY_LENGTH); + *(UInteger16 *) (buf + 28) = flip16(ptpClock->portIdentity.portNumber); + *(UInteger8 *) (buf + 33) = 0x7F; + /* Default value(spec Table 24) */ } /*Pack SYNC message into OUT buffer of ptpClock*/ -void msgPackSync(void *buf,Timestamp *originTimestamp,PtpClock *ptpClock) +void +msgPackSync(void *buf, Timestamp * originTimestamp, PtpClock * ptpClock) { - /*changes in header*/ - *(char*)(buf+0)= *(char*)(buf+0) & 0xF0; //RAZ messageType - *(char*)(buf+0)= *(char*)(buf+0) | 0x00; //Table 19 - *(UInteger16*)(buf+2) = flip16(SYNC_LENGTH); - *(UInteger16*)(buf+30)=flip16(ptpClock->sentSyncSequenceId); - *(UInteger8*)(buf+32)=0x00; //Table 23 - *(Integer8*)(buf+33) = ptpClock->logSyncInterval; - memset((buf+8),0,8); + /* changes in header */ + *(char *)(buf + 0) = *(char *)(buf + 0) & 0xF0; + /* RAZ messageType */ + *(char *)(buf + 0) = *(char *)(buf + 0) | 0x00; + /* Table 19 */ + *(UInteger16 *) (buf + 2) = flip16(SYNC_LENGTH); + *(UInteger16 *) (buf + 30) = flip16(ptpClock->sentSyncSequenceId); + *(UInteger8 *) (buf + 32) = 0x00; + /* Table 23 */ + *(Integer8 *) (buf + 33) = ptpClock->logSyncInterval; + memset((buf + 8), 0, 8); - /*Sync message*/ - *(UInteger16*)(buf+34) = flip16(originTimestamp->secondsField.msb); - *(UInteger32*)(buf+36) = flip32(originTimestamp->secondsField.lsb); - *(UInteger32*)(buf+40) = flip32(originTimestamp->nanosecondsField); + /* Sync message */ + *(UInteger16 *) (buf + 34) = flip16(originTimestamp->secondsField.msb); + *(UInteger32 *) (buf + 36) = flip32(originTimestamp->secondsField.lsb); + *(UInteger32 *) (buf + 40) = flip32(originTimestamp->nanosecondsField); } /*Unpack Sync message from IN buffer */ -void msgUnpackSync(void *buf,MsgSync *sync) +void +msgUnpackSync(void *buf, MsgSync * sync) { - sync->originTimestamp.secondsField.msb = flip16(*(UInteger16*)(buf+34)); - sync->originTimestamp.secondsField.lsb = flip32(*(UInteger32*)(buf+36)); - sync->originTimestamp.nanosecondsField = flip32(*(UInteger32*)(buf+40)); + sync->originTimestamp.secondsField.msb = + flip16(*(UInteger16 *) (buf + 34)); + sync->originTimestamp.secondsField.lsb = + flip32(*(UInteger32 *) (buf + 36)); + sync->originTimestamp.nanosecondsField = + flip32(*(UInteger32 *) (buf + 40)); } /*Pack Announce message into OUT buffer of ptpClock*/ -void msgPackAnnounce(void *buf,PtpClock *ptpClock) +void +msgPackAnnounce(void *buf, PtpClock * ptpClock) { - /*changes in header*/ - *(char*)(buf+0)= *(char*)(buf+0) & 0xF0; //RAZ messageType - *(char*)(buf+0)= *(char*)(buf+0) | 0x0B; //Table 19 - *(UInteger16*)(buf+2) = flip16(ANNOUNCE_LENGTH); - *(UInteger16*)(buf+30)=flip16(ptpClock->sentAnnounceSequenceId); - *(UInteger8*)(buf+32)=0x05; //Table 23 - *(Integer8*)(buf+33) = ptpClock->logAnnounceInterval; + /* changes in header */ + *(char *)(buf + 0) = *(char *)(buf + 0) & 0xF0; + /* RAZ messageType */ + *(char *)(buf + 0) = *(char *)(buf + 0) | 0x0B; + /* Table 19 */ + *(UInteger16 *) (buf + 2) = flip16(ANNOUNCE_LENGTH); + *(UInteger16 *) (buf + 30) = flip16(ptpClock->sentAnnounceSequenceId); + *(UInteger8 *) (buf + 32) = 0x05; + /* Table 23 */ + *(Integer8 *) (buf + 33) = ptpClock->logAnnounceInterval; - /*Announce message*/ - memset((buf+34),0,10); - *(Integer16*)(buf+44)=flip16(ptpClock->currentUtcOffset); - *(UInteger8*)(buf+47)=ptpClock->grandmasterPriority1; - *(UInteger8*)(buf+48)=ptpClock->clockQuality.clockClass; - *(Enumeration8*)(buf+49)=ptpClock->clockQuality.clockAccuracy; - *(UInteger16*)(buf+50)=flip16(ptpClock->clockQuality.offsetScaledLogVariance); - *(UInteger8*)(buf+52)=ptpClock->grandmasterPriority2; - memcpy((buf+53),ptpClock->grandmasterIdentity,CLOCK_IDENTITY_LENGTH); - *(UInteger16*)(buf+61)=flip16(ptpClock->stepsRemoved); - *(Enumeration8*)(buf+63)=ptpClock->timeSource; + /* Announce message */ + memset((buf + 34), 0, 10); + *(Integer16 *) (buf + 44) = flip16(ptpClock->currentUtcOffset); + *(UInteger8 *) (buf + 47) = ptpClock->grandmasterPriority1; + *(UInteger8 *) (buf + 48) = ptpClock->clockQuality.clockClass; + *(Enumeration8 *) (buf + 49) = ptpClock->clockQuality.clockAccuracy; + *(UInteger16 *) (buf + 50) = + flip16(ptpClock->clockQuality.offsetScaledLogVariance); + *(UInteger8 *) (buf + 52) = ptpClock->grandmasterPriority2; + memcpy((buf + 53), ptpClock->grandmasterIdentity, CLOCK_IDENTITY_LENGTH); + *(UInteger16 *) (buf + 61) = flip16(ptpClock->stepsRemoved); + *(Enumeration8 *) (buf + 63) = ptpClock->timeSource; } /*Unpack Announce message from IN buffer of ptpClock to msgtmp.Announce*/ -void msgUnpackAnnounce(void *buf,MsgAnnounce *announce) +void +msgUnpackAnnounce(void *buf, MsgAnnounce * announce) { - announce->originTimestamp.secondsField.msb = flip16(*(UInteger16*)(buf+34)); - announce->originTimestamp.secondsField.lsb = flip32(*(UInteger32*)(buf+36)); - announce->originTimestamp.nanosecondsField = flip32(*(UInteger32*)(buf+40)); - announce->currentUtcOffset = flip16(*(UInteger16*)(buf+44)); - announce->grandmasterPriority1 = *(UInteger8*)(buf+47); - announce->grandmasterClockQuality.clockClass = *(UInteger8*)(buf+48); - announce->grandmasterClockQuality.clockAccuracy = *(Enumeration8*)(buf+49); - announce->grandmasterClockQuality.offsetScaledLogVariance = flip16(*(UInteger16*)(buf+50)); - announce->grandmasterPriority2 = *(UInteger8*)(buf+52); - memcpy(announce->grandmasterIdentity,(buf+53),CLOCK_IDENTITY_LENGTH); - announce->stepsRemoved = flip16(*(UInteger16*)(buf+61)); - announce->timeSource = *(Enumeration8*)(buf+63); + announce->originTimestamp.secondsField.msb = + flip16(*(UInteger16 *) (buf + 34)); + announce->originTimestamp.secondsField.lsb = + flip32(*(UInteger32 *) (buf + 36)); + announce->originTimestamp.nanosecondsField = + flip32(*(UInteger32 *) (buf + 40)); + announce->currentUtcOffset = flip16(*(UInteger16 *) (buf + 44)); + announce->grandmasterPriority1 = *(UInteger8 *) (buf + 47); + announce->grandmasterClockQuality.clockClass = + *(UInteger8 *) (buf + 48); + announce->grandmasterClockQuality.clockAccuracy = + *(Enumeration8 *) (buf + 49); + announce->grandmasterClockQuality.offsetScaledLogVariance = + flip16(*(UInteger16 *) (buf + 50)); + announce->grandmasterPriority2 = *(UInteger8 *) (buf + 52); + memcpy(announce->grandmasterIdentity, (buf + 53), + CLOCK_IDENTITY_LENGTH); + announce->stepsRemoved = flip16(*(UInteger16 *) (buf + 61)); + announce->timeSource = *(Enumeration8 *) (buf + 63); } /*pack Follow_up message into OUT buffer of ptpClock*/ -void msgPackFollowUp(void *buf,Timestamp *preciseOriginTimestamp,PtpClock *ptpClock) +void +msgPackFollowUp(void *buf, Timestamp * preciseOriginTimestamp, PtpClock * ptpClock) { - /*changes in header*/ - *(char*)(buf+0)= *(char*)(buf+0) & 0xF0; //RAZ messageType - *(char*)(buf+0)= *(char*)(buf+0) | 0x08; //Table 19 - *(UInteger16*)(buf+2) = flip16(FOLLOW_UP_LENGTH); - *(UInteger16*)(buf+30)=flip16(ptpClock->sentSyncSequenceId-1);//sentSyncSequenceId has already been incremented in "issueSync" - *(UInteger8*)(buf+32)=0x02; //Table 23 - *(Integer8*)(buf+33) = ptpClock->logSyncInterval; + /* changes in header */ + *(char *)(buf + 0) = *(char *)(buf + 0) & 0xF0; + /* RAZ messageType */ + *(char *)(buf + 0) = *(char *)(buf + 0) | 0x08; + /* Table 19 */ + *(UInteger16 *) (buf + 2) = flip16(FOLLOW_UP_LENGTH); + *(UInteger16 *) (buf + 30) = flip16(ptpClock->sentSyncSequenceId - 1); + /* sentSyncSequenceId has already been incremented in "issueSync" */ + *(UInteger8 *) (buf + 32) = 0x02; + /* Table 23 */ + *(Integer8 *) (buf + 33) = ptpClock->logSyncInterval; - /*Follow_up message*/ - *(UInteger16*)(buf+34) = flip16(preciseOriginTimestamp->secondsField.msb); - *(UInteger32*)(buf+36) = flip32(preciseOriginTimestamp->secondsField.lsb); - *(UInteger32*)(buf+40) = flip32(preciseOriginTimestamp->nanosecondsField); + /* Follow_up message */ + *(UInteger16 *) (buf + 34) = + flip16(preciseOriginTimestamp->secondsField.msb); + *(UInteger32 *) (buf + 36) = + flip32(preciseOriginTimestamp->secondsField.lsb); + *(UInteger32 *) (buf + 40) = + flip32(preciseOriginTimestamp->nanosecondsField); } /*Unpack Follow_up message from IN buffer of ptpClock to msgtmp.follow*/ -void msgUnpackFollowUp(void *buf,MsgFollowUp *follow) +void +msgUnpackFollowUp(void *buf, MsgFollowUp * follow) { - follow->preciseOriginTimestamp.secondsField.msb = flip16(*(UInteger16*)(buf+34)); - follow->preciseOriginTimestamp.secondsField.lsb = flip32(*(UInteger32*)(buf+36)); - follow->preciseOriginTimestamp.nanosecondsField = flip32(*(UInteger32*)(buf+40)); + follow->preciseOriginTimestamp.secondsField.msb = + flip16(*(UInteger16 *) (buf + 34)); + follow->preciseOriginTimestamp.secondsField.lsb = + flip32(*(UInteger32 *) (buf + 36)); + follow->preciseOriginTimestamp.nanosecondsField = + flip32(*(UInteger32 *) (buf + 40)); } /*pack PdelayReq message into OUT buffer of ptpClock*/ -void msgPackPDelayReq(void *buf,Timestamp *originTimestamp,PtpClock *ptpClock) +void +msgPackPDelayReq(void *buf, Timestamp * originTimestamp, PtpClock * ptpClock) { - /*changes in header*/ - *(char*)(buf+0)= *(char*)(buf+0) & 0xF0; //RAZ messageType - *(char*)(buf+0)= *(char*)(buf+0) | 0x02; //Table 19 - *(UInteger16*)(buf+2) = flip16(PDELAY_REQ_LENGTH); - *(UInteger16*)(buf+30)= flip16(ptpClock->sentPDelayReqSequenceId); - *(UInteger8*)(buf+32) = 0x05; //Table 23 - *(Integer8*)(buf+33) = 0x7F; //Table 24 - memset((buf+8),0,8); + /* changes in header */ + *(char *)(buf + 0) = *(char *)(buf + 0) & 0xF0; + /* RAZ messageType */ + *(char *)(buf + 0) = *(char *)(buf + 0) | 0x02; + /* Table 19 */ + *(UInteger16 *) (buf + 2) = flip16(PDELAY_REQ_LENGTH); + *(UInteger16 *) (buf + 30) = flip16(ptpClock->sentPDelayReqSequenceId); + *(UInteger8 *) (buf + 32) = 0x05; + /* Table 23 */ + *(Integer8 *) (buf + 33) = 0x7F; + /* Table 24 */ + memset((buf + 8), 0, 8); - /*Pdelay_req message*/ - *(UInteger16*)(buf+34) = flip16(originTimestamp->secondsField.msb); - *(UInteger32*)(buf+36) = flip32(originTimestamp->secondsField.lsb); - *(UInteger32*)(buf+40) = flip32(originTimestamp->nanosecondsField); + /* Pdelay_req message */ + *(UInteger16 *) (buf + 34) = flip16(originTimestamp->secondsField.msb); + *(UInteger32 *) (buf + 36) = flip32(originTimestamp->secondsField.lsb); + *(UInteger32 *) (buf + 40) = flip32(originTimestamp->nanosecondsField); - memset((buf+44),0,10); // RAZ reserved octets + memset((buf + 44), 0, 10); + /* RAZ reserved octets */ } /*pack delayReq message into OUT buffer of ptpClock*/ -void msgPackDelayReq(void *buf,Timestamp *originTimestamp,PtpClock *ptpClock) +void +msgPackDelayReq(void *buf, Timestamp * originTimestamp, PtpClock * ptpClock) { - /*changes in header*/ - *(char*)(buf+0)= *(char*)(buf+0) & 0xF0; //RAZ messageType - *(char*)(buf+0)= *(char*)(buf+0) | 0x01; //Table 19 - *(UInteger16*)(buf+2) = flip16(DELAY_REQ_LENGTH); - *(UInteger16*)(buf+30)= flip16(ptpClock->sentDelayReqSequenceId); - *(UInteger8*)(buf+32) = 0x01; //Table 23 - *(Integer8*)(buf+33) = 0x7F; //Table 24 - memset((buf+8),0,8); + /* changes in header */ + *(char *)(buf + 0) = *(char *)(buf + 0) & 0xF0; + /* RAZ messageType */ + *(char *)(buf + 0) = *(char *)(buf + 0) | 0x01; + /* Table 19 */ + *(UInteger16 *) (buf + 2) = flip16(DELAY_REQ_LENGTH); + *(UInteger16 *) (buf + 30) = flip16(ptpClock->sentDelayReqSequenceId); + *(UInteger8 *) (buf + 32) = 0x01; + /* Table 23 */ + *(Integer8 *) (buf + 33) = 0x7F; + /* Table 24 */ + memset((buf + 8), 0, 8); - /*Pdelay_req message*/ - *(UInteger16*)(buf+34) = flip16(originTimestamp->secondsField.msb); - *(UInteger32*)(buf+36) = flip32(originTimestamp->secondsField.lsb); - *(UInteger32*)(buf+40) = flip32(originTimestamp->nanosecondsField); + /* Pdelay_req message */ + *(UInteger16 *) (buf + 34) = flip16(originTimestamp->secondsField.msb); + *(UInteger32 *) (buf + 36) = flip32(originTimestamp->secondsField.lsb); + *(UInteger32 *) (buf + 40) = flip32(originTimestamp->nanosecondsField); } /*pack delayResp message into OUT buffer of ptpClock*/ -void msgPackDelayResp(void *buf,MsgHeader *header,Timestamp *receiveTimestamp,PtpClock *ptpClock) +void +msgPackDelayResp(void *buf, MsgHeader * header, Timestamp * receiveTimestamp, PtpClock * ptpClock) { - /*changes in header*/ - *(char*)(buf+0)= *(char*)(buf+0) & 0xF0; //RAZ messageType - *(char*)(buf+0)= *(char*)(buf+0) | 0x09; //Table 19 - *(UInteger16*)(buf+2) = flip16(DELAY_RESP_LENGTH); - *(UInteger8*)(buf+4) = header->domainNumber; - memset((buf+8),0,8); + /* changes in header */ + *(char *)(buf + 0) = *(char *)(buf + 0) & 0xF0; + /* RAZ messageType */ + *(char *)(buf + 0) = *(char *)(buf + 0) | 0x09; + /* Table 19 */ + *(UInteger16 *) (buf + 2) = flip16(DELAY_RESP_LENGTH); + *(UInteger8 *) (buf + 4) = header->domainNumber; + memset((buf + 8), 0, 8); - /*Copy correctionField of PdelayReqMessage*/ - *(Integer32*)(buf+8) = flip32(header->correctionfield.msb); - *(Integer32*)(buf+12) = flip32(header->correctionfield.lsb); + /* Copy correctionField of PdelayReqMessage */ + *(Integer32 *) (buf + 8) = flip32(header->correctionfield.msb); + *(Integer32 *) (buf + 12) = flip32(header->correctionfield.lsb); - *(UInteger16*)(buf+30)= flip16(header->sequenceId); + *(UInteger16 *) (buf + 30) = flip16(header->sequenceId); + + *(UInteger8 *) (buf + 32) = 0x03; + /* Table 23 */ + *(Integer8 *) (buf + 33) = ptpClock->logMinDelayReqInterval; + /* Table 24 */ - *(UInteger8*)(buf+32) = 0x03; //Table 23 - *(Integer8*)(buf+33) = ptpClock->logMinDelayReqInterval; //Table 24 - - /*Pdelay_resp message*/ - *(UInteger16*)(buf+34) = flip16(receiveTimestamp->secondsField.msb); - *(UInteger32*)(buf+36) = flip32(receiveTimestamp->secondsField.lsb); - *(UInteger32*)(buf+40) = flip32(receiveTimestamp->nanosecondsField); - memcpy((buf+44),header->sourcePortIdentity.clockIdentity,CLOCK_IDENTITY_LENGTH); - *(UInteger16*)(buf+52) = flip16(header->sourcePortIdentity.portNumber); + /* Pdelay_resp message */ + *(UInteger16 *) (buf + 34) = + flip16(receiveTimestamp->secondsField.msb); + *(UInteger32 *) (buf + 36) = flip32(receiveTimestamp->secondsField.lsb); + *(UInteger32 *) (buf + 40) = flip32(receiveTimestamp->nanosecondsField); + memcpy((buf + 44), header->sourcePortIdentity.clockIdentity, + CLOCK_IDENTITY_LENGTH); + *(UInteger16 *) (buf + 52) = + flip16(header->sourcePortIdentity.portNumber); } @@ -209,99 +276,140 @@ /*pack PdelayResp message into OUT buffer of ptpClock*/ -void msgPackPDelayResp(void *buf,MsgHeader *header,Timestamp *requestReceiptTimestamp,PtpClock *ptpClock) +void +msgPackPDelayResp(void *buf, MsgHeader * header, Timestamp * requestReceiptTimestamp, PtpClock * ptpClock) { - /*changes in header*/ - *(char*)(buf+0)= *(char*)(buf+0) & 0xF0; //RAZ messageType - *(char*)(buf+0)= *(char*)(buf+0) | 0x03; //Table 19 - *(UInteger16*)(buf+2) = flip16(PDELAY_RESP_LENGTH); - *(UInteger8*)(buf+4) = header->domainNumber; - memset((buf+8),0,8); + /* changes in header */ + *(char *)(buf + 0) = *(char *)(buf + 0) & 0xF0; + /* RAZ messageType */ + *(char *)(buf + 0) = *(char *)(buf + 0) | 0x03; + /* Table 19 */ + *(UInteger16 *) (buf + 2) = flip16(PDELAY_RESP_LENGTH); + *(UInteger8 *) (buf + 4) = header->domainNumber; + memset((buf + 8), 0, 8); - *(UInteger16*)(buf+30)= flip16(header->sequenceId); + *(UInteger16 *) (buf + 30) = flip16(header->sequenceId); - *(UInteger8*)(buf+32) = 0x05; //Table 23 - *(Integer8*)(buf+33) = 0x7F; //Table 24 + *(UInteger8 *) (buf + 32) = 0x05; + /* Table 23 */ + *(Integer8 *) (buf + 33) = 0x7F; + /* Table 24 */ - /*Pdelay_resp message*/ - *(UInteger16*)(buf+34) = flip16(requestReceiptTimestamp->secondsField.msb); - *(UInteger32*)(buf+36) = flip32(requestReceiptTimestamp->secondsField.lsb); - *(UInteger32*)(buf+40) = flip32(requestReceiptTimestamp->nanosecondsField); - memcpy((buf+44),header->sourcePortIdentity.clockIdentity,CLOCK_IDENTITY_LENGTH); - *(UInteger16*)(buf+52) = flip16(header->sourcePortIdentity.portNumber); + /* Pdelay_resp message */ + *(UInteger16 *) (buf + 34) = flip16(requestReceiptTimestamp->secondsField.msb); + *(UInteger32 *) (buf + 36) = flip32(requestReceiptTimestamp->secondsField.lsb); + *(UInteger32 *) (buf + 40) = flip32(requestReceiptTimestamp->nanosecondsField); + memcpy((buf + 44), header->sourcePortIdentity.clockIdentity, CLOCK_IDENTITY_LENGTH); + *(UInteger16 *) (buf + 52) = flip16(header->sourcePortIdentity.portNumber); } /*Unpack delayReq message from IN buffer of ptpClock to msgtmp.req*/ -void msgUnpackDelayReq(void *buf,MsgDelayReq *delayreq) +void +msgUnpackDelayReq(void *buf, MsgDelayReq * delayreq) { - delayreq->originTimestamp.secondsField.msb = flip16(*(UInteger16*)(buf+34)); - delayreq->originTimestamp.secondsField.lsb = flip32(*(UInteger32*)(buf+36)); - delayreq->originTimestamp.nanosecondsField = flip32(*(UInteger32*)(buf+40)); + delayreq->originTimestamp.secondsField.msb = + flip16(*(UInteger16 *) (buf + 34)); + delayreq->originTimestamp.secondsField.lsb = + flip32(*(UInteger32 *) (buf + 36)); + delayreq->originTimestamp.nanosecondsField = + flip32(*(UInteger32 *) (buf + 40)); } /*Unpack PdelayReq message from IN buffer of ptpClock to msgtmp.req*/ -void msgUnpackPDelayReq(void *buf,MsgPDelayReq *pdelayreq) +void +msgUnpackPDelayReq(void *buf, MsgPDelayReq * pdelayreq) { - pdelayreq->originTimestamp.secondsField.msb = flip16(*(UInteger16*)(buf+34)); - pdelayreq->originTimestamp.secondsField.lsb = flip32(*(UInteger32*)(buf+36)); - pdelayreq->originTimestamp.nanosecondsField = flip32(*(UInteger32*)(buf+40)); + pdelayreq->originTimestamp.secondsField.msb = + flip16(*(UInteger16 *) (buf + 34)); + pdelayreq->originTimestamp.secondsField.lsb = + flip32(*(UInteger32 *) (buf + 36)); + pdelayreq->originTimestamp.nanosecondsField = + flip32(*(UInteger32 *) (buf + 40)); } /*Unpack delayResp message from IN buffer of ptpClock to msgtmp.presp*/ -void msgUnpackDelayResp(void *buf,MsgDelayResp *resp) +void +msgUnpackDelayResp(void *buf, MsgDelayResp * resp) { - resp->receiveTimestamp.secondsField.msb = flip16(*(UInteger16*)(buf+34)); - resp->receiveTimestamp.secondsField.lsb = flip32(*(UInteger32*)(buf+36)); - resp->receiveTimestamp.nanosecondsField = flip32(*(UInteger32*)(buf+40)); - memcpy(resp->requestingPortIdentity.clockIdentity,(buf+44),CLOCK_IDENTITY_LENGTH); - resp->requestingPortIdentity.portNumber = flip16(*(UInteger16*)(buf+52)); + resp->receiveTimestamp.secondsField.msb = + flip16(*(UInteger16 *) (buf + 34)); + resp->receiveTimestamp.secondsField.lsb = + flip32(*(UInteger32 *) (buf + 36)); + resp->receiveTimestamp.nanosecondsField = + flip32(*(UInteger32 *) (buf + 40)); + memcpy(resp->requestingPortIdentity.clockIdentity, + (buf + 44), CLOCK_IDENTITY_LENGTH); + resp->requestingPortIdentity.portNumber = + flip16(*(UInteger16 *) (buf + 52)); } /*Unpack PdelayResp message from IN buffer of ptpClock to msgtmp.presp*/ -void msgUnpackPDelayResp(void *buf,MsgPDelayResp *presp) +void +msgUnpackPDelayResp(void *buf, MsgPDelayResp * presp) { - presp->requestReceiptTimestamp.secondsField.msb = flip16(*(UInteger16*)(buf+34)); - presp->requestReceiptTimestamp.secondsField.lsb = flip32(*(UInteger32*)(buf+36)); - presp->requestReceiptTimestamp.nanosecondsField = flip32(*(UInteger32*)(buf+40)); - memcpy(presp->requestingPortIdentity.clockIdentity,(buf+44),CLOCK_IDENTITY_LENGTH); - presp->requestingPortIdentity.portNumber = flip16(*(UInteger16*)(buf+52)); + presp->requestReceiptTimestamp.secondsField.msb = + flip16(*(UInteger16 *) (buf + 34)); + presp->requestReceiptTimestamp.secondsField.lsb = + flip32(*(UInteger32 *) (buf + 36)); + presp->requestReceiptTimestamp.nanosecondsField = + flip32(*(UInteger32 *) (buf + 40)); + memcpy(presp->requestingPortIdentity.clockIdentity, + (buf + 44), CLOCK_IDENTITY_LENGTH); + presp->requestingPortIdentity.portNumber = + flip16(*(UInteger16 *) (buf + 52)); } /*pack PdelayRespfollowup message into OUT buffer of ptpClock*/ -void msgPackPDelayRespFollowUp(void *buf,MsgHeader *header,Timestamp *responseOriginTimestamp,PtpClock *ptpClock) +void +msgPackPDelayRespFollowUp(void *buf, MsgHeader * header, Timestamp * responseOriginTimestamp, PtpClock * ptpClock) { - /*changes in header*/ - *(char*)(buf+0)= *(char*)(buf+0) & 0xF0; //RAZ messageType - *(char*)(buf+0)= *(char*)(buf+0) | 0x0A; //Table 19 - *(UInteger16*)(buf+2) = flip16(PDELAY_RESP_FOLLOW_UP_LENGTH); - *(UInteger16*)(buf+30)= flip16(ptpClock->PdelayReqHeader.sequenceId); - *(UInteger8*)(buf+32) = 0x05; //Table 23 - *(Integer8*)(buf+33) = 0x7F; //Table 24 + /* changes in header */ + *(char *)(buf + 0) = *(char *)(buf + 0) & 0xF0; + /* RAZ messageType */ + *(char *)(buf + 0) = *(char *)(buf + 0) | 0x0A; + /* Table 19 */ + *(UInteger16 *) (buf + 2) = flip16(PDELAY_RESP_FOLLOW_UP_LENGTH); + *(UInteger16 *) (buf + 30) = flip16(ptpClock->PdelayReqHeader.sequenceId); + *(UInteger8 *) (buf + 32) = 0x05; + /* Table 23 */ + *(Integer8 *) (buf + 33) = 0x7F; + /* Table 24 */ - /*Copy correctionField of PdelayReqMessage*/ - *(Integer32*)(buf+8) = flip32(header->correctionfield.msb); - *(Integer32*)(buf+12) = flip32(header->correctionfield.lsb); + /* Copy correctionField of PdelayReqMessage */ + *(Integer32 *) (buf + 8) = flip32(header->correctionfield.msb); + *(Integer32 *) (buf + 12) = flip32(header->correctionfield.lsb); - /*Pdelay_resp_follow_up message*/ - *(UInteger16*)(buf+34) = flip16(responseOriginTimestamp->secondsField.msb); - *(UInteger32*)(buf+36) = flip32(responseOriginTimestamp->secondsField.lsb); - *(UInteger32*)(buf+40) = flip32(responseOriginTimestamp->nanosecondsField); - memcpy((buf+44),header->sourcePortIdentity.clockIdentity,CLOCK_IDENTITY_LENGTH); - *(UInteger16*)(buf+52) = flip16(header->sourcePortIdentity.portNumber); + /* Pdelay_resp_follow_up message */ + *(UInteger16 *) (buf + 34) = + flip16(responseOriginTimestamp->secondsField.msb); + *(UInteger32 *) (buf + 36) = + flip32(responseOriginTimestamp->secondsField.lsb); + *(UInteger32 *) (buf + 40) = + flip32(responseOriginTimestamp->nanosecondsField); + memcpy((buf + 44), header->sourcePortIdentity.clockIdentity, + CLOCK_IDENTITY_LENGTH); + *(UInteger16 *) (buf + 52) = + flip16(header->sourcePortIdentity.portNumber); } /*Unpack PdelayResp message from IN buffer of ptpClock to msgtmp.presp*/ -void msgUnpackPDelayRespFollowUp(void *buf,MsgPDelayRespFollowUp *prespfollow) +void +msgUnpackPDelayRespFollowUp(void *buf, MsgPDelayRespFollowUp * prespfollow) { - prespfollow->responseOriginTimestamp.secondsField.msb = flip16(*(UInteger16*)(buf+34)); - prespfollow->responseOriginTimestamp.secondsField.lsb = flip32(*(UInteger32*)(buf+36)); - prespfollow->responseOriginTimestamp.nanosecondsField = flip32(*(UInteger32*)(buf+40)); - memcpy(prespfollow->requestingPortIdentity.clockIdentity,(buf+44),CLOCK_IDENTITY_LENGTH); - prespfollow->requestingPortIdentity.portNumber = flip16(*(UInteger16*)(buf+52)); + prespfollow->responseOriginTimestamp.secondsField.msb = + flip16(*(UInteger16 *) (buf + 34)); + prespfollow->responseOriginTimestamp.secondsField.lsb = + flip32(*(UInteger32 *) (buf + 36)); + prespfollow->responseOriginTimestamp.nanosecondsField = + flip32(*(UInteger32 *) (buf + 40)); + memcpy(prespfollow->requestingPortIdentity.clockIdentity, + (buf + 44), CLOCK_IDENTITY_LENGTH); + prespfollow->requestingPortIdentity.portNumber = + flip16(*(UInteger16 *) (buf + 52)); } Modified: branches/v2/src/dep/net.c =================================================================== --- branches/v2/src/dep/net.c 2010-08-09 16:15:36 UTC (rev 67) +++ branches/v2/src/dep/net.c 2010-08-17 16:04:41 UTC (rev 68) @@ -1,710 +1,746 @@ -/* net.c */ +/** + * @file net.c + * @date Tue Jul 20 16:17:49 2010 + * + * @brief Functions to interact with the network sockets and NIC driver. + * + * + */ + #include "../ptpd.h" /* shut down the UDP stuff */ -Boolean netShutdown(NetPath *netPath) +Boolean +netShutdown(NetPath * netPath) { - struct ip_mreq imr; + struct ip_mreq imr; - /*Close General Multicast*/ - imr.imr_multiaddr.s_addr = netPath->multicastAddr; - imr.imr_interface.s_addr = htonl(INADDR_ANY); + /* Close General Multicast */ + imr.imr_multiaddr.s_addr = netPath->multicastAddr; + imr.imr_interface.s_addr = htonl(INADDR_ANY); - setsockopt(netPath->eventSock, IPPROTO_IP, IP_DROP_MEMBERSHIP, &imr, sizeof(struct ip_mreq)); - setsockopt(netPath->generalSock, IPPROTO_IP, IP_DROP_MEMBERSHIP, &imr, sizeof(struct ip_mreq)); + setsockopt(netPath->eventSock, IPPROTO_IP, IP_DROP_MEMBERSHIP, + &imr, sizeof(struct ip_mreq)); + setsockopt(netPath->generalSock, IPPROTO_IP, IP_DROP_MEMBERSHIP, + &imr, sizeof(struct ip_mreq)); - /*Close Peer Multicast*/ - imr.imr_multiaddr.s_addr = netPath->peerMulticastAddr; - imr.imr_interface.s_addr = htonl(INADDR_ANY); + /* Close Peer Multicast */ + imr.imr_multiaddr.s_addr = netPath->peerMulticastAddr; + imr.imr_interface.s_addr = htonl(INADDR_ANY); - setsockopt(netPath->eventSock, IPPROTO_IP, IP_DROP_MEMBERSHIP, &imr, sizeof(struct ip_mreq)); - setsockopt(netPath->generalSock, IPPROTO_IP, IP_DROP_MEMBERSHIP, &imr, sizeof(struct ip_mreq)); + setsockopt(netPath->eventSock, IPPROTO_IP, IP_DROP_MEMBERSHIP, + &imr, sizeof(struct ip_mreq)); + setsockopt(netPath->generalSock, IPPROTO_IP, IP_DROP_MEMBERSHIP, + &imr, sizeof(struct ip_mreq)); - netPath->multicastAddr = 0; - netPath->unicastAddr = 0; - netPath->peerMulticastAddr = 0; + netPath->multicastAddr = 0; + netPath->unicastAddr = 0; + netPath->peerMulticastAddr = 0; - /*Close sockets*/ - if(netPath->eventSock > 0) - close(netPath->eventSock); - netPath->eventSock = -1; + /* Close sockets */ + if (netPath->eventSock > 0) + close(netPath->eventSock); + netPath->eventSock = -1; - if(netPath->generalSock > 0) - close(netPath->generalSock); - netPath->generalSock = -1; + if (netPath->generalSock > 0) + close(netPath->generalSock); + netPath->generalSock = -1; - return TRUE; + return TRUE; } /*Test if network layer is OK for PTP*/ -UInteger8 lookupCommunicationTechnology(UInteger8 communicationTechnology) +UInteger8 +lookupCommunicationTechnology(UInteger8 communicationTechnology) { #if defined(linux) - switch(communicationTechnology) - { - case ARPHRD_ETHER: - case ARPHRD_EETHER: - case ARPHRD_IEEE802: - return PTP_ETHER; + switch (communicationTechnology) { + case ARPHRD_ETHER: + case ARPHRD_EETHER: + case ARPHRD_IEEE802: + return PTP_ETHER; - default: - break; - } + default: + break; + } #elif defined(BSD_INTERFACE_FUNCTIONS) #endif - return PTP_DEFAULT; + return PTP_DEFAULT; } /* Find the local network interface */ -UInteger32 findIface(Octet *ifaceName, UInteger8 *communicationTechnology, - Octet *uuid, NetPath *netPath) +UInteger32 +findIface(Octet * ifaceName, UInteger8 * communicationTechnology, + Octet * uuid, NetPath * netPath) { #if defined(linux) - /* depends on linux specific ioctls (see 'netdevice' man page) */ - int i, flags; - struct ifconf data; - struct ifreq device[IFCONF_LENGTH]; + /* depends on linux specific ioctls (see 'netdevice' man page) */ + int i, flags; + struct ifconf data; + struct ifreq device[IFCONF_LENGTH]; - data.ifc_len = sizeof(device); - data.ifc_req = device; + data.ifc_len = sizeof(device); + data.ifc_req = device; - memset(data.ifc_buf,0,data.ifc_len); + memset(data.ifc_buf, 0, data.ifc_len); - flags = IFF_UP|IFF_RUNNING|IFF_MULTICAST; + flags = IFF_UP | IFF_RUNNING | IFF_MULTICAST; - /* look for an interface if none specified */ - if(ifaceName[0] != '\0') - { - i = 0; - memcpy(device[i].ifr_name, ifaceName, IFACE_NAME_LENGTH); + /* look for an interface if none specified */ + if (ifaceName[0] != '\0') { + i = 0; + memcpy(device[i].ifr_name, ifaceName, IFACE_NAME_LENGTH); - if(ioctl(netPath->eventSock, SIOCGIFHWADDR, &device[i]) < 0) - DBGV("failed to get hardware address\n"); - else if((*communicationTechnology = lookupCommunicationTechnology(device[i].ifr_hwaddr.sa_family)) == PTP_DEFAULT) - DBGV("unsupported communication technology (%d)\n", *communicationTechnology); - else - memcpy(uuid, device[i].ifr_hwaddr.sa_data, PTP_UUID_LENGTH); - } - else - { - /* no iface specified */ - /* get list of network interfaces*/ - if(ioctl(netPath->eventSock, SIOCGIFCONF, &data) < 0) - { - PERROR("failed query network interfaces"); - return 0; - } + if (ioctl(netPath->eventSock, SIOCGIFHWADDR, &device[i]) < 0) + DBGV("failed to get hardware address\n"); + else if ((*communicationTechnology = + lookupCommunicationTechnology( + device[i].ifr_hwaddr.sa_family)) + == PTP_DEFAULT) + DBGV("unsupported communication technology (%d)\n", + *communicationTechnology); + else + memcpy(uuid, device[i].ifr_hwaddr.sa_data, + PTP_UUID_LENGTH); + } else { + /* no iface specified */ + /* get list of network interfaces */ + if (ioctl(netPath->eventSock, SIOCGIFCONF, &data) < 0) { + PERROR("failed query network interfaces"); + return 0; + } + if (data.ifc_len >= sizeof(device)) + DBG("device list may exceed allocated space\n"); - if(data.ifc_len >= sizeof(device)) - DBG("device list may exceed allocated space\n"); + /* search through interfaces */ + for (i = 0; i < data.ifc_len / sizeof(device[0]); ++i) { + DBGV("%d %s %s\n", i, device[i].ifr_name, + inet_ntoa(((struct sockaddr_in *) + &device[i].ifr_addr)->sin_addr)); - /* search through interfaces */ - for(i=0; i < data.ifc_len/sizeof(device[0]); ++i) - { - DBGV("%d %s %s\n",i,device[i].ifr_name,inet_ntoa(((struct sockaddr_in *)&device[i].ifr_addr)->sin_addr)); + if (ioctl(netPath->eventSock, SIOCGIFFLAGS, + &device[i]) < 0) + DBGV("failed to get device flags\n"); + else if ((device[i].ifr_flags & flags) != flags) + DBGV("does not meet requirements" + "(%08x, %08x)\n", device[i].ifr_flags, + flags); + else if (ioctl(netPath->eventSock, SIOCGIFHWADDR, + &device[i]) < 0) + DBGV("failed to get hardware address\n"); + else if ((*communicationTechnology = + lookupCommunicationTechnology( + device[i].ifr_hwaddr.sa_family)) + == PTP_DEFAULT) + DBGV("unsupported communication technology" + "(%d)\n", *communicationTechnology); + else { + DBGV("found interface (%s)\n", + device[i].ifr_name); + memcpy(uuid, device[i].ifr_hwaddr.sa_data, + PTP_UUID_LENGTH); + memcpy(ifaceName, device[i].ifr_name, + ... [truncated message content] |