ok benno@

Claudio Jeker(cje...@diehard.n-r-g.com) on 2018.07.16 22:33:17 +0200:
> 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.
> 

Reply via email to