On Wed, Nov 14, 2018 at 02:10:10PM -0800, Vedang Patel wrote:
> diff --git a/port.c b/port.c
> index 4c845358f612..015766103e05 100644
> --- a/port.c
> +++ b/port.c
> @@ -1591,6 +1591,7 @@ int port_initialize(struct port *p)
>       p->logMinDelayReqInterval  = config_get_int(cfg, p->name, 
> "logMinDelayReqInterval");
>       p->peerMeanPathDelay       = 0;
>       p->logAnnounceInterval     = config_get_int(cfg, p->name, 
> "logAnnounceInterval");
> +     p->initialLogAnnounceInterval = p->logAnnounceInterval;

This is backwards.  You want:

        p->initialLogAnnounceInterval = config_get_int(cfg, p->name, 
"logAnnounceInterval");
        p->logAnnounceInterval = p->initialLogAnnounceInterval;


>       p->inhibit_announce        = config_get_int(cfg, p->name, 
> "inhibit_announce");
>       p->ignore_source_id        = config_get_int(cfg, p->name, 
> "ignore_source_id");
>       p->announceReceiptTimeout  = config_get_int(cfg, p->name, 
> "announceReceiptTimeout");
> @@ -1600,6 +1601,7 @@ int port_initialize(struct port *p)
>       p->match_transport_specific = !config_get_int(cfg, p->name, 
> "ignore_transport_specific");
>       p->localPriority           = config_get_int(cfg, p->name, 
> "G.8275.portDS.localPriority");
>       p->logSyncInterval         = config_get_int(cfg, p->name, 
> "logSyncInterval");
> +     p->initialLogSyncInterval  = p->logSyncInterval;

also backwards.

>       p->logMinPdelayReqInterval = config_get_int(cfg, p->name, 
> "logMinPdelayReqInterval");
>       p->logPdelayReqInterval    = p->logMinPdelayReqInterval;
>       p->neighborPropDelayThresh = config_get_int(cfg, p->name, 
> "neighborPropDelayThresh");

> @@ -185,5 +187,10 @@ enum fsm_event process_sync(struct port *p, struct 
> ptp_message *m);
>  int source_pid_eq(struct ptp_message *m1, struct ptp_message *m2);
>  void ts_add(tmv_t *ts, Integer64 correction);
>  int port_capable(struct port *p);
> +int port_tx_signaling(struct port *p,
> +                   Integer8 announceInterval,
> +                   Integer8 timeSyncInterval,
> +                   Integer8 linkDelayInterval);

This is poorly named.  You make it sound like it is a generic transmit
function for signaling message, but it isn't.

Also, please keep the prototypes in alphabetical order.

> @@ -61,6 +65,48 @@ struct ptp_message *port_unicast_construct(struct port *p,
>       return msg;
>  }
>  
> +static void set_interval(int8_t *current_interval,
> +                      int8_t new_interval,
> +                      int8_t initial_interval)
> +{
> +     switch (new_interval) {
> +     case SIGNAL_NO_CHANGE:
> +             break;
> +     case SIGNAL_SET_INITIAL:
> +             *current_interval = initial_interval;
> +             break;
> +     default:
> +             *current_interval = new_interval;
> +             break;
> +     }

Ugh.  Just return current_interval:

static int8_t set_interval(int8_t new_interval, int8_t initial_interval);

> +}
> +
> +static int process_interval_request(struct port *p,
> +                                  struct tlv_extra *extra)
> +{
> +     struct msg_interval_req_tlv *r;
> +
> +     r = (struct msg_interval_req_tlv *) extra->tlv;

You need to check the length of the TLV, in tlv.c:org_post_recv().

> +
> +     if (r->subtype[2] != 2) {

But you didn't even bother to check the ID!

> +             return -EBADMSG;
> +     }
> +
> +     set_interval(&p->logAnnounceInterval,
> +                  r->announceInterval,
> +                  p->initialLogAnnounceInterval);
> +
> +     set_interval(&p->logSyncInterval,
> +                  r->timeSyncInterval,
> +                  p->initialLogSyncInterval);
> +
> +     set_interval(&p->logPdelayReqInterval,
> +                  r->linkDelayInterval,
> +                  p->logMinPdelayReqInterval);
> +
> +     return 0;
> +}
> +
>  int process_signaling(struct port *p, struct ptp_message *m)
>  {
>       struct tlv_extra *extra;
> @@ -109,7 +155,59 @@ int process_signaling(struct port *p, struct ptp_message 
> *m)
>  
>               case TLV_ACKNOWLEDGE_CANCEL_UNICAST_TRANSMISSION:
>                       break;
> +
> +             case TLV_ORGANIZATION_EXTENSION:

You need to check .id and .subtype, and then dispatch your helper
function.  It isn't an error if those two fields are unknown.

> +                     err = process_interval_request(p, extra);
> +                     break;
>               }
>       }
>       return err;
>  }
> +
> +int port_tx_signaling(struct port *p,
> +                   Integer8 announceInterval,
> +                   Integer8 timeSyncInterval,
> +                   Integer8 linkDelayInterval)
> +{
> +     int err;
> +     struct ptp_message *msg;
> +     struct tlv_extra *extra;
> +     struct msg_interval_req_tlv *mir;

Please use reverse Christmas tree style.

> +     struct PortIdentity tpid = {0};

This won't compile on older gcc.

> +     tpid.portNumber = 0xFF;

This is silly to set after clearing.  Instead you want:

        struct PortIdentity tpid;

        if (!port_capable(p)) {
                return 0;
        }

        memset(&tpid.clockIdentity, 0, sizeof(tpid.clockIdentity));
        tpid.portNumber = 0xFF;

> +     msg = port_signaling_construct(p, &tpid);
> +     if (!msg) {
> +             return -1;
> +     }
> +

Drop newline please here

> +     extra = msg_tlv_append(msg, sizeof(*mir));
> +     if (!extra) {
> +             err = -1;
> +             goto out;
> +     }
> +

and here.

Thanks,
Richard


_______________________________________________
Linuxptp-devel mailing list
Linuxptp-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/linuxptp-devel

Reply via email to