1ee67461eSJoseph Mingrone /* 2ee67461eSJoseph Mingrone * Redistribution and use in source and binary forms, with or without 3ee67461eSJoseph Mingrone * modification, are permitted provided that: (1) source code 4ee67461eSJoseph Mingrone * distributions retain the above copyright notice and this paragraph 5ee67461eSJoseph Mingrone * in its entirety, and (2) distributions including binary code include 6ee67461eSJoseph Mingrone * the above copyright notice and this paragraph in its entirety in 7ee67461eSJoseph Mingrone * the documentation or other materials provided with the distribution. 8ee67461eSJoseph Mingrone * THIS SOFTWARE IS PROVIDED ``AS IS'' AND 9ee67461eSJoseph Mingrone * WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, WITHOUT 10ee67461eSJoseph Mingrone * LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 11ee67461eSJoseph Mingrone * FOR A PARTICULAR PURPOSE. 12ee67461eSJoseph Mingrone * 13ee67461eSJoseph Mingrone * Original code by Partha S. Ghosh (psglinux dot gmail dot com) 14ee67461eSJoseph Mingrone */ 15ee67461eSJoseph Mingrone 16ee67461eSJoseph Mingrone /* \summary: Precision Time Protocol (PTP) printer */ 17ee67461eSJoseph Mingrone 18ee67461eSJoseph Mingrone /* specification: https://standards.ieee.org/findstds/standard/1588-2008.html*/ 19ee67461eSJoseph Mingrone 20ee67461eSJoseph Mingrone #include <config.h> 21ee67461eSJoseph Mingrone 22ee67461eSJoseph Mingrone #include "netdissect-stdinc.h" 23ee67461eSJoseph Mingrone #include "netdissect.h" 24ee67461eSJoseph Mingrone #include "extract.h" 25ee67461eSJoseph Mingrone 26ee67461eSJoseph Mingrone /* 27ee67461eSJoseph Mingrone * PTP header 28ee67461eSJoseph Mingrone * 0 1 2 3 29ee67461eSJoseph Mingrone * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 30ee67461eSJoseph Mingrone * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 31ee67461eSJoseph Mingrone * | R | |msgtype| version | Msg Len | 32ee67461eSJoseph Mingrone * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 33ee67461eSJoseph Mingrone * | domain No | rsvd1 | flag Field | 34ee67461eSJoseph Mingrone * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 35ee67461eSJoseph Mingrone * | Correction NS | 36ee67461eSJoseph Mingrone * + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 37ee67461eSJoseph Mingrone * | | Correction Sub NS | 38ee67461eSJoseph Mingrone * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 39ee67461eSJoseph Mingrone * | Reserved2 | 40ee67461eSJoseph Mingrone * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 41ee67461eSJoseph Mingrone * | Clock Identity | 42ee67461eSJoseph Mingrone * | | 43ee67461eSJoseph Mingrone * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 44ee67461eSJoseph Mingrone * | Port Identity | Sequence ID | 45ee67461eSJoseph Mingrone * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 46ee67461eSJoseph Mingrone * | control | log msg int | 47ee67461eSJoseph Mingrone * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 48ee67461eSJoseph Mingrone * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 49ee67461eSJoseph Mingrone * 0 1 2 3 50ee67461eSJoseph Mingrone * 51ee67461eSJoseph Mingrone * Announce Message (msg type=0xB) 52ee67461eSJoseph Mingrone * 0 1 2 3 53ee67461eSJoseph Mingrone * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 54ee67461eSJoseph Mingrone * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 55ee67461eSJoseph Mingrone * | | 56ee67461eSJoseph Mingrone * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + 57ee67461eSJoseph Mingrone * | Seconds | 58ee67461eSJoseph Mingrone * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 59ee67461eSJoseph Mingrone * | Nano Seconds | 60ee67461eSJoseph Mingrone * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 61ee67461eSJoseph Mingrone * | Origin Cur UTC Offset | Reserved | GM Prio 1 | 62ee67461eSJoseph Mingrone * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 63ee67461eSJoseph Mingrone * |GM Clock Class | GM Clock Accu | GM Clock Variance | 64ee67461eSJoseph Mingrone * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 65ee67461eSJoseph Mingrone * | GM Prio 2 | | 66ee67461eSJoseph Mingrone * +-+-+-+-+-+-+-+-+ + 67ee67461eSJoseph Mingrone * | GM Clock Identity | 68ee67461eSJoseph Mingrone * + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 69ee67461eSJoseph Mingrone * | | Steps Removed | Time Source | 70ee67461eSJoseph Mingrone * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 71ee67461eSJoseph Mingrone * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 72ee67461eSJoseph Mingrone * 0 1 2 3 73ee67461eSJoseph Mingrone * 74ee67461eSJoseph Mingrone * Sync Message (msg type=0x0) 75ee67461eSJoseph Mingrone * 0 1 2 3 76ee67461eSJoseph Mingrone * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 77ee67461eSJoseph Mingrone * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 78ee67461eSJoseph Mingrone * | | 79ee67461eSJoseph Mingrone * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + 80ee67461eSJoseph Mingrone * | Seconds | 81ee67461eSJoseph Mingrone * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 82ee67461eSJoseph Mingrone * | Nano Seconds | 83ee67461eSJoseph Mingrone * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 84ee67461eSJoseph Mingrone * 85ee67461eSJoseph Mingrone * Delay Request Message (msg type=0x1) 86ee67461eSJoseph Mingrone * 0 1 2 3 87ee67461eSJoseph Mingrone * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 88ee67461eSJoseph Mingrone * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 89ee67461eSJoseph Mingrone * | | 90ee67461eSJoseph Mingrone * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + 91ee67461eSJoseph Mingrone * | Origin Time Stamp Seconds | 92ee67461eSJoseph Mingrone * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 93ee67461eSJoseph Mingrone * | Nano Seconds | 94ee67461eSJoseph Mingrone * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 95ee67461eSJoseph Mingrone * 96ee67461eSJoseph Mingrone * Followup Message (msg type=0x8) 97ee67461eSJoseph Mingrone * 0 1 2 3 98ee67461eSJoseph Mingrone * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 99ee67461eSJoseph Mingrone * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 100ee67461eSJoseph Mingrone * | | 101ee67461eSJoseph Mingrone * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + 102ee67461eSJoseph Mingrone * | Precise Origin Time Stamp Seconds | 103ee67461eSJoseph Mingrone * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 104ee67461eSJoseph Mingrone * | Nano Seconds | 105ee67461eSJoseph Mingrone * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 106ee67461eSJoseph Mingrone * 107ee67461eSJoseph Mingrone * Delay Resp Message (msg type=0x9) 108ee67461eSJoseph Mingrone * 0 1 2 3 109ee67461eSJoseph Mingrone * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 110ee67461eSJoseph Mingrone * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 111ee67461eSJoseph Mingrone * | | 112ee67461eSJoseph Mingrone * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + 113ee67461eSJoseph Mingrone * | Seconds | 114ee67461eSJoseph Mingrone * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 115ee67461eSJoseph Mingrone * | Nano Seconds | 116ee67461eSJoseph Mingrone * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 117ee67461eSJoseph Mingrone * | Port Identity | 118ee67461eSJoseph Mingrone * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 119ee67461eSJoseph Mingrone * 120ee67461eSJoseph Mingrone * PDelay Request Message (msg type=0x2) 121ee67461eSJoseph Mingrone * 0 1 2 3 122ee67461eSJoseph Mingrone * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 123ee67461eSJoseph Mingrone * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 124ee67461eSJoseph Mingrone * | | 125ee67461eSJoseph Mingrone * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + 126ee67461eSJoseph Mingrone * | Origin Time Stamp Seconds | 127ee67461eSJoseph Mingrone * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 128ee67461eSJoseph Mingrone * | Origin Time Stamp Nano Seconds | 129ee67461eSJoseph Mingrone * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 130ee67461eSJoseph Mingrone * | Port Identity | 131ee67461eSJoseph Mingrone * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 132ee67461eSJoseph Mingrone * 133ee67461eSJoseph Mingrone * PDelay Response Message (msg type=0x3) 134ee67461eSJoseph Mingrone * 0 1 2 3 135ee67461eSJoseph Mingrone * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 136ee67461eSJoseph Mingrone * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 137ee67461eSJoseph Mingrone * | | 138ee67461eSJoseph Mingrone * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + 139ee67461eSJoseph Mingrone * | Request receipt Time Stamp Seconds | 140ee67461eSJoseph Mingrone * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 141ee67461eSJoseph Mingrone * | Nano Seconds | 142ee67461eSJoseph Mingrone * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 143ee67461eSJoseph Mingrone * | Requesting Port Identity | 144ee67461eSJoseph Mingrone * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 145ee67461eSJoseph Mingrone * 146ee67461eSJoseph Mingrone * PDelay Resp Follow up Message (msg type=0xA) 147ee67461eSJoseph Mingrone * 0 1 2 3 148ee67461eSJoseph Mingrone * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 149ee67461eSJoseph Mingrone * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 150ee67461eSJoseph Mingrone * | | 151ee67461eSJoseph Mingrone * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + 152ee67461eSJoseph Mingrone * | Response Origin Time Stamp Seconds | 153ee67461eSJoseph Mingrone * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 154ee67461eSJoseph Mingrone * | Nano Seconds | 155ee67461eSJoseph Mingrone * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 156ee67461eSJoseph Mingrone * | Requesting Port Identity | 157ee67461eSJoseph Mingrone * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 158ee67461eSJoseph Mingrone * 159*0a7e5f1fSJoseph Mingrone * Signaling Message (msg type=0xC) 160ee67461eSJoseph Mingrone * 0 1 2 3 161ee67461eSJoseph Mingrone * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 162ee67461eSJoseph Mingrone * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 163ee67461eSJoseph Mingrone * | Requesting Port Identity | 164ee67461eSJoseph Mingrone * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 165ee67461eSJoseph Mingrone * 166ee67461eSJoseph Mingrone * Management Message (msg type=0xD) 167ee67461eSJoseph Mingrone * 0 1 2 3 168ee67461eSJoseph Mingrone * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 169ee67461eSJoseph Mingrone * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 170ee67461eSJoseph Mingrone * | Requesting Port Identity | 171ee67461eSJoseph Mingrone * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 172ee67461eSJoseph Mingrone * |Start Bndry Hps| Boundary Hops | flags | Reserved | 173ee67461eSJoseph Mingrone * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 174ee67461eSJoseph Mingrone * 175ee67461eSJoseph Mingrone */ 176ee67461eSJoseph Mingrone 177ee67461eSJoseph Mingrone /* Values from IEEE1588-2008: 13.3.2.2 messageType (Enumeration4) */ 178ee67461eSJoseph Mingrone #define M_SYNC 0x0 179ee67461eSJoseph Mingrone #define M_DELAY_REQ 0x1 180ee67461eSJoseph Mingrone #define M_PDELAY_REQ 0x2 181ee67461eSJoseph Mingrone #define M_PDELAY_RESP 0x3 182ee67461eSJoseph Mingrone #define M_FOLLOW_UP 0x8 183ee67461eSJoseph Mingrone #define M_DELAY_RESP 0x9 184ee67461eSJoseph Mingrone #define M_PDELAY_RESP_FOLLOW_UP 0xA 185ee67461eSJoseph Mingrone #define M_ANNOUNCE 0xB 186*0a7e5f1fSJoseph Mingrone #define M_SIGNALING 0xC 187ee67461eSJoseph Mingrone #define M_MANAGEMENT 0xD 188ee67461eSJoseph Mingrone 189ee67461eSJoseph Mingrone static const struct tok ptp_msg_type[] = { 190ee67461eSJoseph Mingrone { M_SYNC, "sync msg"}, 191ee67461eSJoseph Mingrone { M_DELAY_REQ, "delay req msg"}, 192ee67461eSJoseph Mingrone { M_PDELAY_REQ, "peer delay req msg"}, 193ee67461eSJoseph Mingrone { M_PDELAY_RESP, "peer delay resp msg"}, 194ee67461eSJoseph Mingrone { M_FOLLOW_UP, "follow up msg"}, 195ee67461eSJoseph Mingrone { M_DELAY_RESP, "delay resp msg"}, 196ee67461eSJoseph Mingrone { M_PDELAY_RESP_FOLLOW_UP, "pdelay resp fup msg"}, 197ee67461eSJoseph Mingrone { M_ANNOUNCE, "announce msg"}, 198*0a7e5f1fSJoseph Mingrone { M_SIGNALING, "signaling msg"}, 199ee67461eSJoseph Mingrone { M_MANAGEMENT, "management msg"}, 200ee67461eSJoseph Mingrone { 0, NULL} 201ee67461eSJoseph Mingrone }; 202ee67461eSJoseph Mingrone 203ee67461eSJoseph Mingrone /* Values from IEEE1588-2008: 13.3.2.10 controlField (UInteger8) */ 204ee67461eSJoseph Mingrone /* 205ee67461eSJoseph Mingrone * The use of this field by the receiver is deprecated. 206ee67461eSJoseph Mingrone * NOTE-This field is provided for compatibility with hardware designed 207ee67461eSJoseph Mingrone * to conform to version 1 of this standard. 208ee67461eSJoseph Mingrone */ 209ee67461eSJoseph Mingrone #define C_SYNC 0x0 210ee67461eSJoseph Mingrone #define C_DELAY_REQ 0x1 211ee67461eSJoseph Mingrone #define C_FOLLOW_UP 0x2 212ee67461eSJoseph Mingrone #define C_DELAY_RESP 0x3 213ee67461eSJoseph Mingrone #define C_MANAGEMENT 0x4 214ee67461eSJoseph Mingrone #define C_OTHER 0x5 215ee67461eSJoseph Mingrone 216ee67461eSJoseph Mingrone static const struct tok ptp_control_field[] = { 217ee67461eSJoseph Mingrone { C_SYNC, "Sync"}, 218ee67461eSJoseph Mingrone { C_DELAY_REQ, "Delay_Req"}, 219ee67461eSJoseph Mingrone { C_FOLLOW_UP, "Follow_Up"}, 220ee67461eSJoseph Mingrone { C_DELAY_RESP, "Delay_Resp"}, 221ee67461eSJoseph Mingrone { C_MANAGEMENT, "Management"}, 222ee67461eSJoseph Mingrone { C_OTHER, "Other"}, 223ee67461eSJoseph Mingrone { 0, NULL} 224ee67461eSJoseph Mingrone }; 225ee67461eSJoseph Mingrone 226ee67461eSJoseph Mingrone #define PTP_TRUE 1 227ee67461eSJoseph Mingrone #define PTP_FALSE !PTP_TRUE 228ee67461eSJoseph Mingrone 229ee67461eSJoseph Mingrone #define PTP_HDR_LEN 0x22 230ee67461eSJoseph Mingrone 231ee67461eSJoseph Mingrone /* mask based on the first byte */ 232*0a7e5f1fSJoseph Mingrone #define PTP_MAJOR_VERS_MASK 0x0F 233*0a7e5f1fSJoseph Mingrone #define PTP_MINOR_VERS_MASK 0xF0 234*0a7e5f1fSJoseph Mingrone #define PTP_MAJOR_SDO_ID_MASK 0xF0 235ee67461eSJoseph Mingrone #define PTP_MSG_TYPE_MASK 0x0F 236ee67461eSJoseph Mingrone 237ee67461eSJoseph Mingrone /*mask based 2byte */ 238ee67461eSJoseph Mingrone #define PTP_DOMAIN_MASK 0xFF00 239ee67461eSJoseph Mingrone #define PTP_RSVD1_MASK 0xFF 240ee67461eSJoseph Mingrone #define PTP_CONTROL_MASK 0xFF 241ee67461eSJoseph Mingrone #define PTP_LOGMSG_MASK 0xFF 242ee67461eSJoseph Mingrone 243ee67461eSJoseph Mingrone /* mask based on the flags 2 bytes */ 244ee67461eSJoseph Mingrone 245ee67461eSJoseph Mingrone #define PTP_L161_MASK 0x1 246ee67461eSJoseph Mingrone #define PTP_L1_59_MASK 0x2 247ee67461eSJoseph Mingrone #define PTP_UTC_REASONABLE_MASK 0x4 248ee67461eSJoseph Mingrone #define PTP_TIMESCALE_MASK 0x8 249ee67461eSJoseph Mingrone #define PTP_TIME_TRACABLE_MASK 0x10 250ee67461eSJoseph Mingrone #define PTP_FREQUENCY_TRACABLE_MASK 0x20 251ee67461eSJoseph Mingrone #define PTP_ALTERNATE_MASTER_MASK 0x100 252ee67461eSJoseph Mingrone #define PTP_TWO_STEP_MASK 0x200 253ee67461eSJoseph Mingrone #define PTP_UNICAST_MASK 0x400 254ee67461eSJoseph Mingrone #define PTP_PROFILE_SPEC_1_MASK 0x1000 255ee67461eSJoseph Mingrone #define PTP_PROFILE_SPEC_2_MASK 0x2000 256ee67461eSJoseph Mingrone #define PTP_SECURITY_MASK 0x4000 257ee67461eSJoseph Mingrone #define PTP_FLAGS_UNKNOWN_MASK 0x18C0 258ee67461eSJoseph Mingrone 259ee67461eSJoseph Mingrone static const struct tok ptp_flag_values[] = { 260ee67461eSJoseph Mingrone { PTP_L161_MASK, "l1 61"}, 261ee67461eSJoseph Mingrone { PTP_L1_59_MASK, "l1 59"}, 262ee67461eSJoseph Mingrone { PTP_UTC_REASONABLE_MASK, "utc reasonable"}, 263ee67461eSJoseph Mingrone { PTP_TIMESCALE_MASK, "timescale"}, 264ee67461eSJoseph Mingrone { PTP_TIME_TRACABLE_MASK, "time tracable"}, 265ee67461eSJoseph Mingrone { PTP_FREQUENCY_TRACABLE_MASK, "frequency tracable"}, 266ee67461eSJoseph Mingrone { PTP_ALTERNATE_MASTER_MASK, "alternate master"}, 267ee67461eSJoseph Mingrone { PTP_TWO_STEP_MASK, "two step"}, 268ee67461eSJoseph Mingrone { PTP_UNICAST_MASK, "unicast"}, 269ee67461eSJoseph Mingrone { PTP_PROFILE_SPEC_1_MASK, "profile specific 1"}, 270ee67461eSJoseph Mingrone { PTP_PROFILE_SPEC_2_MASK, "profile specific 2"}, 271ee67461eSJoseph Mingrone { PTP_SECURITY_MASK, "security mask"}, 272ee67461eSJoseph Mingrone { PTP_FLAGS_UNKNOWN_MASK, "unknown"}, 273ee67461eSJoseph Mingrone {0, NULL} 274ee67461eSJoseph Mingrone }; 275ee67461eSJoseph Mingrone 276ee67461eSJoseph Mingrone static const char *p_porigin_ts = "preciseOriginTimeStamp"; 277ee67461eSJoseph Mingrone static const char *p_origin_ts = "originTimeStamp"; 278ee67461eSJoseph Mingrone static const char *p_recv_ts = "receiveTimeStamp"; 279ee67461eSJoseph Mingrone 280ee67461eSJoseph Mingrone #define PTP_VER_1 0x1 281ee67461eSJoseph Mingrone #define PTP_VER_2 0x2 282ee67461eSJoseph Mingrone 283ee67461eSJoseph Mingrone #define PTP_UCHAR_LEN sizeof(uint8_t) 284ee67461eSJoseph Mingrone #define PTP_UINT16_LEN sizeof(uint16_t) 285ee67461eSJoseph Mingrone #define PTP_UINT32_LEN sizeof(uint32_t) 286ee67461eSJoseph Mingrone #define PTP_6BYTES_LEN sizeof(uint32_t)+sizeof(uint16_t) 287ee67461eSJoseph Mingrone #define PTP_UINT64_LEN sizeof(uint64_t) 288ee67461eSJoseph Mingrone 289ee67461eSJoseph Mingrone static void ptp_print_1(netdissect_options *ndo); 290ee67461eSJoseph Mingrone static void ptp_print_2(netdissect_options *ndo, const u_char *bp, u_int len); 291ee67461eSJoseph Mingrone 292ee67461eSJoseph Mingrone static void ptp_print_timestamp(netdissect_options *ndo, const u_char *bp, u_int *len, const char *stype); 293ee67461eSJoseph Mingrone static void ptp_print_timestamp_identity(netdissect_options *ndo, const u_char *bp, u_int *len, const char *ttype); 294ee67461eSJoseph Mingrone static void ptp_print_announce_msg(netdissect_options *ndo, const u_char *bp, u_int *len); 295ee67461eSJoseph Mingrone static void ptp_print_port_id(netdissect_options *ndo, const u_char *bp, u_int *len); 296ee67461eSJoseph Mingrone static void ptp_print_mgmt_msg(netdissect_options *ndo, const u_char *bp, u_int *len); 297ee67461eSJoseph Mingrone 298ee67461eSJoseph Mingrone static void 299ee67461eSJoseph Mingrone print_field(netdissect_options *ndo, const char *st, uint32_t flen, 300ee67461eSJoseph Mingrone const u_char *bp, u_int *len, uint8_t hex) 301ee67461eSJoseph Mingrone { 302ee67461eSJoseph Mingrone uint8_t u8_val; 303ee67461eSJoseph Mingrone uint16_t u16_val; 304ee67461eSJoseph Mingrone uint32_t u32_val; 305ee67461eSJoseph Mingrone uint64_t u64_val; 306ee67461eSJoseph Mingrone 307ee67461eSJoseph Mingrone switch(flen) { 308ee67461eSJoseph Mingrone case PTP_UCHAR_LEN: 309ee67461eSJoseph Mingrone u8_val = GET_U_1(bp); 310ee67461eSJoseph Mingrone ND_PRINT(", %s", st); 311ee67461eSJoseph Mingrone if (hex) 312ee67461eSJoseph Mingrone ND_PRINT(" 0x%x", u8_val); 313ee67461eSJoseph Mingrone else 314ee67461eSJoseph Mingrone ND_PRINT(" %u", u8_val); 315ee67461eSJoseph Mingrone *len -= 1; bp += 1; 316ee67461eSJoseph Mingrone break; 317ee67461eSJoseph Mingrone case PTP_UINT16_LEN: 318ee67461eSJoseph Mingrone u16_val = GET_BE_U_2(bp); 319ee67461eSJoseph Mingrone ND_PRINT(", %s", st); 320ee67461eSJoseph Mingrone if (hex) 321ee67461eSJoseph Mingrone ND_PRINT(" 0x%x", u16_val); 322ee67461eSJoseph Mingrone else 323ee67461eSJoseph Mingrone ND_PRINT(" %u", u16_val); 324ee67461eSJoseph Mingrone *len -= 2; bp += 2; 325ee67461eSJoseph Mingrone break; 326ee67461eSJoseph Mingrone case PTP_UINT32_LEN: 327ee67461eSJoseph Mingrone u32_val = GET_BE_U_4(bp); 328ee67461eSJoseph Mingrone ND_PRINT(", %s", st); 329ee67461eSJoseph Mingrone if (hex) 330ee67461eSJoseph Mingrone ND_PRINT(" 0x%x", u32_val); 331ee67461eSJoseph Mingrone else 332ee67461eSJoseph Mingrone ND_PRINT(" %u", u32_val); 333ee67461eSJoseph Mingrone *len -= 4; bp += 4; 334ee67461eSJoseph Mingrone break; 335ee67461eSJoseph Mingrone case PTP_UINT64_LEN: 336ee67461eSJoseph Mingrone u64_val = GET_BE_U_8(bp); 337ee67461eSJoseph Mingrone ND_PRINT(", %s", st); 338ee67461eSJoseph Mingrone if (hex) 339ee67461eSJoseph Mingrone ND_PRINT(" 0x%"PRIx64, u64_val); 340ee67461eSJoseph Mingrone else 341ee67461eSJoseph Mingrone ND_PRINT(" 0x%"PRIu64, u64_val); 342ee67461eSJoseph Mingrone *len -= 8; bp += 8; 343ee67461eSJoseph Mingrone break; 344ee67461eSJoseph Mingrone default: 345ee67461eSJoseph Mingrone break; 346ee67461eSJoseph Mingrone } 347ee67461eSJoseph Mingrone } 348ee67461eSJoseph Mingrone 349ee67461eSJoseph Mingrone static void 350ee67461eSJoseph Mingrone ptp_print_1(netdissect_options *ndo) 351ee67461eSJoseph Mingrone { 352ee67461eSJoseph Mingrone ND_PRINT(" (not implemented)"); 353ee67461eSJoseph Mingrone } 354ee67461eSJoseph Mingrone 355ee67461eSJoseph Mingrone static void 356ee67461eSJoseph Mingrone ptp_print_2(netdissect_options *ndo, const u_char *bp, u_int length) 357ee67461eSJoseph Mingrone { 358ee67461eSJoseph Mingrone u_int len = length; 359ee67461eSJoseph Mingrone uint16_t msg_len, flags, port_id, seq_id; 360*0a7e5f1fSJoseph Mingrone uint8_t foct, domain_no, msg_type, major_sdo_id, rsvd1, lm_int, control; 361ee67461eSJoseph Mingrone uint64_t ns_corr; 362ee67461eSJoseph Mingrone uint16_t sns_corr; 363ee67461eSJoseph Mingrone uint32_t rsvd2; 364ee67461eSJoseph Mingrone uint64_t clk_id; 365ee67461eSJoseph Mingrone 366ee67461eSJoseph Mingrone foct = GET_U_1(bp); 367*0a7e5f1fSJoseph Mingrone major_sdo_id = (foct & PTP_MAJOR_SDO_ID_MASK) >> 4; 368*0a7e5f1fSJoseph Mingrone ND_PRINT(", majorSdoId : 0x%x", major_sdo_id); 369ee67461eSJoseph Mingrone msg_type = foct & PTP_MSG_TYPE_MASK; 370ee67461eSJoseph Mingrone ND_PRINT(", msg type : %s", tok2str(ptp_msg_type, "Reserved", msg_type)); 371ee67461eSJoseph Mingrone 372ee67461eSJoseph Mingrone /* msg length */ 373ee67461eSJoseph Mingrone len -= 2; bp += 2; msg_len = GET_BE_U_2(bp); ND_PRINT(", length : %u", msg_len); 374ee67461eSJoseph Mingrone 375ee67461eSJoseph Mingrone /* domain */ 376ee67461eSJoseph Mingrone len -= 2; bp += 2; domain_no = (GET_BE_U_2(bp) & PTP_DOMAIN_MASK) >> 8; ND_PRINT(", domain : %u", domain_no); 377ee67461eSJoseph Mingrone 378ee67461eSJoseph Mingrone /* rsvd 1*/ 379ee67461eSJoseph Mingrone rsvd1 = GET_BE_U_2(bp) & PTP_RSVD1_MASK; 380ee67461eSJoseph Mingrone ND_PRINT(", reserved1 : %u", rsvd1); 381ee67461eSJoseph Mingrone 382ee67461eSJoseph Mingrone /* flags */ 383ee67461eSJoseph Mingrone len -= 2; bp += 2; flags = GET_BE_U_2(bp); ND_PRINT(", Flags [%s]", bittok2str(ptp_flag_values, "none", flags)); 384ee67461eSJoseph Mingrone 385ee67461eSJoseph Mingrone /* correction NS (48 bits) */ 386ee67461eSJoseph Mingrone len -= 2; bp += 2; ns_corr = GET_BE_U_6(bp); ND_PRINT(", NS correction : %"PRIu64, ns_corr); 387ee67461eSJoseph Mingrone 388ee67461eSJoseph Mingrone /* correction sub NS (16 bits) */ 389ee67461eSJoseph Mingrone len -= 6; bp += 6; sns_corr = GET_BE_U_2(bp); ND_PRINT(", sub NS correction : %u", sns_corr); 390ee67461eSJoseph Mingrone 391ee67461eSJoseph Mingrone /* Reserved 2 */ 392ee67461eSJoseph Mingrone len -= 2; bp += 2; rsvd2 = GET_BE_U_4(bp); ND_PRINT(", reserved2 : %u", rsvd2); 393ee67461eSJoseph Mingrone 394ee67461eSJoseph Mingrone /* clock identity */ 395ee67461eSJoseph Mingrone len -= 4; bp += 4; clk_id = GET_BE_U_8(bp); ND_PRINT(", clock identity : 0x%"PRIx64, clk_id); 396ee67461eSJoseph Mingrone 397ee67461eSJoseph Mingrone /* port identity */ 398ee67461eSJoseph Mingrone len -= 8; bp += 8; port_id = GET_BE_U_2(bp); ND_PRINT(", port id : %u", port_id); 399ee67461eSJoseph Mingrone 400ee67461eSJoseph Mingrone /* sequence ID */ 401ee67461eSJoseph Mingrone len -= 2; bp += 2; seq_id = GET_BE_U_2(bp); ND_PRINT(", seq id : %u", seq_id); 402ee67461eSJoseph Mingrone 403ee67461eSJoseph Mingrone /* control */ 404ee67461eSJoseph Mingrone len -= 2; bp += 2; control = GET_U_1(bp) ; 405ee67461eSJoseph Mingrone ND_PRINT(", control : %u (%s)", control, tok2str(ptp_control_field, "Reserved", control)); 406ee67461eSJoseph Mingrone 407ee67461eSJoseph Mingrone /* log message interval */ 408ee67461eSJoseph Mingrone lm_int = GET_BE_U_2(bp) & PTP_LOGMSG_MASK; ND_PRINT(", log message interval : %u", lm_int); len -= 2; bp += 2; 409ee67461eSJoseph Mingrone 410ee67461eSJoseph Mingrone switch(msg_type) { 411ee67461eSJoseph Mingrone case M_SYNC: 412ee67461eSJoseph Mingrone ptp_print_timestamp(ndo, bp, &len, p_origin_ts); 413ee67461eSJoseph Mingrone break; 414ee67461eSJoseph Mingrone case M_DELAY_REQ: 415ee67461eSJoseph Mingrone ptp_print_timestamp(ndo, bp, &len, p_origin_ts); 416ee67461eSJoseph Mingrone break; 417ee67461eSJoseph Mingrone case M_PDELAY_REQ: 418ee67461eSJoseph Mingrone ptp_print_timestamp_identity(ndo, bp, &len, p_porigin_ts); 419ee67461eSJoseph Mingrone break; 420ee67461eSJoseph Mingrone case M_PDELAY_RESP: 421ee67461eSJoseph Mingrone ptp_print_timestamp_identity(ndo, bp, &len, p_recv_ts); 422ee67461eSJoseph Mingrone break; 423ee67461eSJoseph Mingrone case M_FOLLOW_UP: 424ee67461eSJoseph Mingrone ptp_print_timestamp(ndo, bp, &len, p_porigin_ts); 425ee67461eSJoseph Mingrone break; 426ee67461eSJoseph Mingrone case M_DELAY_RESP: 427ee67461eSJoseph Mingrone ptp_print_timestamp_identity(ndo, bp, &len, p_recv_ts); 428ee67461eSJoseph Mingrone break; 429ee67461eSJoseph Mingrone case M_PDELAY_RESP_FOLLOW_UP: 430ee67461eSJoseph Mingrone ptp_print_timestamp_identity(ndo, bp, &len, p_porigin_ts); 431ee67461eSJoseph Mingrone break; 432ee67461eSJoseph Mingrone case M_ANNOUNCE: 433ee67461eSJoseph Mingrone ptp_print_announce_msg(ndo, bp, &len); 434ee67461eSJoseph Mingrone break; 435*0a7e5f1fSJoseph Mingrone case M_SIGNALING: 436ee67461eSJoseph Mingrone ptp_print_port_id(ndo, bp, &len); 437ee67461eSJoseph Mingrone break; 438ee67461eSJoseph Mingrone case M_MANAGEMENT: 439ee67461eSJoseph Mingrone ptp_print_mgmt_msg(ndo, bp, &len); 440ee67461eSJoseph Mingrone break; 441ee67461eSJoseph Mingrone default: 442ee67461eSJoseph Mingrone break; 443ee67461eSJoseph Mingrone } 444ee67461eSJoseph Mingrone } 445ee67461eSJoseph Mingrone /* 446ee67461eSJoseph Mingrone * PTP general message 447ee67461eSJoseph Mingrone */ 448ee67461eSJoseph Mingrone void 449ee67461eSJoseph Mingrone ptp_print(netdissect_options *ndo, const u_char *bp, u_int length) 450ee67461eSJoseph Mingrone { 451*0a7e5f1fSJoseph Mingrone u_int major_vers; 452*0a7e5f1fSJoseph Mingrone u_int minor_vers; 453ee67461eSJoseph Mingrone 454*0a7e5f1fSJoseph Mingrone /* In 1588-2019, a minorVersionPTP field has been created in the common PTP 455*0a7e5f1fSJoseph Mingrone * message header, from a previously reserved field. Implementations 456*0a7e5f1fSJoseph Mingrone * compatible to the 2019 edition shall indicate a versionPTP field value 457*0a7e5f1fSJoseph Mingrone * of 2 and minorVersionPTP field value of 1, indicating that this is PTP 458*0a7e5f1fSJoseph Mingrone * version 2.1. 459*0a7e5f1fSJoseph Mingrone */ 460ee67461eSJoseph Mingrone ndo->ndo_protocol = "ptp"; 461*0a7e5f1fSJoseph Mingrone ND_ICHECK_U(length, <, PTP_HDR_LEN); 462*0a7e5f1fSJoseph Mingrone major_vers = GET_BE_U_2(bp) & PTP_MAJOR_VERS_MASK; 463*0a7e5f1fSJoseph Mingrone minor_vers = (GET_BE_U_2(bp) & PTP_MINOR_VERS_MASK) >> 4; 464*0a7e5f1fSJoseph Mingrone if (minor_vers) 465*0a7e5f1fSJoseph Mingrone ND_PRINT("PTPv%u.%u", major_vers, minor_vers); 466*0a7e5f1fSJoseph Mingrone else 467*0a7e5f1fSJoseph Mingrone ND_PRINT("PTPv%u", major_vers); 468*0a7e5f1fSJoseph Mingrone 469*0a7e5f1fSJoseph Mingrone switch(major_vers) { 470ee67461eSJoseph Mingrone case PTP_VER_1: 471ee67461eSJoseph Mingrone ptp_print_1(ndo); 472ee67461eSJoseph Mingrone break; 473ee67461eSJoseph Mingrone case PTP_VER_2: 474ee67461eSJoseph Mingrone ptp_print_2(ndo, bp, length); 475ee67461eSJoseph Mingrone break; 476ee67461eSJoseph Mingrone default: 477ee67461eSJoseph Mingrone //ND_PRINT("ERROR: unknown-version\n"); 478ee67461eSJoseph Mingrone break; 479ee67461eSJoseph Mingrone } 480ee67461eSJoseph Mingrone return; 481ee67461eSJoseph Mingrone 482ee67461eSJoseph Mingrone invalid: 483ee67461eSJoseph Mingrone nd_print_invalid(ndo); 484ee67461eSJoseph Mingrone } 485ee67461eSJoseph Mingrone 486ee67461eSJoseph Mingrone static void 487ee67461eSJoseph Mingrone ptp_print_timestamp(netdissect_options *ndo, const u_char *bp, u_int *len, const char *stype) 488ee67461eSJoseph Mingrone { 489ee67461eSJoseph Mingrone uint64_t secs; 490ee67461eSJoseph Mingrone uint32_t nsecs; 491ee67461eSJoseph Mingrone 492ee67461eSJoseph Mingrone ND_PRINT(", %s :", stype); 493ee67461eSJoseph Mingrone /* sec time stamp 6 bytes */ 494ee67461eSJoseph Mingrone secs = GET_BE_U_6(bp); 495ee67461eSJoseph Mingrone ND_PRINT(" %"PRIu64" seconds,", secs); 496ee67461eSJoseph Mingrone *len -= 6; 497ee67461eSJoseph Mingrone bp += 6; 498ee67461eSJoseph Mingrone 499ee67461eSJoseph Mingrone /* NS time stamp 4 bytes */ 500ee67461eSJoseph Mingrone nsecs = GET_BE_U_4(bp); 501ee67461eSJoseph Mingrone ND_PRINT(" %u nanoseconds", nsecs); 502ee67461eSJoseph Mingrone *len -= 4; 503ee67461eSJoseph Mingrone bp += 4; 504ee67461eSJoseph Mingrone } 505ee67461eSJoseph Mingrone static void 506ee67461eSJoseph Mingrone ptp_print_timestamp_identity(netdissect_options *ndo, 507ee67461eSJoseph Mingrone const u_char *bp, u_int *len, const char *ttype) 508ee67461eSJoseph Mingrone { 509ee67461eSJoseph Mingrone uint64_t secs; 510ee67461eSJoseph Mingrone uint32_t nsecs; 511ee67461eSJoseph Mingrone uint16_t port_id; 512ee67461eSJoseph Mingrone uint64_t port_identity; 513ee67461eSJoseph Mingrone 514ee67461eSJoseph Mingrone ND_PRINT(", %s :", ttype); 515ee67461eSJoseph Mingrone /* sec time stamp 6 bytes */ 516ee67461eSJoseph Mingrone secs = GET_BE_U_6(bp); 517ee67461eSJoseph Mingrone ND_PRINT(" %"PRIu64" seconds,", secs); 518ee67461eSJoseph Mingrone *len -= 6; 519ee67461eSJoseph Mingrone bp += 6; 520ee67461eSJoseph Mingrone 521ee67461eSJoseph Mingrone /* NS time stamp 4 bytes */ 522ee67461eSJoseph Mingrone nsecs = GET_BE_U_4(bp); 523ee67461eSJoseph Mingrone ND_PRINT(" %u nanoseconds", nsecs); 524ee67461eSJoseph Mingrone *len -= 4; 525ee67461eSJoseph Mingrone bp += 4; 526ee67461eSJoseph Mingrone 527ee67461eSJoseph Mingrone /* port identity*/ 528ee67461eSJoseph Mingrone port_identity = GET_BE_U_8(bp); 529ee67461eSJoseph Mingrone ND_PRINT(", port identity : 0x%"PRIx64, port_identity); 530ee67461eSJoseph Mingrone *len -= 8; 531ee67461eSJoseph Mingrone bp += 8; 532ee67461eSJoseph Mingrone 533ee67461eSJoseph Mingrone /* port id */ 534ee67461eSJoseph Mingrone port_id = GET_BE_U_2(bp); 535ee67461eSJoseph Mingrone ND_PRINT(", port id : %u", port_id); 536ee67461eSJoseph Mingrone *len -= 2; 537ee67461eSJoseph Mingrone bp += 2; 538ee67461eSJoseph Mingrone } 539ee67461eSJoseph Mingrone static void 540ee67461eSJoseph Mingrone ptp_print_announce_msg(netdissect_options *ndo, const u_char *bp, u_int *len) 541ee67461eSJoseph Mingrone { 542ee67461eSJoseph Mingrone uint8_t rsvd, gm_prio_1, gm_prio_2, gm_clk_cls, gm_clk_acc, time_src; 543ee67461eSJoseph Mingrone uint16_t origin_cur_utc, gm_clk_var, steps_removed; 544ee67461eSJoseph Mingrone uint64_t gm_clock_id; 545ee67461eSJoseph Mingrone uint64_t secs; 546ee67461eSJoseph Mingrone uint32_t nsecs; 547ee67461eSJoseph Mingrone 548ee67461eSJoseph Mingrone ND_PRINT(", %s :", p_origin_ts); 549ee67461eSJoseph Mingrone /* sec time stamp 6 bytes */ 550ee67461eSJoseph Mingrone secs = GET_BE_U_6(bp); 551ee67461eSJoseph Mingrone ND_PRINT(" %"PRIu64" seconds", secs); 552ee67461eSJoseph Mingrone *len -= 6; 553ee67461eSJoseph Mingrone bp += 6; 554ee67461eSJoseph Mingrone 555ee67461eSJoseph Mingrone /* NS time stamp 4 bytes */ 556ee67461eSJoseph Mingrone nsecs = GET_BE_U_4(bp); 557ee67461eSJoseph Mingrone ND_PRINT(" %u nanoseconds", nsecs); 558ee67461eSJoseph Mingrone *len -= 4; 559ee67461eSJoseph Mingrone bp += 4; 560ee67461eSJoseph Mingrone 561ee67461eSJoseph Mingrone /* origin cur utc */ 562ee67461eSJoseph Mingrone origin_cur_utc = GET_BE_U_2(bp); 563ee67461eSJoseph Mingrone ND_PRINT(", origin cur utc :%u", origin_cur_utc); 564ee67461eSJoseph Mingrone *len -= 2; 565ee67461eSJoseph Mingrone bp += 2; 566ee67461eSJoseph Mingrone 567ee67461eSJoseph Mingrone /* rsvd */ 568ee67461eSJoseph Mingrone rsvd = GET_U_1(bp); 569ee67461eSJoseph Mingrone ND_PRINT(", rsvd : %u", rsvd); 570ee67461eSJoseph Mingrone *len -= 1; 571ee67461eSJoseph Mingrone bp += 1; 572ee67461eSJoseph Mingrone 573ee67461eSJoseph Mingrone /* gm prio */ 574ee67461eSJoseph Mingrone gm_prio_1 = GET_U_1(bp); 575ee67461eSJoseph Mingrone ND_PRINT(", gm priority_1 : %u", gm_prio_1); 576ee67461eSJoseph Mingrone *len -= 1; 577ee67461eSJoseph Mingrone bp += 1; 578ee67461eSJoseph Mingrone 579ee67461eSJoseph Mingrone /* GM clock class */ 580ee67461eSJoseph Mingrone gm_clk_cls = GET_U_1(bp); 581ee67461eSJoseph Mingrone ND_PRINT(", gm clock class : %u", gm_clk_cls); 582ee67461eSJoseph Mingrone *len -= 1; 583ee67461eSJoseph Mingrone bp += 1; 584ee67461eSJoseph Mingrone /* GM clock accuracy */ 585ee67461eSJoseph Mingrone gm_clk_acc = GET_U_1(bp); 586ee67461eSJoseph Mingrone ND_PRINT(", gm clock accuracy : %u", gm_clk_acc); 587ee67461eSJoseph Mingrone *len -= 1; 588ee67461eSJoseph Mingrone bp += 1; 589ee67461eSJoseph Mingrone /* GM clock variance */ 590ee67461eSJoseph Mingrone gm_clk_var = GET_BE_U_2(bp); 591ee67461eSJoseph Mingrone ND_PRINT(", gm clock variance : %u", gm_clk_var); 592ee67461eSJoseph Mingrone *len -= 2; 593ee67461eSJoseph Mingrone bp += 2; 594ee67461eSJoseph Mingrone /* GM Prio 2 */ 595ee67461eSJoseph Mingrone gm_prio_2 = GET_U_1(bp); 596ee67461eSJoseph Mingrone ND_PRINT(", gm priority_2 : %u", gm_prio_2); 597ee67461eSJoseph Mingrone *len -= 1; 598ee67461eSJoseph Mingrone bp += 1; 599ee67461eSJoseph Mingrone 600ee67461eSJoseph Mingrone /* GM Clock Identity */ 601ee67461eSJoseph Mingrone gm_clock_id = GET_BE_U_8(bp); 602ee67461eSJoseph Mingrone ND_PRINT(", gm clock id : 0x%"PRIx64, gm_clock_id); 603ee67461eSJoseph Mingrone *len -= 8; 604ee67461eSJoseph Mingrone bp += 8; 605ee67461eSJoseph Mingrone /* steps removed */ 606ee67461eSJoseph Mingrone steps_removed = GET_BE_U_2(bp); 607ee67461eSJoseph Mingrone ND_PRINT(", steps removed : %u", steps_removed); 608ee67461eSJoseph Mingrone *len -= 2; 609ee67461eSJoseph Mingrone bp += 2; 610ee67461eSJoseph Mingrone /* Time source */ 611ee67461eSJoseph Mingrone time_src = GET_U_1(bp); 612ee67461eSJoseph Mingrone ND_PRINT(", time source : 0x%x", time_src); 613ee67461eSJoseph Mingrone *len -= 1; 614ee67461eSJoseph Mingrone bp += 1; 615ee67461eSJoseph Mingrone 616ee67461eSJoseph Mingrone } 617ee67461eSJoseph Mingrone static void 618ee67461eSJoseph Mingrone ptp_print_port_id(netdissect_options *ndo, const u_char *bp, u_int *len) 619ee67461eSJoseph Mingrone { 620ee67461eSJoseph Mingrone uint16_t port_id; 621ee67461eSJoseph Mingrone uint64_t port_identity; 622ee67461eSJoseph Mingrone 623ee67461eSJoseph Mingrone /* port identity*/ 624ee67461eSJoseph Mingrone port_identity = GET_BE_U_8(bp); 625ee67461eSJoseph Mingrone ND_PRINT(", port identity : 0x%"PRIx64, port_identity); 626ee67461eSJoseph Mingrone *len -= 8; 627ee67461eSJoseph Mingrone bp += 8; 628ee67461eSJoseph Mingrone 629ee67461eSJoseph Mingrone /* port id */ 630ee67461eSJoseph Mingrone port_id = GET_BE_U_2(bp); 631ee67461eSJoseph Mingrone ND_PRINT(", port id : %u", port_id); 632ee67461eSJoseph Mingrone *len -= 2; 633ee67461eSJoseph Mingrone bp += 2; 634ee67461eSJoseph Mingrone 635ee67461eSJoseph Mingrone } 636ee67461eSJoseph Mingrone 637ee67461eSJoseph Mingrone static void 638ee67461eSJoseph Mingrone ptp_print_mgmt_msg(netdissect_options *ndo, const u_char *bp, u_int *len) 639ee67461eSJoseph Mingrone { 640ee67461eSJoseph Mingrone ptp_print_port_id(ndo, bp, len); 641ee67461eSJoseph Mingrone print_field(ndo, ", start boundary hops ", PTP_UCHAR_LEN, bp, len, PTP_FALSE); 642ee67461eSJoseph Mingrone print_field(ndo, ", boundary hops ", PTP_UCHAR_LEN, bp, len, PTP_FALSE); 643ee67461eSJoseph Mingrone print_field(ndo, ", flags ", PTP_UCHAR_LEN, bp, len, PTP_TRUE); 644ee67461eSJoseph Mingrone print_field(ndo, ", reserved ", PTP_UCHAR_LEN, bp, len, PTP_TRUE); 645ee67461eSJoseph Mingrone } 646