For "dump (all|updates) (in|out)" it totally makes sense to use the
extended timestamp format that includes microseconds as well. This
way it is better visible when updates got processed.
Table dumps are not affected since there the timestamp is not that
useful.
bgpdump shows now the time with microseconds:
TIME: 07/16/18 20:26:15.384935
TYPE: BGP4MP_ET/MESSAGE/Keepalive
FROM: 10.82.41.92 AS196618
TO: 62.48.0.253 AS8271
TIME: 07/16/18 20:26:15.384949
TYPE: BGP4MP_ET/STATE_CHANGE
PEER: 10.82.41.92 AS196618
STATE: Opensent/Openconfirm
TIME: 07/16/18 20:26:15.386018
TYPE: BGP4MP_ET/STATE_CHANGE
PEER: 10.82.41.92 AS196618
STATE: Openconfirm/Established
TIME: 07/16/18 20:26:15.386217
TYPE: BGP4MP_ET/MESSAGE/Update
FROM: 10.82.41.92 AS196618
TO: 62.48.0.253 AS8271
... and bgpctl will do the same soon :)
--
:wq Claudio
Index: mrt.c
===================================================================
RCS file: /cvs/src/usr.sbin/bgpd/mrt.c,v
retrieving revision 1.84
diff -u -p -r1.84 mrt.c
--- mrt.c 5 Feb 2018 03:55:54 -0000 1.84
+++ mrt.c 16 Jul 2018 20:25:45 -0000
@@ -105,7 +105,7 @@ mrt_dump_bgp_msg(struct mrt *mrt, void *
if (mrt->type == MRT_ALL_IN || mrt->type == MRT_UPDATE_IN)
incoming = 1;
- if (mrt_dump_hdr_se(&buf, peer, MSG_PROTOCOL_BGP4MP, subtype,
+ if (mrt_dump_hdr_se(&buf, peer, MSG_PROTOCOL_BGP4MP_ET, subtype,
pkglen, incoming) == -1)
return;
@@ -128,7 +128,7 @@ mrt_dump_state(struct mrt *mrt, u_int16_
if (peer->capa.neg.as4byte)
subtype = BGP4MP_STATE_CHANGE_AS4;
- if (mrt_dump_hdr_se(&buf, peer, MSG_PROTOCOL_BGP4MP, subtype,
+ if (mrt_dump_hdr_se(&buf, peer, MSG_PROTOCOL_BGP4MP_ET, subtype,
2 * sizeof(short), 0) == -1)
return;
@@ -684,17 +684,17 @@ int
mrt_dump_hdr_se(struct ibuf ** bp, struct peer *peer, u_int16_t type,
u_int16_t subtype, u_int32_t len, int swap)
{
- time_t now;
+ struct timespec time;
- if ((*bp = ibuf_dynamic(MRT_HEADER_SIZE, MRT_HEADER_SIZE +
+ if ((*bp = ibuf_dynamic(MRT_ET_HEADER_SIZE, MRT_ET_HEADER_SIZE +
MRT_BGP4MP_AS4_IPv6_HEADER_SIZE + len)) == NULL) {
log_warn("mrt_dump_hdr_se: ibuf_dynamic error");
return (-1);
}
- now = time(NULL);
+ clock_gettime(CLOCK_REALTIME, &time);
- DUMP_LONG(*bp, now);
+ DUMP_LONG(*bp, time.tv_sec);
DUMP_SHORT(*bp, type);
DUMP_SHORT(*bp, subtype);
@@ -702,16 +702,16 @@ mrt_dump_hdr_se(struct ibuf ** bp, struc
case AF_INET:
if (subtype == BGP4MP_STATE_CHANGE_AS4 ||
subtype == BGP4MP_MESSAGE_AS4)
- len += MRT_BGP4MP_AS4_IPv4_HEADER_SIZE;
+ len += MRT_BGP4MP_ET_AS4_IPv4_HEADER_SIZE;
else
- len += MRT_BGP4MP_IPv4_HEADER_SIZE;
+ len += MRT_BGP4MP_ET_IPv4_HEADER_SIZE;
break;
case AF_INET6:
if (subtype == BGP4MP_STATE_CHANGE_AS4 ||
subtype == BGP4MP_MESSAGE_AS4)
- len += MRT_BGP4MP_AS4_IPv6_HEADER_SIZE;
+ len += MRT_BGP4MP_ET_AS4_IPv6_HEADER_SIZE;
else
- len += MRT_BGP4MP_IPv6_HEADER_SIZE;
+ len += MRT_BGP4MP_ET_IPv6_HEADER_SIZE;
break;
case 0:
goto fail;
@@ -721,6 +721,8 @@ mrt_dump_hdr_se(struct ibuf ** bp, struc
}
DUMP_LONG(*bp, len);
+ /* milisecond field use by the _ET format */
+ DUMP_LONG(*bp, time.tv_nsec / 1000);
if (subtype == BGP4MP_STATE_CHANGE_AS4 ||
subtype == BGP4MP_MESSAGE_AS4) {
Index: mrt.h
===================================================================
RCS file: /cvs/src/usr.sbin/bgpd/mrt.h,v
retrieving revision 1.31
diff -u -p -r1.31 mrt.h
--- mrt.h 19 Sep 2011 11:19:32 -0000 1.31
+++ mrt.h 13 Jul 2018 13:54:07 -0000
@@ -39,6 +39,7 @@
* length field. Which is accounted in the length field.
*/
#define MRT_HEADER_SIZE 12
+#define MRT_ET_HEADER_SIZE 16
struct mrt_hdr {
u_int32_t timestamp;
@@ -87,11 +88,15 @@ enum MRT_BGP4MP_SUBTYPES {
};
/* size of the BGP4MP headers without payload */
-#define MRT_BGP4MP_IPv4_HEADER_SIZE 16
-#define MRT_BGP4MP_IPv6_HEADER_SIZE 40
+#define MRT_BGP4MP_IPv4_HEADER_SIZE 16
+#define MRT_BGP4MP_IPv6_HEADER_SIZE 40
+#define MRT_BGP4MP_ET_IPv4_HEADER_SIZE 20
+#define MRT_BGP4MP_ET_IPv6_HEADER_SIZE 44
/* 4-byte AS variants of the previous */
-#define MRT_BGP4MP_AS4_IPv4_HEADER_SIZE 20
-#define MRT_BGP4MP_AS4_IPv6_HEADER_SIZE 44
+#define MRT_BGP4MP_AS4_IPv4_HEADER_SIZE 20
+#define MRT_BGP4MP_AS4_IPv6_HEADER_SIZE 44
+#define MRT_BGP4MP_ET_AS4_IPv4_HEADER_SIZE 24
+#define MRT_BGP4MP_ET_AS4_IPv6_HEADER_SIZE 48
/* If the type is PROTOCOL_BGP4MP and the subtype is either BGP4MP_STATE_CHANGE
* or BGP4MP_MESSAGE the message consists of a common header plus the payload.