" -S         set the system time from the ptp clock time\n"
                " -t val     shift the ptp clock time by 'val' seconds\n"
                " -T val     set the ptp clock time to 'val' seconds\n"
+               " -x val     get an extended ptp clock time with the desired number of samples (up to %d)\n"
                " -z         test combinations of rising/falling external time stamp flags\n",
-               progname);
+               progname, PTP_MAX_SAMPLES);
 }
 
 int main(int argc, char *argv[])
        struct timex tx;
        struct ptp_clock_time *pct;
        struct ptp_sys_offset *sysoff;
+       struct ptp_sys_offset_extended *soe;
 
        char *progname;
        unsigned int i;
        int index = 0;
        int list_pins = 0;
        int pct_offset = 0;
+       int getextended = 0;
        int n_samples = 0;
        int pin_index = -1, pin_func;
        int pps = -1;
 
        progname = strrchr(argv[0], '/');
        progname = progname ? 1+progname : argv[0];
-       while (EOF != (c = getopt(argc, argv, "cd:e:f:ghH:i:k:lL:n:o:p:P:sSt:T:w:z"))) {
+       while (EOF != (c = getopt(argc, argv, "cd:e:f:ghH:i:k:lL:n:o:p:P:sSt:T:w:x:z"))) {
                switch (c) {
                case 'c':
                        capabilities = 1;
                case 'w':
                        pulsewidth = atoi(optarg);
                        break;
+               case 'x':
+                       getextended = atoi(optarg);
+                       if (getextended < 1 || getextended > PTP_MAX_SAMPLES) {
+                               fprintf(stderr,
+                                       "number of extended timestamp samples must be between 1 and %d; was asked for %d\n",
+                                       PTP_MAX_SAMPLES, getextended);
+                               return -1;
+                       }
+                       break;
                case 'z':
                        flagtest = 1;
                        break;
                free(sysoff);
        }
 
+       if (getextended) {
+               soe = calloc(1, sizeof(*soe));
+               if (!soe) {
+                       perror("calloc");
+                       return -1;
+               }
+
+               soe->n_samples = getextended;
+
+               if (ioctl(fd, PTP_SYS_OFFSET_EXTENDED, soe)) {
+                       perror("PTP_SYS_OFFSET_EXTENDED");
+               } else {
+                       printf("extended timestamp request returned %d samples\n",
+                              getextended);
+
+                       for (i = 0; i < getextended; i++) {
+                               printf("sample #%2d: system time before: %lld.%09u\n",
+                                      i, soe->ts[i][0].sec, soe->ts[i][0].nsec);
+                               printf("            phc time: %lld.%09u\n",
+                                      soe->ts[i][1].sec, soe->ts[i][1].nsec);
+                               printf("            system time after: %lld.%09u\n",
+                                      soe->ts[i][2].sec, soe->ts[i][2].nsec);
+                       }
+               }
+
+               free(soe);
+       }
+
        close(fd);
        return 0;
 }